#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
const char* ssid="Wokwi-GUEST";
const char* pass="";
const char* broker="test.mosquitto.org";
#define DHTPIN 4
#define TRIG_PIN 16
#define ECHO_PIN 17
#define PIR_PIN 32
#define BUZZ_PIN 18
#define LED_R 27
#define LED_G 25
#define LED_B 26
WiFiClient espClient;
PubSubClient client(espClient);
DHTesp dht;
void setColor(bool r,bool g,bool b){
digitalWrite(LED_R,r);
digitalWrite(LED_G,g);
digitalWrite(LED_B,b);
}
void callback(char* t,byte* p,unsigned int l){
String s;
for(uint8_t i=0;i<l;i++)s+=char(p[i]);
if(String(t)=="esp32/led"){
if(s=="red") setColor(1,0,0);
if(s=="green") setColor(0,1,0);
if(s=="blue") setColor(0,0,1);
if(s=="off") setColor(0,0,0);
}
}
void wifiConnect(){
WiFi.begin(ssid,pass);
while(WiFi.status()!=WL_CONNECTED)delay(500);
}
void mqttConnect(){
while(!client.connected()){
String id="esp32-"+String(random(0xffff),HEX);
client.connect(id.c_str());
}
client.subscribe("esp32/led");
}
void setup(){
Serial.begin(115200);
pinMode(TRIG_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT);
pinMode(PIR_PIN,INPUT);
pinMode(BUZZ_PIN,OUTPUT);
pinMode(LED_R,OUTPUT);
pinMode(LED_G,OUTPUT);
pinMode(LED_B,OUTPUT);
dht.setup(DHTPIN,DHTesp::DHT22);
wifiConnect();
client.setServer(broker,1883);
client.setCallback(callback);
}
void loop(){
if(!client.connected())mqttConnect();
client.loop();
TempAndHumidity d=dht.getTempAndHumidity();
if(!isnan(d.temperature)&&!isnan(d.humidity)){
char t[8],h[8];
dtostrf(d.temperature,6,2,t);
dtostrf(d.humidity,6,2,h);
client.publish("esp32/temp",t);
client.publish("esp32/hum",h);
if(d.temperature<28&&d.humidity<60) setColor(0,1,0);
else if(d.temperature<28) setColor(0,0,1);
else setColor(1,0,0);
}
digitalWrite(TRIG_PIN,LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN,LOW);
long dur=pulseIn(ECHO_PIN,HIGH,30000);
float dist=dur*0.034/2.0;
if(dur>0){
char ds[10];
dtostrf(dist,6,2,ds);
client.publish("esp32/dist",ds);
if(dist<20)tone(BUZZ_PIN,1000,200);
}
if(digitalRead(PIR_PIN)==HIGH){
client.publish("esp32/motion","1");
tone(BUZZ_PIN,1500,300);
}else{
client.publish("esp32/motion","0");
}
delay(1000);
}