Here is another sketch for ESP8266 for a javascript based self-updating temperature gauge. It is a modified version of the one @ https://circuits4you.com/2018/02/03/esp8266-nodemcu-adc-analog-value-on-dial-gauge/. Thanks guys.
The hardware is to be used for controlling the hot water system in our off-grid home. The instant code would become part of a Hot Water Management System that includes:
1. electric geyser control;
2. periodic flushing/recycling the hot water feed line into the main overhead tank;
3. control of 2 pressurizing pumps to maintain system pressure at around 2.2 bars.
(required because single storey house has very little head for water for showering)
THE CODE
const char* htmlfile = "/index.html";
int a;
//WiFi Connection configuration
const char* ssid = "ZONG MBB-E5573-E9A6"; // WiFi SSID
const char* password = "07237750"; // WiFi Password
ESP8266WebServer server(80);
void handleADC(){
/*
int a = analogRead(A0);
a = map(a,0,1023,0,100);
String adc = String(a);
Serial.println(adc);
*/
ReadADC();
String adc = String(a);
server.send(200, "text/plane",adc);
}
void handleRoot(){
server.sendHeader("Location", "/index.html",true); //Redirect to our html web page
server.send(302, "text/plane","");
}
void handleWebRequests(){
if(loadFromSpiffs(server.uri())) return;
String message = "File Not Detected\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " NAME:"+server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
Serial.println(message);
}
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
//Initialize File System
SPIFFS.begin();
Serial.println("File System Initialized");
//Connect to wifi Network
WiFi.begin(ssid, password); //Connect to your WiFi router
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
//Initialize Webserver
server.on("/",handleRoot);
server.on("/getADC",handleADC); //Reads ADC function is called from out index.html
server.onNotFound(handleWebRequests); //Set setver all paths are not found so we can handle as per URI
server.begin();
}
void loop() {
server.handleClient();
}
bool loadFromSpiffs(String path){
String dataType = "text/plain";
if(path.endsWith("/")) path += "index.htm";
if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf("."));
else if(path.endsWith(".html")) dataType = "text/html";
else if(path.endsWith(".htm")) dataType = "text/html";
else if(path.endsWith(".css")) dataType = "text/css";
else if(path.endsWith(".js")) dataType = "application/javascript";
else if(path.endsWith(".png")) dataType = "image/png";
else if(path.endsWith(".gif")) dataType = "image/gif";
else if(path.endsWith(".jpg")) dataType = "image/jpeg";
else if(path.endsWith(".ico")) dataType = "image/x-icon";
else if(path.endsWith(".xml")) dataType = "text/xml";
else if(path.endsWith(".pdf")) dataType = "application/pdf";
else if(path.endsWith(".zip")) dataType = "application/zip";
File dataFile = SPIFFS.open(path.c_str(), "r");
if (server.hasArg("download")) dataType = "application/octet-stream";
if (server.streamFile(dataFile, dataType) != dataFile.size()) {
}
dataFile.close();
return true;
}
int ReadADC(){
//***************************Thermistor Read Function Begins***************************
// Complete project details at https://randomnerdtutorials.com
int samples[5];
uint8_t i;
float average;
// take N samples in a row, with a slight delay
for (i=0; i< 5; i++) {
samples[i] = analogRead(A0);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< 5; i++) {
average += samples[i];
}
average /= 5;
// convert the value to resistance
//average = 1023 / average - 1;
// average = 100000 / average; //SERIESRESISTOR 100000
float steinhart;
float Tot_Current;
average = (average/1023)*3.2;
Tot_Current = (3.26 - average)/100;
Tot_Current = Tot_Current - (average/320);
steinhart = average/Tot_Current;
steinhart = steinhart / 100; // (R/Ro),THERMISTORNOMINAL 100000
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= 4100; // 1/B * ln(R/Ro), BCOEFFICIENT 4250
steinhart += 1.0 / (25 + 273.15); // + (1/To), TEMPERATURENOMINAL 25
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to degC
a = steinhart;
return a;
}
The hardware uses a 100K NTC resistor for sensing temperature of water in the electric geyser. The function ReadADC() manages reading and converting the 100K NTC resistor value to Temperature.
Additionally the javascript, css and jquery files are to be placed into a separate folder named <data>, and loaded into the 8266's SPIFF. A zipped version (C4u.rar) of the sketch and associated folder is attached.
Please try it out and comment if you find it useful.
Azhaque