රිජිෆෝම් පෙට්ටියකට bulb එකක් දැම්මා. එ්ක on off වෙවී කැමති temperature එකක දිගටම තියෙන්න ගැජට් එකක් හැදුවා. 
ප්රධාන හේතුව කෙසෙල් ඉදවීම. නුවරඑළියෙ කෙහෙල් ඉදෙන්ඩ කල් යනවනෙ. මේකට දාල තිබ්බාම කොළඹ තියෙනවා වගේ තමයි. අවශ්ය Temperature එක phone එකෙන්ම set කරන්න පුළුවන්.
Gemini 2.5 pro තමයි දෙයියා.
ChatGPT ට දුන්නම පයියක් කොරා. තව ඩිංගෙන් ගේත් එක්ක ගිනි ගන්නවා. 

පාවිච්චි කරේ,
1. ESP8266 Wemos D1 mini - Rs. 690 යි.
2. DHT22 Module - Rs. 340 යි.
3. ESP Relay Module - Rs. 390 යි.
4. වයර්, හෝල්ඩරයක්, DC දෙන්න phone charger එකක්, 40W සූත්රිකා බල්බ් එකක් etc.
ප්රධාන හේතුව කෙසෙල් ඉදවීම. නුවරඑළියෙ කෙහෙල් ඉදෙන්ඩ කල් යනවනෙ. මේකට දාල තිබ්බාම කොළඹ තියෙනවා වගේ තමයි. අවශ්ය Temperature එක phone එකෙන්ම set කරන්න පුළුවන්.
Gemini 2.5 pro තමයි දෙයියා.
පාවිච්චි කරේ,
1. ESP8266 Wemos D1 mini - Rs. 690 යි.
2. DHT22 Module - Rs. 340 යි.
3. ESP Relay Module - Rs. 390 යි.
4. වයර්, හෝල්ඩරයක්, DC දෙන්න phone charger එකක්, 40W සූත්රිකා බල්බ් එකක් etc.
C++:
#include <ESP8266WiFi.h>
#include <DHT.h>
// --- Your Settings ---
const char* ssid = "Indrajith WiFi";
const char* password = "12345qwert";
// --- Hardware Pins ---
#define DHT_DATA_PIN 5 // GPIO5 (D1) for DHT22 Data
#define DHT_POWER_PIN 13 // GPIO13 (D7) to power the DHT22
#define RELAY_PIN 14 // GPIO14 (D5) for the relay
#define DHTTYPE DHT22
// --- Controller Settings ---
float targetTemp = 36.0;
float hysteresis = 0.5;
// --- SAFETY FEATURES ---
const unsigned long MAX_FROZEN_DURATION = 30000; // 30 seconds for frozen value check
const unsigned long MAX_HEATER_ON_TIME = 90000; // 90 seconds max heater on time
// --- Global Variables ---
DHT dht(DHT_DATA_PIN, DHTTYPE);
WiFiServer server(80);
float temperature = NAN;
float humidity = NAN;
bool relayState = true; // true = OFF, false = ON
String mode = "auto"; // "auto", "deadeye", "on", "off", "FAILSAFE"
String failsafeReason = "";
// Timers and state variables
unsigned long lastReadTime = 0;
unsigned long heaterOnTimestamp = 0;
// Variables for frozen sensor detection
unsigned long lastValueChangeTime = 0;
float lastStableTemp = NAN;
float lastStableHumidity = NAN;
// Variables for deadeye mode
unsigned long deadeyeTimerStart = 0;
bool deadeyeIsOn = false;
// --- Function Prototypes ---
void resetDHT();
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Start with relay OFF
relayState = true;
pinMode(DHT_POWER_PIN, OUTPUT);
digitalWrite(DHT_POWER_PIN, HIGH); // Power ON the DHT sensor
Serial.begin(115200);
delay(100);
dht.begin();
delay(2000); // Wait for DHT to stabilize after power on
// Initialize timers
lastValueChangeTime = millis();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
server.begin();
}
void loop() {
// =================================================================
// STEP 1: SUPREME SAFETY CHECKS
// =================================================================
// This runs regardless of mode, except when already in FAILSAFE
if (mode != "FAILSAFE") {
// Failsafe 1: Heater has been on continuously for too long.
if (!relayState && (millis() - heaterOnTimestamp > MAX_HEATER_ON_TIME)) {
mode = "FAILSAFE";
failsafeReason = "Max heater-on time exceeded (" + String(MAX_HEATER_ON_TIME / 1000) + "s).";
}
}
// =================================================================
// STEP 2: SENSOR READING & RECOVERY
// =================================================================
if (millis() - lastReadTime > 2000) {
lastReadTime = millis();
bool readingSuccess = false;
// --- First read attempt ---
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Sensor read failed. Resetting sensor...");
resetDHT();
// --- Second read attempt after reset ---
t = dht.readTemperature();
h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Sensor still not responding after reset. Entering Deadeye mode.");
if (mode == "auto") {
mode = "deadeye";
deadeyeTimerStart = millis(); // Start the deadeye cycle timer
deadeyeIsOn = false; // Start in the OFF part of the cycle
}
} else {
readingSuccess = true; // Success after reset
}
} else {
readingSuccess = true; // Success on first try
}
if (readingSuccess) {
if (mode == "deadeye") {
Serial.println("Sensor recovered. Switching back to auto mode.");
mode = "auto"; // If sensor recovers, go back to auto
}
temperature = t;
humidity = h;
// --- Frozen value check ---
if (abs(t - lastStableTemp) > 0.01 || abs(h - lastStableHumidity) > 0.01) {
lastStableTemp = t;
lastStableHumidity = h;
lastValueChangeTime = millis();
} else {
if (millis() - lastValueChangeTime > MAX_FROZEN_DURATION) {
Serial.println("Sensor values are frozen. Resetting...");
resetDHT();
lastValueChangeTime = millis(); // Reset timer after reset attempt
}
}
}
}
Last edited: