#include #include #include #include /* SETUP INSTRUCTIONS 1) Change WiFi SSID and Password: const char* ssid = "YourSSID"; const char* password = "YourPassword"; 2) Polling Interval (milliseconds): const unsigned long READ_INTERVAL = 10000; // 10 seconds 3) Number of Readings (History Length): const int HISTORY_LENGTH = 360; // 1 hour at 10-second intervals */ const char* ssid = "YourSSID"; const char* password = "YourPassword"; const int oneWireBus = 4; const int MAX_SENSORS = 8; const int HISTORY_LENGTH = 360; const unsigned long READ_INTERVAL = 10000; DeviceAddress sensorAddresses[MAX_SENSORS]; float tempHistory[MAX_SENSORS][HISTORY_LENGTH]; int historyIndex = 0; int numberOfDevices = 0; unsigned long lastReadTime = 0; OneWire oneWire(oneWireBus); DallasTemperature sensors(&oneWire); ESP8266WebServer server(80); String getAddressString(DeviceAddress deviceAddress); void handleRoot(); void handleSensorList(); void handleTemperature(); void handleHistory(); void updateHistory(); const char MAIN_page[] PROGMEM = R"=====( Arduino Temperature Control Library - Sensor Data Graph

Arduino Temperature Control Library - Sensor Data

Dashboard
API Docs
Setup
Loading sensor data...

© 2025 Miles Burton. All Rights Reserved.

Licensed under the MIT License .

)====="; void setup() { Serial.begin(115200); sensors.begin(); for (int i = 0; i < MAX_SENSORS; i++) { for (int j = 0; j < HISTORY_LENGTH; j++) { tempHistory[i][j] = 0; } } numberOfDevices = sensors.getDeviceCount(); if (numberOfDevices > MAX_SENSORS) { numberOfDevices = MAX_SENSORS; } for (int i = 0; i < numberOfDevices; i++) { sensors.getAddress(sensorAddresses[i], i); } sensors.setResolution(12); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } server.on("/", HTTP_GET, handleRoot); server.on("/temperature", HTTP_GET, handleTemperature); server.on("/sensors", HTTP_GET, handleSensorList); server.on("/history", HTTP_GET, handleHistory); server.begin(); } void loop() { server.handleClient(); unsigned long t = millis(); if (t - lastReadTime >= READ_INTERVAL) { updateHistory(); lastReadTime = t; } } void updateHistory() { sensors.requestTemperatures(); for (int i = 0; i < numberOfDevices; i++) { float tempC = sensors.getTempC(sensorAddresses[i]); tempHistory[i][historyIndex] = tempC; } historyIndex = (historyIndex + 1) % HISTORY_LENGTH; } void handleRoot() { server.send(200, "text/html", MAIN_page); } void handleSensorList() { String json = "{\"sensors\":["; for (int i = 0; i < numberOfDevices; i++) { if (i > 0) json += ","; json += "{\"id\":" + String(i) + ",\"address\":\"" + getAddressString(sensorAddresses[i]) + "\"}"; } json += "]}"; server.send(200, "application/json", json); } void handleTemperature() { sensors.requestTemperatures(); String json = "{\"sensors\":["; for (int i = 0; i < numberOfDevices; i++) { if (i > 0) json += ","; float c = sensors.getTempC(sensorAddresses[i]); float f = sensors.toFahrenheit(c); json += "{\"id\":" + String(i) + ",\"address\":\"" + getAddressString(sensorAddresses[i]) + "\","; json += "\"celsius\":" + String(c) + ",\"fahrenheit\":" + String(f) + "}"; } json += "]}"; server.send(200, "application/json", json); } void handleHistory() { String json = "{\"interval_ms\":" + String(READ_INTERVAL) + ",\"sensors\":["; for (int i = 0; i < numberOfDevices; i++) { if (i > 0) json += ","; json += "{\"id\":" + String(i) + ",\"address\":\"" + getAddressString(sensorAddresses[i]) + "\",\"history\":["; for (int j = 0; j < HISTORY_LENGTH; j++) { int idx = (historyIndex - j + HISTORY_LENGTH) % HISTORY_LENGTH; if (j > 0) json += ","; json += String(tempHistory[i][idx]); } json += "]}"; } json += "]}"; server.send(200, "application/json", json); } String getAddressString(DeviceAddress deviceAddress) { String addr; for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) addr += "0"; addr += String(deviceAddress[i], HEX); } return addr; }