Lorenzo1818

Thermostat

Sep 20th, 2019
153
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <ESP8266WiFi.h>
  2. #include <EEPROM.h>
  3. #include <OneWire.h>
  4. #include <DallasTemperature.h>
  5. #include <NTPClient.h>
  6. #include <WiFiUdp.h>
  7.  
  8. #include <SPI.h>
  9. #include <Wire.h>
  10. #include <Adafruit_GFX.h>
  11. #include <Adafruit_SSD1306.h>
  12.  
  13. #define SCREEN_WIDTH 128
  14. #define SCREEN_HEIGHT 32
  15.  
  16. #define OLED_RESET  -1
  17. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  18.  
  19. int status = WL_IDLE_STATUS;
  20.  
  21. const int oneWireBus = 0;
  22. const int heatPad = 5;
  23.  
  24. float temp;
  25. float idealTemp = -127.00;
  26. char highTempAlarm = 30;
  27. char lowTempAlarm = 24;
  28. DeviceAddress tempDeviceAddress;
  29.  
  30. const int utcOffsetInSeconds = 3600 *2;
  31. WiFiUDP ntpUDP;
  32. NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
  33. int hours;
  34.  
  35. unsigned long previousMillis = 0;
  36. unsigned long previousTimeUpdateMillis = 0;
  37. const long interval = 5000;
  38. const long timeUpdateInterval = 1800000; //30 minutes
  39.  
  40. const float normalTemps[24] = {30.00, //0:00am
  41.                                 30.00, //1:00 am
  42.                                 30.00, //2:00 am
  43.                                 30.00, //3:00 am
  44.                                 30.00, //4:00 am
  45.                                 30.00, //5:00 am
  46.                                 31.00, //6:00 am
  47.                                 31.00, //7:00 am
  48.                                 32.00, //8:00 am
  49.                                 32.00, //9:00 am
  50.                                 32.00, //10:00 am
  51.                                 32.00, //11:00 am
  52.                                 32.00, //12:00 am
  53.                                 32.00, //13:00 am
  54.                                 32.00, //14:00 am
  55.                                 32.00, //15:00 am
  56.                                 32.00, //16:00 am
  57.                                 32.00, //17:00 am
  58.                                 32.00, //18:00 am
  59.                                 32.00, //19:00 am
  60.                                 31.00, //20:00 am
  61.                                 31.00, //21:00 am
  62.                                 30.00, //22:00 am
  63.                                 30.00}; //23:00 am
  64.  
  65. const float ciclaggioTemps[24] = {28.00, //0:00am
  66.                                   28.00, //1:00 am
  67.                                   28.00, //2:00 am
  68.                                   28.00, //3:00 am
  69.                                   28.00, //4:00 am
  70.                                   28.00, //5:00 am
  71.                                   29.00, //6:00 am
  72.                                   29.00, //7:00 am
  73.                                   30.00, //8:00 am
  74.                                   30.00, //9:00 am
  75.                                   30.00, //10:00 am
  76.                                   30.00, //11:00 am
  77.                                   30.00, //12:00 am
  78.                                   30.00, //13:00 am
  79.                                   30.00, //14:00 am
  80.                                   30.00, //15:00 am
  81.                                   30.00, //16:00 am
  82.                                   30.00, //17:00 am
  83.                                   30.00, //18:00 am
  84.                                   30.00, //19:00 am
  85.                                   29.00, //20:00 am
  86.                                   29.00, //21:00 am
  87.                                   28.00, //22:00 am
  88.                                   28.00}; //23:00 am
  89.                                
  90.                                
  91.  
  92. OneWire oneWire(oneWireBus);
  93. DallasTemperature sensors(&oneWire);
  94. WiFiServer server(80);
  95. WiFiClient client;
  96.  
  97.  
  98.  
  99. void setup(){
  100.  
  101.   //Pin setup
  102.   pinMode(heatPad, OUTPUT);
  103.  
  104.   //Init Serial, Oled Display and Wifi
  105.   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
  106.     Serial.println(F("SSD1306 allocation failed"));
  107.     for(;;); // Don't proceed, loop forever
  108.   }
  109.   display.clearDisplay();
  110.   setDisplayText("Inizializing...", "", "");
  111.  
  112.   Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
  113.   WiFi.mode(WIFI_STA);
  114.   WiFi.disconnect();
  115.  
  116.   Serial.println("\nScanning for networks...");
  117.   int n = WiFi.scanNetworks();
  118.   int bestStrenght = -90;
  119.   int bestNetwork = 0;
  120.   for (int i = 0; i < n; i++){
  121.     if (WiFi.SSID(i) == "SSID" or WiFi.SSID(i) == "SSID"){
  122.       if (WiFi.RSSI(i) > bestStrenght){
  123.         bestStrenght = WiFi.RSSI(i);
  124.         bestNetwork = i;
  125.       }
  126.     }
  127.   }
  128.  
  129.   Serial.println("Attempting to connect to WPA network...");
  130.   Serial.print("SSID: ");
  131.  
  132.   if (WiFi.SSID(bestNetwork) == "SSID"){
  133.     Serial.println(WiFi.SSID(bestNetwork));
  134.     WiFi.begin(WiFi.SSID(bestNetwork), "PASS");
  135.   }
  136.   else if (WiFi.SSID(bestNetwork) == "SSID"){
  137.     Serial.println(WiFi.SSID(bestNetwork));
  138.     WiFi.begin(WiFi.SSID(bestNetwork), "PASS");
  139.   }
  140.  
  141.   //Wait for ESP8266 to connect
  142.   while (WiFi.status() != WL_CONNECTED){
  143.     Serial.print(".");
  144.     delay(250);
  145.   }
  146.   Serial.println("");
  147.   Serial.println(WiFi.localIP());
  148.  
  149.   setDisplayText(WiFi.localIP().toString(), "", "");
  150.  
  151.   //Initialize mDNS
  152.   //if (!MDNS.begin("esp8266")){
  153.     //Serial.println("Error setting up MDNS responder!");
  154.     //while (1) { delay(1000); }
  155.   //}
  156.   //else { Serial.println("mDNS responder started"); }
  157.  
  158.   //Init clock
  159.   timeClient.begin();
  160.   timeClient.update();
  161.   hours = timeClient.getHours();
  162.  
  163.   //Init server and sensors
  164.   server.begin();
  165.   sensors.begin();
  166.   sensors.getAddress(tempDeviceAddress, 0);
  167.   sensors.setHighAlarmTemp(tempDeviceAddress, highTempAlarm);
  168.   sensors.setLowAlarmTemp(tempDeviceAddress, lowTempAlarm);
  169.  
  170.   //Init EEPROM
  171.   EEPROM.begin(512);
  172. }
  173.  
  174.  
  175.  
  176.  
  177. void loop(void){
  178.  
  179.   //Update mDNS
  180.   //MDNS.update();
  181.  
  182.   //Check temperature and adjust heating according
  183.   unsigned long currentMillis = millis();
  184.  
  185.   if (currentMillis - previousMillis >= interval){
  186.     if (currentMillis - previousTimeUpdateMillis >= timeUpdateInterval){
  187.       previousTimeUpdateMillis = currentMillis;
  188.  
  189.       hours = timeClient.getHours();
  190.       Serial.println("Current time: " + String(hours) + ".00");
  191.      
  192.     }
  193.  
  194.     previousMillis = currentMillis;
  195.     adjustHeating();
  196.    
  197.   }
  198.   //If a socket is not connected
  199.   if (!client.connected()) {
  200.     client = server.available(); //Look up for a client
  201.     delay(20);
  202.   }
  203.  
  204.   //Socket connected
  205.   else {
  206.     Serial.println("Socket still connected");
  207.     //Read socket request
  208.     client.setTimeout(5000);
  209.     String req = client.readStringUntil('\n');
  210.  
  211.     //Call handleRequest and send results
  212.     if (req != ""){
  213.       String result = handleRequest(req);
  214.      
  215.       client.flush();
  216.       client.println(result);
  217.     }
  218.   }
  219.  
  220.  
  221. }
  222.  
  223.  
  224.  
  225.  
  226. String handleRequest(const String& req) {
  227.  
  228.   Serial.println(req);
  229.  
  230.   //Handle request based on identificators
  231.  
  232.   if (req == "read"){ //Read temp
  233.    
  234.     String tempMode;
  235.     EEPROM.get(0, tempMode);
  236.    
  237.     return String(temp) + " " + tempMode + " " + idealTemp;
  238.   }
  239.  
  240.   else if (req == "setTemp"){ //Set temp
  241.    
  242.     idealTemp = client.readStringUntil('\n').toFloat();
  243.     client.flush();
  244.  
  245.     EEPROM.put(1, idealTemp);
  246.     EEPROM.commit();
  247.  
  248.     return "true";
  249.     }
  250.  
  251.   else if (req == "nM") { //Set NORMAL MODE
  252.  
  253.     EEPROM.put(0, "0"); //Normal mode == 0
  254.     EEPROM.commit();
  255.  
  256.     return "true";
  257.   }
  258.  
  259.   else if (req == "cM"){ //Set CICLAGGIO MODE
  260.    
  261.     EEPROM.put(0, "1"); //Ciclaggio mode = 1
  262.     EEPROM.commit();
  263.  
  264.     return "true";
  265.   }
  266.    
  267.   else if (req == "mM"){ //Set MANUAL MODE
  268.    
  269.     EEPROM.put(0, "2"); //Manual mode = 2
  270.     EEPROM.commit();
  271.    
  272.     return "true";
  273.   }
  274.  
  275.   else { return "unhandled"; }
  276.  
  277. }
  278.  
  279.  
  280.  
  281. void adjustHeating(){
  282.  
  283.   String tempMode;
  284.   EEPROM.get(0, tempMode);
  285.   if (tempMode == "0"){
  286.     idealTemp = normalTemps[hours];
  287.   }
  288.   else if (tempMode == "1"){
  289.     idealTemp = ciclaggioTemps[hours];
  290.   }
  291.   else if (tempMode == "2"){
  292.     EEPROM.get(1, idealTemp);
  293.   }
  294.  
  295.  
  296.   sensors.requestTemperaturesByAddress(tempDeviceAddress);
  297.   temp = sensors.getTempC(tempDeviceAddress);
  298.  
  299.   if (sensors.hasAlarm(tempDeviceAddress)){
  300.     Serial.println("ALARM");
  301.   }
  302.  
  303.   if (temp < idealTemp){
  304.     setDisplayText(WiFi.localIP().toString(), String(temp), "ON");
  305.     digitalWrite(heatPad, HIGH);
  306.   }
  307.   else{
  308.     setDisplayText(WiFi.localIP().toString(), String(temp), "OFF");
  309.     digitalWrite(heatPad, LOW);
  310.   }
  311. }
  312.  
  313. void setDisplayText(String topText, String tempText, String stateText){
  314.  
  315.   Serial.println("IP: "+topText + "\tTemp: "+tempText + "\tState: "+stateText);
  316.  
  317.   display.clearDisplay();
  318.  
  319.   display.fillRect(0, 0, 128, 32, BLACK);
  320.  
  321.   display.setTextSize(1);
  322.   display.setTextColor(WHITE);
  323.   display.setCursor(0, 0);
  324.   display.println(topText);
  325.  
  326.   display.setCursor(96, 0);
  327.   display.println(stateText);
  328.  
  329.   display.setTextSize(2);
  330.   display.setCursor(32, 16);
  331.   display.println(tempText);
  332.  
  333.   display.display();
  334. }
RAW Paste Data