/********* Rui Santos Complete project details at https://randomnerdtutorials.com/esp8266-nodemcu-access-point-ap-web-server/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. *********/ // Import required libraries #include #include #include #include #include #include #include #include String header; const char* ssid = "Cooling-Fan-Controller"; const char* password = "123456789"; #define DHTPIN 5 // Digital pin connected to the DHT sensor // For NodeMCU //#define LED_OUT D0 // For my board //#define LED_OUT LED_BUILTIN #define LED_OUT 12 #define lowerThresholdAddr 1 #define upperThresholdAddr 2 #define delayValueAddr 3 #define fanStateAddr 4 #define sensorStateAddr 5 // Uncomment the type of sensor in use: //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) String sensorStatus = "ON"; int delayTimeCounter = 0; int upperThresholdDelayCounter = 0; int lowerThresholdDelayCounter = 0; int tempThresholdValue = 0; int delayValue = 0; int lowerThresholdValue, upperThresholdValue; String information = ""; const char* value = ""; // Auxiliar variables to store the current output state String output4State = "off"; String output12State = "off"; String output13State = "off"; String output14State = "off"; String output16State = "off"; // Assign output variables to GPIO pins const int output4 = 4; const int output12 = 12; const int output13 = 13; const int output14 = 14; const int output16 = 16; const double A = 0.001129148; // thermistor equation parameters const double B = 0.000234125; const double C = 0.0000000876741; int fanStateBool; int sensorStatusBool; int ThermistorPin = A0; int Vo; float R1 = 10000; float logR2, T, Tc, Tf = 0; float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07; int subtractingFactorForCompensation = 36; // For nodemcu //int subtractingFactorForCompensation = 10; // For custom design, resistors 3003 6803 const double VCC = 3.3; // NodeMCU on board 3.3v vcc const double adc_resolution = 1023; // 10-bit adc const double R2 = 10000; DHT dht(DHTPIN, DHTTYPE); // current temperature & humidity, updated in loop() float t = 0.0; float h = 0.0; String fanState = "OFF"; int displayedValue; // Create AsyncWebServer object on port 80 AsyncWebServer server(80); AsyncClient client; AsyncWebServerRequest request(&server, &client); // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store unsigned long previousMillis = 0; // will store last time DHT was updated // Updates DHT readings every 10 seconds const long interval = 10000; const char index_html[] PROGMEM = R"rawliteral(

TEMPERATURE MONITORING

TEMPERATURE %TEMPERATURE% °C

FAN STATUS : %FAN_STATE%

UPPER THRESHOLD %UPPER_THRESHOLD_VALUE% °C

LOWER THRESHOLD %LOWER_THRESHOLD_VALUE% °C

DELAY IN SECONDS %DELAY_VALUE% s

%fan_state_part%

