#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;
}