HighInBC

Untitled

Sep 30th, 2016
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <ESP8266WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <ESP8266WebServer.h>
  4. #include <ESP8266mDNS.h>
  5. #include <OneWire.h>
  6. #include <DallasTemperature.h>
  7. #include <Adafruit_NeoPixel.h>
  8. #include <PID_v1.h>
  9.  
  10. #define RELAY D2
  11. #define ONE_WIRE_BUS D3
  12. #define LED_PIN D4
  13.  
  14. #define MODE_T 0
  15. #define MODE_P 1
  16.  
  17. const char* ssid = "HighInBC";
  18. const char* password = "overlord";
  19. const char* host = "esp8266Temp";
  20.  
  21. ESP8266WebServer server(80);
  22.  
  23. OneWire oneWire(ONE_WIRE_BUS);
  24. DallasTemperature sensors(&oneWire);
  25. DeviceAddress thermometer = { 0x28, 0xFF, 0x96, 0x0A, 0x63, 0x16, 0x04, 0x1E };
  26.  
  27. Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, LED_PIN, NEO_GRB + NEO_KHZ800);
  28. double white  = strip.Color( 255, 255, 255 );
  29. double red    = strip.Color( 255,   0,   0 );
  30. double green  = strip.Color(   0, 255,   0 );
  31. double blue   = strip.Color(   0,   0, 255 );
  32. double orange = strip.Color( 255, 165,   0 );
  33.  
  34. double Setpoint, Input, Output;
  35. PID myPID(&Input, &Output, &Setpoint,3,5,1, DIRECT);
  36.  
  37. unsigned int WindowSize = 20000;
  38. unsigned long windowStartTime;
  39.  
  40. unsigned int  tempCheckInterval = 10000;
  41. unsigned long lastTempCheck;
  42.  
  43. float temp = -127.00;
  44.  
  45. int mode = MODE_T;
  46.  
  47. void printTemp() {
  48.   server.send(200, "text/plain", String(temp));
  49. }
  50.  
  51. void printRate() {
  52.   server.send(200, "text/plain", String(Output));
  53. }
  54.  
  55. void printPercent() {
  56.   float percent = (Output/20000) * 100;
  57.   server.send(200, "text/plain", String(percent)+"%");
  58. }
  59.  
  60. void setup()
  61. {
  62.   Serial.begin(9600);
  63.  
  64.   uint8_t i = 0;
  65.   while (WiFi.status() != WL_CONNECTED && i++ < 20) {//wait 10 seconds
  66.     delay(500);
  67.   }
  68.   if(i == 21){
  69.     Serial.print("Could not connect to");
  70.     Serial.println(ssid);
  71.     while(1) delay(500);
  72.   }
  73.   Serial.print("Connected! IP address: ");
  74.   Serial.println(WiFi.localIP());
  75.  
  76.   if (MDNS.begin(host)) {
  77.     MDNS.addService("http", "tcp", 80);
  78.     Serial.println("MDNS responder started");
  79.     Serial.print("You can now connect to http://");
  80.     Serial.print(host);
  81.     Serial.println(".local");
  82.   }
  83.  
  84.   server.on("/temp",    HTTP_GET, printTemp);
  85.   server.on("/rate",    HTTP_GET, printRate);
  86.   server.on("/percent", HTTP_GET, printPercent);
  87.   server.begin();
  88.   Serial.println("HTTP server started");
  89.  
  90.   pinMode(RELAY, OUTPUT);
  91.  
  92.   windowStartTime = millis();
  93.   lastTempCheck   = millis() - tempCheckInterval;
  94.  
  95.   Setpoint = 25;
  96.   myPID.SetOutputLimits(0, WindowSize);
  97.   myPID.SetMode(AUTOMATIC);
  98.  
  99.   sensors.begin();
  100.   sensors.setResolution(thermometer, 12);
  101.  
  102.   strip.begin();
  103.   strip.show();
  104.  
  105. }
  106.  
  107. void mode_pid( float temperature ) {
  108.   Input = temperature;
  109.   myPID.Compute();
  110.  
  111.   unsigned long now = millis();
  112.   if(now - windowStartTime>WindowSize)
  113.   {
  114.     windowStartTime += WindowSize;
  115.   }
  116.   if(Output > now - windowStartTime) {
  117.     strip.setPixelColor( 0, red );
  118.     digitalWrite(RELAY,HIGH);
  119.   } else {
  120.     strip.setPixelColor( 0, green );
  121.     digitalWrite(RELAY,LOW);
  122.   }
  123.   strip.show();
  124. }
  125.  
  126. void mode_thermostat( float temperature ) {
  127.   if( temperature > Setpoint ) {
  128.     digitalWrite(RELAY, LOW);
  129.     strip.setPixelColor( 0, blue );
  130.     strip.show();
  131.   } else if( temperature < Setpoint ) {
  132.     digitalWrite(RELAY, HIGH);
  133.     strip.setPixelColor( 0, orange );
  134.     strip.show();
  135.   }
  136. }
  137.  
  138. void loop()
  139. {
  140.   server.handleClient();
  141.   if( millis() - lastTempCheck > tempCheckInterval ) {
  142.     lastTempCheck = millis();
  143.     sensors.requestTemperatures();
  144.     temp = sensors.getTempC(thermometer);
  145.     Serial.println(temp);
  146.   }
  147.   if( temp > 40 || temp < 0 ) { // sanity check
  148.     digitalWrite(RELAY, LOW);
  149.     strip.setPixelColor( 0, white );
  150.     strip.show();
  151.     return;
  152.   }
  153.   if( mode == MODE_T && abs(Setpoint - temp) < .1 ) {
  154.     mode = MODE_P;
  155.   }
  156.   if( mode == MODE_P && abs(Setpoint - temp) > .75 ) {
  157.     mode = MODE_T;
  158.   }
  159.   switch( mode ) {
  160.     case MODE_T:
  161.       mode_thermostat( temp );
  162.       break;
  163.     case MODE_P:
  164.       mode_pid( temp );
  165.       break;
  166.   }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment