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.
@Andrei Opris, 👍-1
Обсуждение1 ответ
Я бы предложил использовать 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 веб-сайт. Но код, как вы можете видеть, безумно прост.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- Почему dtostrf() не работает для этого значения?
- Отправка данных из ESP8266 в PHP
- Могут ли ESP8266 и HC-SR04 дружить?
- Как определить наличие воды с помощью всего двух проводов
- Wifi Регистратор данных без Задержки
- Библиотека емкостных датчиков на D1 Mini
- NODEMCU 1.0 HX711 Тензодатчик читает странный текст
https://thinger.io, @Majenko
Я не знаю, можете ли вы понять код моего проекта, но есть веб-сервер с файлами html и js, которые вы можете изменить для вашего использования, и проект построен из нескольких файлов ino для разных датчиков и исполнительных устройств с настройкой и циклом в каждом файле ino https://github.com/jandrassy/Regulator/tree/master/Regulator, @Juraj
я посмотрю и эту ссылку. моя главная проблема заключается в том, что мои навыки кодирования являются базовыми, и мне трудно создавать/понимать более сложные структуры. мне нужно сделать это приложение, которое я разместил здесь, чтобы интегрировать его в дипломный проект бакалавра, и у меня осталось всего несколько дней :(, @Andrei Opris