Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ESP8266WiFi.h>
- #include <WiFiClient.h>
- #include <ESP8266WebServer.h>
- #include <ESP8266mDNS.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <Adafruit_NeoPixel.h>
- #include <PID_v1.h>
- #define RELAY D2
- #define ONE_WIRE_BUS D3
- #define LED_PIN D4
- #define MODE_T 0
- #define MODE_P 1
- const char* ssid = "HighInBC";
- const char* password = "overlord";
- const char* host = "esp8266Temp";
- ESP8266WebServer server(80);
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature sensors(&oneWire);
- DeviceAddress thermometer = { 0x28, 0xFF, 0x96, 0x0A, 0x63, 0x16, 0x04, 0x1E };
- Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, LED_PIN, NEO_GRB + NEO_KHZ800);
- double white = strip.Color( 255, 255, 255 );
- double red = strip.Color( 255, 0, 0 );
- double green = strip.Color( 0, 255, 0 );
- double blue = strip.Color( 0, 0, 255 );
- double orange = strip.Color( 255, 165, 0 );
- double Setpoint, Input, Output;
- PID myPID(&Input, &Output, &Setpoint,3,5,1, DIRECT);
- unsigned int WindowSize = 20000;
- unsigned long windowStartTime;
- unsigned int tempCheckInterval = 10000;
- unsigned long lastTempCheck;
- float temp = -127.00;
- int mode = MODE_T;
- void printTemp() {
- server.send(200, "text/plain", String(temp));
- }
- void printRate() {
- server.send(200, "text/plain", String(Output));
- }
- void printPercent() {
- float percent = (Output/20000) * 100;
- server.send(200, "text/plain", String(percent)+"%");
- }
- void setup()
- {
- Serial.begin(9600);
- uint8_t i = 0;
- while (WiFi.status() != WL_CONNECTED && i++ < 20) {//wait 10 seconds
- delay(500);
- }
- if(i == 21){
- Serial.print("Could not connect to");
- Serial.println(ssid);
- while(1) delay(500);
- }
- Serial.print("Connected! IP address: ");
- Serial.println(WiFi.localIP());
- if (MDNS.begin(host)) {
- MDNS.addService("http", "tcp", 80);
- Serial.println("MDNS responder started");
- Serial.print("You can now connect to http://");
- Serial.print(host);
- Serial.println(".local");
- }
- server.on("/temp", HTTP_GET, printTemp);
- server.on("/rate", HTTP_GET, printRate);
- server.on("/percent", HTTP_GET, printPercent);
- server.begin();
- Serial.println("HTTP server started");
- pinMode(RELAY, OUTPUT);
- windowStartTime = millis();
- lastTempCheck = millis() - tempCheckInterval;
- Setpoint = 25;
- myPID.SetOutputLimits(0, WindowSize);
- myPID.SetMode(AUTOMATIC);
- sensors.begin();
- sensors.setResolution(thermometer, 12);
- strip.begin();
- strip.show();
- }
- void mode_pid( float temperature ) {
- Input = temperature;
- myPID.Compute();
- unsigned long now = millis();
- if(now - windowStartTime>WindowSize)
- {
- windowStartTime += WindowSize;
- }
- if(Output > now - windowStartTime) {
- strip.setPixelColor( 0, red );
- digitalWrite(RELAY,HIGH);
- } else {
- strip.setPixelColor( 0, green );
- digitalWrite(RELAY,LOW);
- }
- strip.show();
- }
- void mode_thermostat( float temperature ) {
- if( temperature > Setpoint ) {
- digitalWrite(RELAY, LOW);
- strip.setPixelColor( 0, blue );
- strip.show();
- } else if( temperature < Setpoint ) {
- digitalWrite(RELAY, HIGH);
- strip.setPixelColor( 0, orange );
- strip.show();
- }
- }
- void loop()
- {
- server.handleClient();
- if( millis() - lastTempCheck > tempCheckInterval ) {
- lastTempCheck = millis();
- sensors.requestTemperatures();
- temp = sensors.getTempC(thermometer);
- Serial.println(temp);
- }
- if( temp > 40 || temp < 0 ) { // sanity check
- digitalWrite(RELAY, LOW);
- strip.setPixelColor( 0, white );
- strip.show();
- return;
- }
- if( mode == MODE_T && abs(Setpoint - temp) < .1 ) {
- mode = MODE_P;
- }
- if( mode == MODE_P && abs(Setpoint - temp) > .75 ) {
- mode = MODE_T;
- }
- switch( mode ) {
- case MODE_T:
- mode_thermostat( temp );
- break;
- case MODE_P:
- mode_pid( temp );
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment