// Smart Home Controlling System
// Thingspeak Server dB Public View: https://thingspeak.com/channels/2052162
#include <DHT.h>
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <WiFi.h>
#include "ThingSpeak.h" // always include thingspeak header file after other header files and custom macros
char ssid[] = "Wokwi-GUEST"; // your network SSID (name)
char pass[] = ""; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
WiFiClient client;
// Weather station channel details
unsigned long weatherStationChannelNumber = 2356771;
unsigned long myChannelNumber = 2356771;
const char * myWriteAPIKey = "7K7720XJPGTNIXZT";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
int statusCode = 0;
int field[8] = {1,2,3,4};
int ch1 = 0;
int ch2 = 0;
int ch3 = 0;
int ch4 = 0;
#define ch1Pin 23
#define ch2Pin 22
#define ch3Pin 21
#define ch4Pin 19
float Prevtemp = 0;
void setup() {
Serial.begin(115200); // Initialize serial
// Pin Mode declaration
pinMode(ch1Pin, OUTPUT);
pinMode(ch2Pin, OUTPUT);
pinMode(ch3Pin, OUTPUT);
pinMode(ch4Pin, OUTPUT);
dht.begin();
while (!Serial) { ;} // wait for serial port to connect. Needed for Leonardo native USB port only
// WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
// Connect or reconnect to WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect to SSID: ");
Serial.println("Wokwi");
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using open or WEP network
Serial.print(".");
delay(5000);
}
Serial.println("WiFi Connected");
delay(1000);
}
Serial.println("Welcome at Smart Home");
delay(1000);
}
void loop() {
// use ThingSpeak.readMultipleFields(channelNumber, readAPIKey) for private channels
statusCode = ThingSpeak.readMultipleFields(weatherStationChannelNumber);
if(statusCode == 200)
{
// Fetch the stored data
ch1 = ThingSpeak.getFieldAsInt(field[0]); // Field 1
ch2 = ThingSpeak.getFieldAsInt(field[1]); // Field 2
ch3 = ThingSpeak.getFieldAsInt(field[2]); // Field 3
ch4 = ThingSpeak.getFieldAsInt(field[3]); // Field 4
}
else{Serial.println("Problem reading channel. HTTP error code " + String(statusCode));}
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
Serial.print("weather ");
if (isnan(temp) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String message = "temp: " + String(temp) + " humidity: " + String(humidity);
Serial.println(message);
delay(500);
if (temp >= 35){
ch1 = 1;
}
else{
ch1 = 0;
}
if (humidity >= 35){
ch1 = 0;
ch2 = 1;
}
else{
ch2 = 0;
}
if (temp >= 35 && humidity >= 35){
ch1 = 0;
ch2 = 0;
ch3 = 1;
}
else{
ch3 = 0;
}
if (temp < 20 && humidity < 20){
ch1 = 0;
ch2 = 0;
ch3 = 0;
ch4 = 1;
}
else{
ch4 = 0;
}
Serial.println("Ch1: " + String(ch1));
Serial.println("Ch2: " + String(ch2));
Serial.println("Ch3: " + String(ch3));
Serial.println("Ch4: " + String(ch4));
// Hardware Control
if (ch1 >= 1){digitalWrite(ch1Pin, HIGH);}
if (ch1 == 0){digitalWrite(ch1Pin, LOW);}
if (ch2 >= 1){digitalWrite(ch2Pin, HIGH);}
if (ch2 == 0){digitalWrite(ch2Pin, LOW);}
if (ch3 >= 1){digitalWrite(ch3Pin, HIGH);}
if (ch3 == 0){digitalWrite(ch3Pin, LOW);}
if (ch4 >= 1){digitalWrite(ch4Pin, HIGH);}
if (ch4 == 0){digitalWrite(ch4Pin, LOW);}
if (temp != Prevtemp){
Prevtemp = temp;
// Serial.println(temp);
// Serial.println(Prevtemp);
// upload data:
ThingSpeak.setField(1, ch1);
ThingSpeak.setField(2, ch2);
ThingSpeak.setField(3, ch3);
ThingSpeak.setField(4, ch4);
ThingSpeak.setField(5, temp);
ThingSpeak.setField(6, humidity);
// Write to ThingSpeak.
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
}
Serial.println();
delay(6000); // no need to fetch too often
}
// void hivemq(){
// d = dht.DHT22(Pin(12, Pin.IN))
// # connect wifi
// wifi.connect_ap()
// # Connect MQTT Broker
// # Use MD5 to encrypt the name of the topic to identify on MQTT
// client_id = "1fcebab59ad2c79875d32d7702a5234c"
// server = "broker.hivemq.com"
// client = MQTTClient(client_id, server)
// client.connect()
// }