• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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();
 
Сверху Снизу