#include #include "RTClib.h" #include #include //DHT and LCD libraries #define N 23 #include #define I2C_ADDR 0x27 #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); dht DHT; //Declaring the DHT as a dht type to use it later RTC_DS1307 rtc; char linia1[20], linia2[20]; unsigned char bufor [N]; int PM25 = 20, PM10 = 20; int wartoscPM25(unsigned char *thebuf); int wartoscPM10(unsigned char *thebuf); char sprawdzLancuch(unsigned char *thebuf, char leng); byte termometr[8] = { 0b00100, 0b00110, 0b00100, 0b00110, 0b00100, 0b01110, 0b01110, 0b00000 }; byte kropla[8] = { 0b00100, 0b00100, 0b01110, 0b01110, 0b10111, 0b10111, 0b01110, 0b00000 }; byte stopnie[8] = { 0b00010, 0b00101, 0b00010, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; #define DHT22_PIN 7 //Declaring where the DHT signal pin is wired char daysOfTheWeek[7][12] = {"Niedzie","Poniedz","Wtorek","Sroda","Czwarte","Piatek","Sobota"}; void setup(){ Serial.begin(9600); lcd.begin (20,4); lcd.print("Witaj,uruchamiam..."); // napis kontrolny //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time //rtc.adjust(DateTime(2019, 7, 16, 9, 43, 0));// to set the time manualy lcd.createChar(0, termometr); lcd.createChar(1, kropla); lcd.createChar(2, stopnie); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.home (); } void loop(){ DateTime now = rtc.now();// pobiera datę i czas z zegara RTC if(Serial.find(0x42)) Serial.readBytes(bufor,N); if(bufor[0] == 0x4d){ if(sprawdzLancuch(bufor,N)){ PM25=wartoscPM25(bufor); PM10=wartoscPM10(bufor); } } lcd.clear(); lcd.setCursor(0,0); // kursor na pierwszy wiersz int chk = DHT.read22(DHT22_PIN); //Reading data from the module lcd.write((byte)0); // rzutuję ikonę termomrtr na typ byte i wyświetlam ją na lcd lcd.print("="); lcd.print(DHT.temperature,0); // wypisuję zmienną temp, zero skraca do pełnych stopni lcd.print(""); lcd.print("C"); lcd.setCursor(7, 1); // kursor na godzine //lcd.print("TIME"); //lcd.print(" "); if(now.hour()<10)lcd.print("0");//dokladam zero przed pojedynczą liczbą lcd.print(now.hour()); lcd.print(':'); if(now.minute()<10)lcd.print("0");//dokladam zero przed pojedynczą liczbą lcd.print(now.minute()); //lcd.print(':'); //lcd.print(now.second()); //lcd.print(" "); lcd.setCursor(0,1); // kursor na drugi wiersz lcd.write((byte)1); // jak ww. lcd.print("="); lcd.print(DHT.humidity,0); // wypisuję zmienną wilg lcd.print("%"); lcd.setCursor(13, 1); lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); //lcd.print(" "); lcd.setCursor(7, 0); //lcd.print("DATE"); // lcd.print(" "); if(now.day()<10)lcd.print("0");//dokladam zero przed pojedynczą liczbą lcd.print(now.day()); lcd.print('-'); if(now.month()<10)lcd.print("0");//dokladam zero przed pojedynczą liczbą lcd.print(now.month()); lcd.print('-'); lcd.print(now.year()); lcd.print("r."); lcd.setCursor(0,2); // kursor na trzeci wiersz sprintf(linia1,"PM2,5= %d ug/m3",PM25); lcd.print(linia1); lcd.setCursor(0,3); // kursor na czwarty wiersz sprintf(linia2,"PM10 = %d ug/m3",PM10); lcd.print(linia2); delay(1000); // czekam 1s } int wartoscPM25(unsigned char *buf) // generacja wartosci PM2,5 { int PM25v; PM25v=((buf[11]<<8) + buf[12]); return PM25v; } int wartoscPM10(unsigned char *buf) // generacja wartosci PM10 { int PM10v; PM10v=((buf[13]<<8) + buf[14]); return PM10v; } bool sprawdzLancuch(unsigned char *buf, int dlugosc) // sprawdzenie poprawności lancucha { bool flaga=0; int suma=0; for(int i=0; i<(dlugosc-2); i++){ suma+=buf[i]; } suma=suma + 0x42; if(suma == ((buf[dlugosc-2]<<8)+buf[dlugosc-1])) { suma = 0; flaga = 1; } return flaga; }