• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Метеостанция на Arduino UNO WiFi R3 от RobotDyn

ArchangelNephilim

New member
Сделал метеостанцию работающую на плате Arduino UNO WiFi R3 от RobotDyn с датчиками DS18B20, DHT 21, DHT22 и BMP180... Все данные с датчиков отлично выводяться на LCD дисплей 20x4.

Хочу реализовать
1. Часы с выводом на дисплей.
2. Вывод информации с датчиков на сайт народный мониторинг и доступ на андроид телефоне.

С первым пунктом не могу определиться как реализовать. Со вторым попробовал сам сделать, написал скетч для esp8266 что бы подключался к wifi сети и передавал температуру с ds18b20. Загрузил его. Перезагружаю плату, а esp8266 толи зависает, толи в бесконечный цикл попадает. Кароче говоря неопределенка, если нужно скетч скину. Одним словом нужна помощь в реализации, поэтому прошу помощи у знающих людей.

#include <Wire.h>
#include "Adafruit_LiquidCrystal.h"
#include <BMP085.h>
#include "stDHT.h"
#include <OneWire.h> //подключаем библиотеку
DHT sens(DHT22); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
// Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22
BMP085 dps = BMP085();
OneWire ds(8); // Номер ноги к которой подключили датчик

long int Temperature = 0, Pressure = 0;

// initialize the library with the numbers of the interface pins
Adafruit_LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
Serial.begin(9600);
pinMode(6, INPUT);
digitalWrite(2, HIGH);
pinMode(7, INPUT);
digitalWrite(3, HIGH);
Wire.begin();
delay(1000);
dps.init();

// set up the LCD's number of rows and columns:
lcd.begin(20, 4);
}

void loop()
{

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;



if ( !ds.search(addr)) {

ds.reset_search();
delay(250);
return;
}


for( i = 0; i < 8; i++) {
Serial.write(' ');
}

if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}

// Первый байт ROM указывает, какой чип
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);

for ( i = 0; i < 9; i++) {
data = ds.read();
}


// Преобразование данных в фактическую температуру

int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;

}
celsius = (long int)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;


dps.getPressure(&Pressure);
dps.getTemperature(&Temperature);

// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);

Serial.print("Давление: ");
Serial.print(Pressure/133.3); //Выводим давление в мм.рт ст
Serial.print(" мм.рт ст\t");
Serial.print("Температура:");
Serial.print(Temperature*0.1); // Температуру в градусах Цельсия
Serial.print(" *C\t");

lcd.print("DABLENIE ");
lcd.print(Pressure/133.3); //Выводим давление в мм.рт ст
lcd.setCursor(0, 1);


Serial.print(" Температура на улице = ");
Serial.print(celsius);
Serial.print(" *C ");

lcd.print("TIn ");
lcd.print(Temperature*0.1);
lcd.setCursor(10, 1);
lcd.print("TOut ");
lcd.print(celsius);
lcd.setCursor(0, 2);


int t = sens.readTemperature(6); // чтение датчика на пине 2
int h = sens.readHumidity(6); // чтение датчика на пине 2
delay(2000);

int t2 = sens.readTemperature(7); // чтение датчика на пине 3
int h2 = sens.readHumidity(7); // чтение датчика на пине 3

Serial.print("Влажность на улице: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Температура на улице: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print("Влажность в квартире: ");
Serial.print(h2);
Serial.print(" % ");
Serial.print("Температура в квартире: ");
Serial.print(t2);
Serial.println(" *C ");

lcd.print("HumIn ");
lcd.print(h2); //Выводим давление в мм.рт ст
lcd.setCursor(10, 2);
lcd.print("HumOut ");
lcd.print(h); //Выводим давление в мм.рт ст
delay(5000);
}
 

ArchangelNephilim

New member
Проблема в чем, идей нет?
DS3231 или NTP.
Проблема в реализации и выводе на LCD дисплей. Скорее всего что через NTP, лишних модулей в принципе не нужно, если есть wifi.
Как правильно выводить и какая очередность... если ардуинкой я вывожу инфо с датчиков погоды, а с esp8266 часы.

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
WiFiUDP ntpUDP;
///////////////// https://www.ntppool.org/zone/@ - другие сервера /////////////////////////////
///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC
const char *ssid = "Имя_Wi-Fi_сети";
const char *password = "Пароль";
String date_time;
unsigned long times;

void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
timeClient.begin();}
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
}

