На основе недорогих модулей можно собрать простую домашнюю метеостанцию, в качестве индикатора будет использовать модуль Nokia 5110 LCD.
Метеостанция имеет несколько датчиков (модулей):
- BMP180 — датчик давления (мм.рт.ст) и температуры (измерение температуры в помещении)
- 18B20 — цифровой датчик температуры (измерение температуры на улице)
- DS3231 — часы реального времени
- DHT11 — датчик влажности
BMP180 |
DHT11 | DS3231 | 18B20 |
Подключение модулей к Arduino Nano или Uno:
- Nokia 5110 LCD — RST,CE,DC,DIN,CLK (цифровые выходы Arduino 3,4,5,6,7). На вход VCC необходимо подавать питание 3,3 В, а на выход BL (подсветка) можно подавать питание 5 В через сопротивление 330 Ом или 3,3 В через сопротивление 200 Ом.
- BMP-180 — напряжение питания (VIN) датчика 3,3 В, выходы SCL и SDA подключаются на цифровые выходы A5 (SCL) и A4 (SDA) платы Arduino.
- 18B20 — на датчике имеется маркировка выводов: + — out, на вывод + подается питание 5 В, на — GND и out соответственно выход, который подключается к аналоговому входу Arduino A0.
- DHT11 — напряжение питания датчика 5 В (VCC), выход DATA подключается к цифровому выходу 2 Arduino.
- DS3231 — напряжение питания датчика 5 В (VCC),выходы SCL и SDA подключаются на цифровые выходы A5 (SCL) и A4 (SDA) платы Arduino.
Для успешной загрузки скетча Вам понадобятся следующие библиотеки:
- DHT
- DallasTemperature
- OneWire
- DS3231
- pcd8544 — в библиотеке изменена нумерация подключения выводов, поэтому необходимо использовать именно эту библиотеку.
- bmp085
<div id=»marketWidget»></div>
После сборки уст-во практически не нуждается в настройке, единственное что придется сделать, это установить контрастность индикатора:
lcd.setContrast(60); // контрастность 0-127
#include <Wire.h> #include <SPI.h> #include <DHT.h> #include <BMP085.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip #include <PCD8544.h> PCD8544 lcd; // RST,CE,DC,DIN,CLK VCC,BL,GND (3,4,5,6,7 +3.3V,200 OM +3.3V, GND) DHT dht(2, DHT11); // выход DATA подключен к цыфровому входу 2 DS3231 clock;RTCDateTime DateTime; OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); BMP085 dps = BMP085(); static const byte gradus[] = { B00000110,B00001001,B00001001,B00000110,B00000000 };// градус long Temperature,Pressure; int i;float t1,t2,p,h; char * mes[12]{"Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec"}; char * den[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; void setup(void) { Serial.begin(9600);Wire.begin(); dht.begin(); temp.begin(); temp.setResolution(10);//10 бит clock.begin(); dps.init(); lcd.begin(84, 48); lcd.createChar(0, gradus); lcd.setContrast(60);// контрастность 0-127 // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча } void loop(void) { DateTime=clock.getDateTime(); // Считываем c часов текущие значения даты и времени в сущность DateTime dps.getPressure(&Pressure); dps.getTemperature(&Temperature); temp.requestTemperatures(); lcd.setCursor(0,0); lcd.print(clock.dateFormat("H:i:s",DateTime));// выводим часы, минуты lcd.print(" ");for(i=0;i<7;i++){if(DateTime.dayOfWeek==i){lcd.print(den[i-1]);}}lcd.print(" ");// день недели lcd.setCursor(5,1); lcd.print(DateTime.day);lcd.print(" "); // дата for(i=0;i<12;i++){if(DateTime.month==i){lcd.print(mes[i-1]);}}lcd.print(" "); // месяц lcd.print(DateTime.year);lcd.print(" "); // год if((DateTime.second/10)%2==0){ // каждые 2 секунды опрос температуры, давления и влажности t1=Temperature*0.1; t2=temp.getTempCByIndex(0); p=Pressure/133.3;} lcd.setCursor(0,2); lcd.print("Temp 1:");if(t1>=0){lcd.print(" ");}if(t1>0&&t1<10||t1<0&&t1>-10){lcd.print(" ");}lcd.print(t1,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,3); lcd.print("Temp 2:");if(t2>=0){lcd.print(" ");}if(t2>0&&t2<10||t2<0&&t2>-10){lcd.print(" ");}lcd.print(t2,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,4); lcd.print("P ");lcd.print(p,1); // давление lcd.print(" H "); lcd.print(dht.readHumidity(),0);lcd.print(" %");// влажность lcd.setCursor(0,5); lcd.print(" RCL-RADIO.RU "); }
Воспринимать сокращенные английские названия дней недели и месяцев не очень удобно, поэтому коды редко используемых символов можно заменить на коды русских букв.
Коды английский букв и символы находятся в файле charset.cpp, который находится в папке библиотеки.
Скачайте и распакуйте архив charset.cpp.zip который содержит charset.cpp, и поместите его в папку библиотеки pcd8544.
Далее залейте в плату Arduino следующий скетч:
#include <Wire.h> #include <SPI.h> #include <DHT.h> #include <BMP085.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip #include <PCD8544.h> PCD8544 lcd; // RST,CE,DC,DIN,CLK VCC,BL,GND (3,4,5,6,7 +3.3V,200 OM +3.3V, GND) DHT dht(2, DHT11); // выход DATA подключен к цыфровому входу 2 DS3231 clock;RTCDateTime DateTime; OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); BMP085 dps = BMP085(); static const byte gradus[] = { B00000110,B00001001,B00001001,B00000110,B00000000 };// градус long Temperature,Pressure; int i;float t1,t2,p,h; char * mes[12]{"/)&",",e&","Map$","A;p","Ma]","^_)`","^_{`","A&}","Ce)","Ok$","Ho*","#ek"}; char * den[7]{"!o)","B$p","Cp(","'$&","!*$","C@[","Bck"}; void setup(void) { Serial.begin(9600);Wire.begin(); dht.begin(); temp.begin(); temp.setResolution(10);//10 бит clock.begin(); dps.init(); lcd.begin(84, 48); lcd.createChar(0, gradus); lcd.setContrast(60);// контрастность 0-127 // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча } void loop(void) { DateTime=clock.getDateTime(); // Считываем c часов текущие значения даты и времени в сущность DateTime dps.getPressure(&Pressure); dps.getTemperature(&Temperature); temp.requestTemperatures(); lcd.setCursor(0,0); lcd.print(clock.dateFormat("H:i:s",DateTime));// выводим часы, минуты lcd.print(" ");for(i=0;i<7;i++){if(DateTime.dayOfWeek==i){lcd.print(den[i-1]);}}lcd.print(" ");// день недели lcd.setCursor(5,1); lcd.print(DateTime.day);lcd.print(" "); // дата for(i=0;i<12;i++){if(DateTime.month==i){lcd.print(mes[i-1]);}}lcd.print(" "); // месяц lcd.print(DateTime.year);lcd.print(" "); // год if((DateTime.second/10)%2==0){ // каждые 2 секунды опрос температуры, давления и влажности t1=Temperature*0.1; t2=temp.getTempCByIndex(0); p=Pressure/133.3;} lcd.setCursor(0,2); lcd.print("Te~;.;.");if(t1>=0){lcd.print(" ");}if(t1>0&&t1<10||t1<0&&t1>-10){lcd.print(" ");}lcd.print(t1,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,3); lcd.print("Te~;.@.");if(t2>=0){lcd.print(" ");}if(t2>0&&t2<10||t2<0&&t2>-10){lcd.print(" ");}lcd.print(t2,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,4); lcd.print("P ");lcd.print(p,1); // давление lcd.print(" H "); lcd.print(dht.readHumidity(),0);lcd.print(" %");// влажность lcd.setCursor(0,5); lcd.print(" RCL-RADIO.RU "); }
Почему-то исчезли все комментарии.
произошел сбой работы сервера, пришлось восстанавливать через бекап.
Что нужно удалить в скетче, чтобы не использовать часовой блок?
Вы за основу берете Домашняя метеостанция (Nokia 5110 LCD)(Arduino)?
Да.
мы так 3 часа будем общаться, лучше через почту liman324@yandex.ru
Скетч русифицированный или на англ.?
Отправил на почту.
Привет ! Подскажите пжл, загрузил проект вроде всё работает но нет показания времени и дата присутствует . что Я сделал не так?
Найдите в библиотеке DS3231 файл DS3231.cpp
Далее найдите строчки
char* DS3231::dateFormat(const char* dateFormat, RTCDateTime dt)
{
char buffer[255];
замените на
char* DS3231::dateFormat(const char* dateFormat, RTCDateTime dt)
{
static char buffer[255];
Должно помочь, или загрузите скетч в старой версии Arduino IDE 1,0,1
с заменой выдаёт ошибку компиляция для ардуино нано
У меня компилируется без ошибок
char* DS3231::dateFormat(const char* dateFormat, RTCDateTime dt)
{
static char buffer[255];
Опубликуйте текст ошибок
вот что пишет
Скопируйте список ошибок и вставьте в комментарии, я вижу только предупреждения, ошибки выше по списку
Если не получится верните все как было. Можно по другому выводить время.
C:\Users\robert\Documents\Arduino\libraries\DS3231\DS3231.cpp:297:8: error: redefinition of ‘char* DS3231::dateFormat(const char*, RTCDateTime)’
}char* DS3231::dateFormat(const char* dateFormat, RTCDateTime dt) { static char buffer[255]; buffer[0] = 0;
^~~~~~
C:\Users\robert\Documents\Arduino\libraries\DS3231\DS3231.cpp:171:7: note: ‘char* DS3231::dateFormat(const char*, RTCDateTime)’ previously defined here
char* DS3231::dateFormat(const char* dateFormat, RTCDateTime dt)
Верните все как было
В скетче замените строку
lcd.print(clock.dateFormat(«H:i:s»,DateTime));// выводим часы, минуты
на
lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(«:»);
lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(«:»);
lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);
выдаёт ошибку на эту стоку sketch_apr16a:43:75: error: expected primary-expression before ‘:’ token
lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(«:»);
lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);
Спасибо , За Работало ! )