Tema: Kam namu temperaturos kontrolerio ant arduino?
Autorius: Vinus
Data: 2016-02-07 16:26:01
  #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;
 }