void loop(){
if(millis()-times>=1000){times=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
int hh = timeClient.getHours();
int mm = timeClient.getMinutes();
int ss = timeClient.getSeconds();
date_time = timeClient.getFormattedDate();
int index_date = date_time.indexOf("T");
String date = date_time.substring(0, index_date);

lcd.setCursor(4,0);
lcd.print(hh/10);lcd.print(hh%10);lcd.print(":");
lcd.print(mm/10);lcd.print(mm%10);lcd.print(":");
lcd.print(ss/10);lcd.print(ss%10);
lcd.setCursor(3,1);
lcd.print(date);
}}
 

CodeNameHawk

Moderator
Команда форума
Не нужна синхронизация каждую секунду, делайте раз в сутки, ну если очень надо раз в час.
Сделал метеостанцию работающую на плате Arduino UNO WiFi R3 от RobotDyn с датчиками DS18B20, DHT 21, DHT22 и BMP180... Все данные с датчиков отлично выводяться на LCD дисплей 20x4.
Все это можно сделать на есп, без платы Arduino UNO.
 

ArchangelNephilim

New member
Не нужна синхронизация каждую секунду, делайте раз в сутки, ну если очень надо раз в час.

Все это можно сделать на есп, без платы Arduino UNO.
знаю что можно проще и без ардуинки, но у меня то есть не просто esp, а комбайн)
 

ArchangelNephilim

New member
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include "Adafruit_LiquidCrystal.h"
Adafruit_LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Устанавливаем дисплей
WiFiUDP ntpUDP;
///////////////// https://www.ntppool.org/zone/@ - другие сервера /////////////////////////////
///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC
const char *ssid = "Имя_Wi-Fi_сети";
const char *password = "Пароль";
String date_time;
unsigned long times;

void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
timeClient.begin();}
lcd.begin(20, 4);
}

void loop(){
if(millis()-times>=86400000){times=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
int hh = timeClient.getHours();
int mm = timeClient.getMinutes();
int ss = timeClient.getSeconds();
date_time = timeClient.getFormattedDate();
int index_date = date_time.indexOf("T");
String date = date_time.substring(0, index_date);

lcd.setCursor(4,0);
lcd.print(hh/10);lcd.print(hh%10);lcd.print(":");
lcd.print(mm/10);lcd.print(mm%10);lcd.print(":");
lcd.print(ss/10);lcd.print(ss%10);
lcd.setCursor(3,1);
lcd.print(date);
}}

работает, но не совсем...

D:..............ntp\ntp.ino: In function 'void loop()':
ntp:32:24: error: 'class NTPClient' has no member named 'getFormattedDate'
 

ArchangelNephilim

New member
update
поковырял/удалил и скачал заново с гетлиба библиотеку и все скомпилилось без ошибок.

все равно как-то не нравиться мне такое большое число.
 

CodeNameHawk

Moderator
Команда форума
все равно как-то не нравиться мне такое большое число.
"Всем нравиться, а ему не нравиться".
Чем не нравиться?
ps. Вам не надо подсказывать, что неплохо бы в setup один раз получить время с ntp?
 
Последнее редактирование:

ArchangelNephilim

New member
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include "Adafruit_LiquidCrystal.h"
Adafruit_LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Устанавливаем дисплей
WiFiUDP ntpUDP;
///////////////// https://www.ntppool.org/zone/@ - другие сервера /////////////////////////////
///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC
const char *ssid = "Имя_Wi-Fi_сети";
const char *password = "Пароль";
String date_time;
unsigned long times;

void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
timeClient.begin();}
lcd.begin(20, 4);
}

void loop(){
if(millis()-times>=86400000){times=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
int hh = timeClient.getHours();
int mm = timeClient.getMinutes();
int ss = timeClient.getSeconds();
date_time = timeClient.getFormattedDate();
int index_date = date_time.indexOf("T");
String date = date_time.substring(0, index_date);

lcd.setCursor(4,0);
lcd.print(hh/10);lcd.print(hh%10);lcd.print(":");
lcd.print(mm/10);lcd.print(mm%10);lcd.print(":");
lcd.print(ss/10);lcd.print(ss%10);
lcd.setCursor(3,1);
lcd.print(date);
}}

работает, но не совсем...

D:..............ntp\ntp.ino: In function 'void loop()':
ntp:32:24: error: 'class NTPClient' has no member named 'getFormattedDate'
Хочу сделать передачу через UART масива в который поместить время, думаю так будет проще передавать и принимать, ну и выводить на дисплей.

Код:
int time[2];
time[0] = timeClient.getHours();
time[1] = timeClient.getMinutes();
time[2] = timeClient.getSeconds();
 
Сверху Снизу