3 датчика и wemos d1 r1 и web

Мне нужно создать приложение, которое будет отображать на браузере данные от 3 датчиков. Мои 3 датчика: Влажность и температура (DHT22), датчик вибрации и датчик расстояния (HC-SR04).

Я хочу подключить эти 3 датчика к моему WeMos D1 R1 и отправить данные для отображения на веб-странице. До сих пор я могу локально (с последовательного монитора Arduino IDE) считывать датчики по одному - я имею в виду, я загружаю код для каждого из них... Я не знаю, как объединить 3 кода для работы.

Итак, мой главный вопрос заключается в том, как объединить эти 3 кода в один и получить доступ к данным с веб-страницы?

Мои коды : вибрация (я хочу избавиться от светодиода, просто чтобы отобразить значение вибрации)

int LED_Pin = D13;
int vibr_Pin = D2;

void setup(){
  pinMode(LED_Pin, OUTPUT);
  pinMode(vibr_Pin, INPUT); //set vibr_Pin input for measurement
  Serial.begin(9600); //init serial 9600
}

void loop(){
  long measurement =TP_init();
  delay(50);
  Serial.println(measurement);
  if (measurement > 4000){
    digitalWrite(LED_Pin, HIGH);
  } else {
    digitalWrite(LED_Pin, LOW); 
  }
}

long TP_init(){
  delay(10);
  long measurement=pulseIn (vibr_Pin, HIGH);  //дождитесь, пока pin достигнет МАКСИМУМА и вернет измерение
  return measurement;
}

Код DHT22:

#include <SimpleDHT.h>

// for DHT22, 
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2
int pinDHT22 = D8;
SimpleDHT22 dht22;

void setup() {
  Serial.begin(115200);
}

void loop() {
  // начинаем работать...
  Serial.println("=================================");
  Serial.println("Sample DHT22...");

  // читать без образцов.
  // @remark Мы используем read2 для получения плавающих данных, таких как 10.1*C
  // если пользователь не заботится о точных данных, используйте read для получения байтовых данных, таких как 10*C.
  float temperature = 0;
  float humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(2000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print((float)temperature); Serial.print(" *C, ");
  Serial.print((float)humidity); Serial.println(" RH%");

  // Частота дискретизации DHT22 составляет 0,5 Гц.
  delay(2500);
}

КОД HC-SR04 :

// определяет номера контактов
const int trigPin = D5;
const int echoPin = D6;
// определяет переменные
long duration;
int distance_cm;
int distance_in;
void setup() {
  pinMode(trigPin, OUTPUT); // Устанавливает trigPin в качестве выходного
  pinMode(echoPin, INPUT); // Устанавливает echoPin в качестве входного сигнала
  Serial.begin(9600); // Запускает последовательную связь
}

void loop() {
  // Очищает trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(500);
  // Устанавливает тригПин в состояние HIGH в течение 10 микросекунд
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(500);
  digitalWrite(trigPin, LOW);
  /* Считывает эхопин, возвращает
время прохождения звуковой волны в микросекундах */
  duration = pulseIn(echoPin, HIGH);
  // Расчет расстояния
  distance_cm = duration / 58;
  distance_in = duration / 148;
  Serial.print("Distance: ");
  Serial.print(distance_cm);
  Serial.println(" centimeters");
}

Мне удалось объединить 3 кода в 1. Мне все еще нужно адаптировать его для отправки информации на веб-страницу. До сих пор код для 3 датчиков:

#include <SimpleDHT.h>

// for DHT22, 
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2
const int trigPin = D5;
const int echoPin = D6;
long duration;
int distance_cm;
int distance_in;
int vibr_Pin = D8;
int pinDHT22 = D2;
SimpleDHT22 dht22;

void setup() {
  Serial.begin(9600);
  pinMode(vibr_Pin, INPUT);
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}

void loop() {
  // start working...
  Serial.println("=================================");
  Serial.println("TEMPERATURE & HUMIDITY");

  // read without samples.
  // @remark We use read2 to get a float data, such as 10.1*C
  //    if user doesn't care about the accurate data, use read to get a byte data, such as 10*C.
  float temperature = 0;
  float humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err=");
    Serial.println(err);delay(2000);
    return;
  }

  Serial.print("Temperature & Humidity: ");
  Serial.print((float)temperature); Serial.print(" *C, ");
  Serial.print((float)humidity); Serial.println(" RH%");

  // DHT22 sampling rate is 0.5HZ.
  delay(2500);
  Serial.println("=================================");
  Serial.println("VIBRATION");
  long measurement =TP_init();
  delay(50);
  Serial.print("measurement = ");
  Serial.println(measurement);
  Serial.println("=================================");
  Serial.println("DISTANCE");
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(500);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(500);
  digitalWrite(trigPin, LOW);
  /* Reads the echoPin, returns the sound wave 
     travel time in microseconds */
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance_cm = duration / 58;
  distance_in = duration / 148;
  Serial.print("Distance: ");
  Serial.print(distance_cm);
  Serial.println(" centimeters");
}