%sensor_state_part%
%INFORMATION% )rawliteral"; const char setLowerThresholdHTML[] PROGMEM = R"rawliteral(

Lower Threshold set successfully

Home

)rawliteral"; const char setUpperThresholdHTML[] PROGMEM = R"rawliteral(

Upper Threshold set successfully

Home

)rawliteral"; const char delayValueHTML[] PROGMEM = R"rawliteral(

Delay set successfully

Home

)rawliteral"; // Replaces placeholder with DHT values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return String(t); } else if(var == "HUMIDITY"){ return String(h); } else if(var == "LOWER_THRESHOLD_VALUE") { return String(lowerThresholdValue); } else if(var == "FAN_STATE") { return String(fanState); } else if(var == "UPPER_THRESHOLD_VALUE") { return String(upperThresholdValue); } else if(var == "DELAY_VALUE") { return String(delayValue); } else if(var == "INFORMATION") { return String(information); } else if(var == "fan_state_part") { if(fanStateBool == 0) { return String(""); } else if(fanStateBool == 1) { return String(""); } else { return String(""); } } else if(var == "sensor_state_part") { if(sensorStatusBool == 1) { return String(""); } else if(sensorStatusBool == 0) { return String(""); } else { return String(""); } } return String(); } float calculateTemperature() { int temp_adc_val; float temp_val; float temp_sum = 0; float returnTemp; float returnTempRounded; static int incrementCounter = 0; static int decrementCounter = 0; int incrementCounterLimit = 5, decrementCounterLimit = 5; int difference = 1; double adc_value, Vout, Rth, temperature; adc_value = analogRead(A0); //adc_value -= subtractingFactorForCompensation; //adc_value += 2; //displayedValue = 512; //Serial.println(displayedValue); if(abs(adc_value - displayedValue) > difference) { //displayedValue = adc_value; //Serial.println("Hello world"); if(adc_value > displayedValue) { incrementCounter++; decrementCounter = 0; if(incrementCounter >= incrementCounterLimit) { displayedValue++; incrementCounter = 0; } } else if(adc_value < displayedValue) { incrementCounter = 0; decrementCounter++; if(decrementCounter >= decrementCounterLimit) { displayedValue--; decrementCounter = 0; } } } //Serial.println(displayedValue); Vout = (displayedValue * VCC) / adc_resolution; Rth = (VCC * R2 / Vout) - R2; //Serial.println(VCC); // Steinhart-Hart Thermistor Equation: // Temperature in Kelvin = 1 / (A + B[ln(R)] + C[ln(R)]^3) // where A = 0.001129148, B = 0.000234125 and C = 8.76741*10^-8 temperature = (1 / (A + (B * log(Rth)) + (C * pow((log(Rth)),3)))); // Temperature in kelvin temperature = temperature - 273.15; // Temperature in degree celsius returnTempRounded = ((float )((int)(temperature * 10))) / 10; //currentTemperatureValue = returnTempRounded; Serial.println(returnTempRounded, 1); delay(300); return (returnTempRounded); } void setup(){ // Serial port for debugging purposes Serial.begin(115200); EEPROM.begin(512); lowerThresholdValue = EEPROM.read(lowerThresholdAddr); upperThresholdValue = EEPROM.read(upperThresholdAddr); delayValue = EEPROM.read(delayValueAddr); fanStateBool = EEPROM.read(fanStateAddr); sensorStatusBool = EEPROM.read(sensorStateAddr); //Serial.println("Paulsin"); //Serial.println(fanStateBool); if(sensorStatusBool == 1) { sensorStatus = "ON"; } else if(sensorStatusBool == 0) { sensorStatus = "OFF"; } else { sensorStatus = "OFF"; } dht.begin(); pinMode(LED_OUT, OUTPUT); Serial.print("Setting AP (Access Point)…"); // Remove the password parameter, if you want the AP (Access Point) to be open WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP); // Print ESP8266 Local IP Address Serial.println(WiFi.localIP()); displayedValue = analogRead(A0); // Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(t).c_str()); }); server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(h).c_str()); }); server.on("/fanState", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", String(fanState).c_str()); }); // Route for root / web page server.on("/setLowerThreshold", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", setLowerThresholdHTML, processor); //Serial.println(request -> arg("tempValue")); String strLowerThresholdValue = request -> arg("lowerThresholdValue"); int intLowerThresholdValue = strLowerThresholdValue.toInt(); // Serial.println(intTempValue); EEPROM.write(lowerThresholdAddr, intLowerThresholdValue); EEPROM.commit(); lowerThresholdValue = EEPROM.read(lowerThresholdAddr); }); // Route for root / web page server.on("/setUpperThreshold", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", setUpperThresholdHTML, processor); //Serial.println(request -> arg("tempValue")); String strUpperThresholdValue = request -> arg("upperThresholdValue"); int intUpperThresholdValue = strUpperThresholdValue.toInt(); // Serial.println(intTempValue); EEPROM.write(upperThresholdAddr, intUpperThresholdValue); EEPROM.commit(); upperThresholdValue = EEPROM.read(upperThresholdAddr); }); // Route for root / web page server.on("/setDelay", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", delayValueHTML, processor); //Serial.println(request -> arg("tempValue")); String strDelayValue = request -> arg("delayValue"); int intDelayValue = strDelayValue.toInt(); // Serial.println(intTempValue); EEPROM.write(delayValueAddr, intDelayValue); EEPROM.commit(); delayValue = EEPROM.read(delayValueAddr); }); // Route for root / web page server.on("/paul", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", setLowerThresholdHTML, processor); //if(request.arg(1)) //{ Serial.println(request -> arg("value1")); //} }); // Route for root / web page server.on("/changeFanStatus", HTTP_GET, [](AsyncWebServerRequest *request){ //request->send_P(200, "text/html", setLowerThresholdHTML, processor); //if(request.arg(1)) //{ Serial.println(request -> arg("status")); //} if(request -> arg("status") == "ON") { fanState = "ON"; EEPROM.write(fanStateAddr, 1); EEPROM.commit(); fanStateBool = EEPROM.read(fanStateAddr); } else if(request -> arg("status") == "OFF") { fanState = "OFF"; EEPROM.write(fanStateAddr, 0); EEPROM.commit(); //Serial.println(EEPROM.read(fanStateAddr)); fanStateBool = EEPROM.read(fanStateAddr); } }); server.on("/changeSensorStatus", HTTP_GET, [](AsyncWebServerRequest *request){ //request->send_P(200, "text/html", setLowerThresholdHTML, processor); //if(request.arg(1)) //{ Serial.println(request -> arg("status")); //} if(request -> arg("status") == "ON") { sensorStatus = "ON"; EEPROM.write(sensorStateAddr, 1); EEPROM.commit(); sensorStatusBool = EEPROM.read(sensorStateAddr); } else if(request -> arg("status") == "OFF") { sensorStatus = "OFF"; EEPROM.write(sensorStateAddr, 0); EEPROM.commit(); sensorStatusBool = EEPROM.read(sensorStateAddr); } }); // Start server server.begin(); } void loop(){ Serial.println(sensorStatus); if(sensorStatus == "ON") { t = calculateTemperature(); if(upperThresholdValue > lowerThresholdValue) { if(t >= upperThresholdValue) { delayTimeCounter++; if(delayTimeCounter >= delayValue) { digitalWrite(LED_OUT, LOW); fanState = "ON"; delayTimeCounter = delayValue; } } else if(t<=lowerThresholdValue) { delayTimeCounter++; if(delayTimeCounter >= delayValue) { digitalWrite(LED_OUT, HIGH); fanState = "OFF"; delayTimeCounter = delayValue; } } else { delayTimeCounter = 0; } information = ""; } else { information = "Warning : Lower threshold must be less than upper threshold"; } //Serial.println(delayTimeCounter); } else if(sensorStatus == "OFF"){ if(fanState == "ON") { digitalWrite(LED_OUT, LOW); } else if(fanState == "OFF") { digitalWrite(LED_OUT, HIGH); } } }