На странице http://rcl-radio.ru/?p=55605 рассматривался пример создания простой погодной метеостанции на основе датчиков давления, влажности и температуры с выводом информации на LCD экран Nokia 5110.
На данной странице будет показан пример создания погодной станции с будильником, так как в погодной станции имеются часы реального времени, то добавить дополнительный функционал в виде будильника не представляет большого труда. Так же необходимо добавить три кнопки управления, это + , — и кнопка управления будильником.
Будильник работает в следующих режимах:
- каждый день
- по будням
- по выходным
- выкл.
Время будильника и режим работы сохраняется в энергонезависимой памяти.
Метеостанция имеет несколько датчиков (модулей):
- 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.
- Кнопки управления подключены к цифровым выходам 8, 9 и 10 (+ , -, упр.буд.)
- Пьезоизлучатель подключен в цифровому выходу 12.
Для успешной загрузки скетча Вам понадобятся следующие библиотеки:
- DHT
- DallasTemperature
- OneWire
- DS3231
- pcd8544 — в библиотеке изменена нумерация подключения выводов, заменены редко используемые символы на русские буквы, поэтому необходимо использовать именно эту библиотеку.
После сборки уст-во практически не нуждается в настройке, единственное что придется сделать, это установить контрастность индикатора:
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> #include <EEPROMex.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 };// градус static const byte herta[] = { B00011000,B00011000,B00011000,B00011000,B00011000 };// =========== long Temperature,Pressure; int k,m,h1,i,i1,w,reg,ton; float t1,t2,p,h; byte rom0,rom1,rom2,eeprom; 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.createChar(1, herta); lcd.setContrast(60);// контрастность 0-127 pinMode(8,INPUT);pinMode(9,INPUT);pinMode(10,INPUT); // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);} rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);} rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);} m=rom0;h1=rom1;w=rom2; } void loop(void) { if(reg==0){ 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("<@(>{`). ");if(h1<10){lcd.print("0");}lcd.print(h1);lcd.print(":"); if(m<10){lcd.print("0");}lcd.print(m); lcd.setCursor(0,3); 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,4); 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,5); lcd.print("P ");lcd.print(p,1); // давление lcd.print(" H "); lcd.print(dht.readHumidity(),0);lcd.print(" %");// влажность } i1++;if(i1>4){i1=0;} if(digitalRead(10)==HIGH){k++;reg=1;delay(300);lcd.clear();}if(k>3){k=0;reg=0;} if(reg==1) { lcd.setCursor(0,0);lcd.print("--------------");lcd.setCursor(0,1);lcd.print(" <@(>{`)>k "); lcd.setCursor(0,2);lcd.print("--------------"); if(k==1){ if(digitalRead(8)==HIGH){m++;delay(300);}if(m>59){m=59;} if(digitalRead(9)==HIGH){m--;delay(300);}if(m<0){m=0;}} if(k==2){ if(digitalRead(8)==HIGH){h1++;delay(300);}if(h1>23){h1=23;} if(digitalRead(9)==HIGH){h1--;delay(300);}if(h1<0){h1=0;}} if(k==3){ if(digitalRead(8)==HIGH){w++;delay(300);}if(w>3){w=0;} if(digitalRead(9)==HIGH){w--;delay(300);}if(w<0){w=3;} } lcd.setCursor(0,3);lcd.print("Bpe~* "); if(i1==1&&k==2&&digitalRead(8)==LOW&&digitalRead(9)==LOW){lcd.print(" ");}else{if(h1 < 10 ){lcd.print("0");}lcd.print(h1);} lcd.print(":"); if(i1==1&&k==1&&digitalRead(8)==LOW&&digitalRead(9)==LOW){lcd.print(" ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} lcd.setCursor(0,5); if(i==1&&k==3){lcd.print(" ");} if(w==0){lcd.print(" Ka|(?] (e)` ");} //каждый день 1234567 if(w==1){lcd.print(" !o [@()*~ ");}//по будням 12345 if(w==2){lcd.print(" !o &?xo()?~ ");}//по выходным 67 if(w==3){lcd.print(" B?k{. ");} delay(50); rom0=m;rom1=h1;rom2=w;eeprom=1; } if(digitalRead(8)==HIGH||digitalRead(9)==HIGH){ton=1;} if(DateTime.hour*60+DateTime.minute!=h1*60+m){ton=0;} if(w==0){pic();} if(w==1&&(DateTime.dayOfWeek<6)){pic();} if(w==2&&(DateTime.dayOfWeek>5)){pic();} if(reg==0&&eeprom==1){eeprom=0;EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);} } void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h1*60+m)){tone(12,1200,500);delay(500);}}
Видео