#include <Adafruit_SSD1306.h> #include <Adafruit_GFX.h> #include <gfxfont.h> #include <DHT.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <DS3231.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define DHTPIN 7 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // dht 7 isejimas ir tipas OneWire oneWire(12); // TEMPERATUROS DAVIKLIAI 12 digital isejimas DallasTemperature sensors(&oneWire); DS3231 clock; RTCDateTime dt; int tMorning = 10; // morning time on int tEvening = 19; // evening time on float swLim = 10; // nuo kurios temp didesnis ventiliatoriaus greitis float humLimit = 60; const int slow = 2; // 2 skaitmeninis isejimas const int fast = 4; // 4 skaitmeninis isejimas const int mirk = 8; // 8 skaitmeninis isejimas float tGlob = 20; // pradine bendra temperatura int greitis = slow; // pradinis greitis long veikLaikas = 0; // veikimo laikas long a = 0; float Hum; float Virt; long b; float ds3231Temp; float currentTemp0; float currentTemp1; float currentTemp2; float currentTemp3; void setup() { Serial.begin(9600); // i2c aktyvinimas delay(5000); // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64) // Clear the buffer. display.clearDisplay(); pinMode(slow, OUTPUT); // letas ventiliatoriaus greitis pinMode(fast, OUTPUT); // greitas ventiliatorius pinMode(mirk, OUTPUT); // led mirksejimas kas sekunde digitalWrite(slow, LOW); digitalWrite(fast, LOW); dht.begin(); //dht11 aktyvinimas clock.begin(); // ds3231 aktyvinimas sensors.begin(); // ds18b20 aktyvinimas // aktyvuojamas DS3231 // Serial.println("Initialize DS3231");; // datos ir laiko nustatymas // clock.setDateTime(__DATE__, __TIME__); // clock.setDateTime(2016, 2, 27, 9, 59, 50); } void loop() { // gauname laika is ds3231 dt = clock.getDateTime(); // Serial.print("Raw data: "); Serial.print(dt.year); Serial.print("-"); Serial.print(dt.month); Serial.print("-"); Serial.print(dt.day); Serial.print(" "); Serial.print(dt.hour); Serial.print(":"); Serial.print(dt.minute); Serial.print(":"); Serial.print(dt.second); //---------------------------------------------------------------------------- clock.forceConversion(); // konvertuojamas laikas digitalWrite(mirk, HIGH); // mirksiukas 12 koja ijungiamas float t = dht.readTemperature(); // temperaturos duomenys is dht float h = dht.readHumidity(); // dregmes duomenys is dht Hum = h; Virt = t; if ( h > humLimit) // jeigu h virsija nustatyta reiksme { a = 0; // a nusinulina ir sumazinus h zemiau nustatytos reiksmes ventiliatorius daugiau nesisuka while (h > humLimit) { //----------------------------- display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(45, 35); display.print(h, 0); display.print("%"); // if humidity in kitchen is higher than 60% Fan turns on while it gets lower display.display(); delay(500); display.clearDisplay(); // flashing humidity number display.display(); delay(500); //---------------------------- /* dt = clock.getDateTime(),*/ h = dht.readHumidity(), digitalWrite(greitis, HIGH), Serial.println(h); // if (tMorning == dt.minute && dt.second == 58 || tEvening == dt.minute && dt.second ==59 ) break; } delay(5000); digitalWrite(greitis, LOW); } ds3231Temp = clock.readTemperature(); // gauname duomenis is ds3231 Serial.print(" DS="); Serial.print(ds3231Temp, 0); //ds3231 temperaturos daviklis Serial.print("C"); //---------------------------------------------------------------------------- sensors.requestTemperatures(); // gaunamos temperaturos is ds18b20 currentTemp0 = sensors.getTempCByIndex(0); // pirmas temperaturos daviklis currentTemp1 = sensors.getTempCByIndex(1); // antras temperaturos daviklis currentTemp2 = sensors.getTempCByIndex(2); // pirmas temperaturos daviklis currentTemp3 = sensors.getTempCByIndex(3); // antras temperaturos daviklis Serial.print(" Mi="); Serial.print(currentTemp0, 0); Serial.print(" Va="); Serial.print(currentTemp1, 0); Serial.print(" La="); Serial.print(currentTemp2, 0); Serial.print(" Sv="); Serial.print(currentTemp3, 0); //----------------------------------------------------------------------------- if ( currentTemp2 > swLim ) greitis = fast; else greitis = slow; // Didesnis greitis nuo swLim nustatytos reiksmes veikLaikas = (((t + currentTemp0 + currentTemp1 + currentTemp3)/4) + (currentTemp2) )* 60; // ventiliatoriaus veikimo laikas isijungus // veikLaikas = 40; digitalWrite(mirk, LOW); // (dt.second == 10 || dt.second == 11) motorOn(); //----------------------------------------------------------------------------- tGlob = (t + currentTemp0 + currentTemp1+ currentTemp3)/4; // apskaiciuojamas vidaus temperaturu vidurkis Serial.print(" Vid"); Serial.print(tGlob, 2); //----------------------------------------------------------------------------- /* if (isnan(t) || isnan(h)) { // jeigu negauname duomenu is dht11, rasome: Serial.println("err+"); } else { Serial.print(" Vi"); Serial.print(t, 0); Serial.print(" H="); Serial.print(h, 0); Serial.print("% "); if (greitis == fast) Serial.print("fast "); else Serial.print ("slow "); } */ // Serial.print(veikLaikas/60000); Serial.print("min"); Serial.print(veikLaikas/60); Serial.print("min"); // Serial.print(" "); Serial.print(i); Serial.print(" "); motorOn(); displayPrint (); } void displayPrint() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); if (dt.hour < 10) display.print ("0"); display.print(dt.hour, DEC); display.print(":"); if (dt.minute < 10) display.print("0"); display.print(dt.minute, DEC); display.print(":"); if (dt.second < 10) display.print("0"); display.print(dt.second, DEC); display.setCursor(65, 0); display.print(dt.year); display.print("."); if (dt.month < 10) display.print("0"); display.print(dt.month); display.print("."); if (dt.day < 10) display.print("0"); display.print(dt.day); display.setCursor(0, 12); display.print("B"); display.print(tGlob, 1); /* display.setCursor(100, 12); display.print(currentTemp0, 0); display.print((char)247); display.print("C"); */ display.setCursor(0, 27); display.print(currentTemp3, 0); display.print((char)247); display.print("C"); //svetaine kaire antra eilute display.setTextSize(2); if (currentTemp2 < 0) { display.setCursor(26, 17); display.print("-");} else { display.setCursor(35, 17);} display.print(currentTemp2, 1); display.setTextSize(1); display.print((char)247); display.print("C"); // Lauko Centras antra eilute display.setTextSize(1); display.setCursor(100, 27); display.print(Virt, 0); display.print((char)247); display.print("C"); // Virtuve Desine antra eilute display.setCursor(0, 40); display.print(currentTemp0, 0); display.print((char)247); display.print("C"); //Miegamas kaire trecia eilute display.setCursor(45, 37); display.setTextSize(2); display.print(Hum, 0); display.print("%"); //Dregnumas Centras trecia eilute display.setTextSize(1); display.setCursor(100, 40); display.print(currentTemp1, 0); display.print((char)247); display.print("C"); // Vaiku Desine trecia eilute display.setCursor(0, 55); display.print(tMorning); display.print("h*"); //Ryto isijungimo valanda kaire ketvirta eilute display.setCursor(27, 55); if (b>0) { display.print("Liko "); display.print(a/60); display.print(" min.");} // veikimo laikas ketvirta eilute centras else { if (veikLaikas < 0) veikLaikas = 0; display.setCursor(30, 55); display.print(veikLaikas/60); display.print("min."); if (greitis == fast) display.print(" fast"); else display.print (" slow");} display.setCursor(100, 55); display.print("*"); display.print(tEvening); display.print("h"); //Vakaro isijungimo laikas desine ketvirta eilute display.display(); display.clearDisplay(); } void motorOn () { if ( dt.hour == tMorning && dt.minute == 0 && dt.second < 2 || dt.hour == tEvening && dt.minute == 0 && dt.second < 2 ) a = veikLaikas; b = a--; if ( b!= 0) digitalWrite(greitis, HIGH); else digitalWrite(greitis, LOW); Serial.print(" "); Serial.println(b); if ( a<0) a=0; }