#include <DHTesp.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <ThingerESP32.h>
#include <LiquidCrystal_I2C.h>
#define THINGER_SERIAL_DEBUG
#define _DISABLE_TLS_
#define SECRET_SSID "Wokwi-GUEST"
#define SECRET_PASS ""
#define ECHO_PIN 18
#define TRIG_PIN 5
//#define MAX_DISTANCE_CM 100
#define SECRET_CH_ID 2022354
#define SECRET_WRITE_API_KEY "DUBK8JU33B16DCAJ"
#define IOT_SERVER "esp32"
#define IOT_USER "JiaYing"
#define IOT_PASS "dH$trS9ngIQcnG@4"
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
int keyIndex = 0;
int inputPin = 13;
int pirState = LOW; // assuming initial no motion detected
int val = 0;
#define ledPin1 19
#define ledPin2 4
#define ledPin3 2
#define ledPin4 14
#define ledPin5 12
ThingerESP32 thing(IOT_USER, IOT_SERVER, IOT_PASS);
WiFiClient client;
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_API_KEY;
const int DHT_PIN = 15;
int PIR = 0;
DHTesp dhtSensor;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
void setup(){
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(inputPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
thing.add_wifi(SECRET_SSID, SECRET_PASS);
thing["System 1"] << [](pson& in){
if(in.is_empty()){
in = (bool) digitalRead(ledPin1);
} else{
digitalWrite(ledPin1, in? HIGH:LOW);
}
};
thing["System 2"] << [](pson& in){
if(in.is_empty()){
in =(bool) digitalRead(ledPin2);
} else{
digitalWrite(ledPin2, in? HIGH:LOW);
}
};
while(!Serial){
;
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi... ");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("ConnectedFactory");
}
float readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void loop()
{
thing.handle();
if(WiFi.status()!=WL_CONNECTED)
{
Serial.print("Attempting to connect to SSID:");
Serial.println(SECRET_SSID);
while(WiFi.status()!= WL_CONNECTED)
{
WiFi.begin(ssid,pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
float distance = readDistance();
bool isNearby = distance < 150;
digitalWrite(LED_BUILTIN, isNearby);
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: "+ String(data.temperature, 1) + "°C");
Serial.println("Distance: " + String(readDistance(), 2) + "cm");
val = digitalRead(inputPin);
if (val == HIGH) {
digitalWrite(ledPin5, HIGH);
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
LCD.setCursor(0, 0);
LCD.println("Motion detected!");
PIR = 1;
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
digitalWrite(ledPin5, LOW); // turn LED OFF
if (pirState == HIGH) {
// we have just turned off
Serial.println("Under safe condition");
LCD.setCursor(0, 0);
LCD.println("Safe condition");
PIR = 0;
// We only want to print on the output change, not state
pirState = LOW;
}
}
if(readDistance()>=150 && readDistance()<=160){
digitalWrite(ledPin4, LOW);
Serial.println("Object is in range");
}
else
{
digitalWrite(ledPin4, HIGH);
Serial.println("Object is out of range");
}
if(data.temperature>=20 && data.temperature<=25){
digitalWrite(ledPin3, LOW);
Serial.println("Normal Temperature");
LCD.setCursor(0, 1);
LCD.println("Temp: Normal");
}
else
{
if(data.temperature<20){
digitalWrite(ledPin3, HIGH);
Serial.println("Temperature is too low");
LCD.setCursor(0, 1);
LCD.println("Temp: Low");
}
if(data.temperature>25){
digitalWrite(ledPin3, HIGH);
Serial.println("Temperature is high");
LCD.setCursor(0, 1);
LCD.println("Temp: High");
}
}
//LCD.setCursor(1, 1);
//LCD.println("Temp:");
//LCD.print(data.temperature);
//LCD.print("C");
Serial.println("----------");
ThingSpeak.setField(1, PIR);
ThingSpeak.setField(2, data.temperature);
ThingSpeak.setField(3, readDistance());
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));
}
delay(15000);
}