long TP_init(){
  delay(10);
  long measurement=pulseIn (vibr_Pin, HIGH);  //wait for the pin to get HIGH and returns measurement
  return measurement;
}

Итак, в последовательном мониторе Arduino IDE мы увидим значения, отображаемые для наших 3 датчиков. Я был бы очень признателен, если бы кто-нибудь помог мне интегрировать этот код в платформу IoT.

, 👍-1

Обсуждение

https://thinger.io, @Majenko

Я не знаю, можете ли вы понять код моего проекта, но есть веб-сервер с файлами html и js, которые вы можете изменить для вашего использования, и проект построен из нескольких файлов ino для разных датчиков и исполнительных устройств с настройкой и циклом в каждом файле ino https://github.com/jandrassy/Regulator/tree/master/Regulator, @Juraj

я посмотрю и эту ссылку. моя главная проблема заключается в том, что мои навыки кодирования являются базовыми, и мне трудно создавать/понимать более сложные структуры. мне нужно сделать это приложение, которое я разместил здесь, чтобы интегрировать его в дипломный проект бакалавра, и у меня осталось всего несколько дней :(, @Andrei Opris


1 ответ


0

Я бы предложил использовать thinger.io. В нем есть библиотека, которая безумно проста в использовании.

Это код для монитора теплицы, который я написал, используя их библиотеку. Он отображает температуру и влажность от DHT22, время работы устройства и время, когда оно было запрограммировано в последний раз. И все это при поддержке OTA.

#include <ESP8266WiFi.h>
#include <dht.h>
#include <ThingerESP8266.h>
#include <ArduinoOTA.h>
#include <Average.h>

dht dht22;

Average<float> temperature(10);
Average<float> humidity(10);

ThingerESP8266 thing("myaccount", "thisunit", "somekey");

void getSample() {
    static uint32_t ts = 0;
    if (millis() - ts < 10000) {
        return;
    }
    ts = millis();

    dht22.read22(D6);
    int samples = 0;
    while (
        (dht22.temperature < -100) ||
        (dht22.temperature > 200) ||
        (dht22.humidity < -100) ||
        (dht22.humidity > 200))
    {
        delay(10);
        dht22.read22(D6);
        samples++;
        if (samples > 10) {
            return;
        }
    }
    temperature.push(dht22.temperature);
    humidity.push(dht22.humidity);
}

void setup() {
    WiFi.hostname("Greenhouse");
    thing.add_wifi("MyWiFiSSID", "MyWiFiPSK");

    thing["temperature"] >> [](pson& out) {
        getSample();
        out = temperature.mean();
    };
    thing["humidity"] >> [](pson& out) {
        getSample();
        out = humidity.mean();
    };
    thing["uptime"] >> [](pson& out) {
        out = millis() / 1000.0;
    };
    thing["compiled"] >> [](pson& out) {
        out = __DATE__ " " __TIME__;
    };

    ArduinoOTA.setHostname("Greenhouse");
    ArduinoOTA.setPassword("MyOTAPassword");
    ArduinoOTA.begin();
}

void loop() {
    thing.handle();
    ArduinoOTA.handle();
}

Это немного сложнее, что вам может понадобиться, так как я выполняю усреднение и фильтрацию выборочных данных, чтобы немного их очистить. Вся магия того, когда брать пробы и как обращаться с данными, делается на thinger.io веб-сайт. Но код, как вы можете видеть, безумно прост.

,