#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ESP32Servo.h>
#include <ArduinoJson.h>
#define DHT_PIN 15
#define BUZZER 5
#define LDR1 35
#define LDR2 34
DHTesp dhtSensor;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
Servo motor;
char tempAr[6];
char ldrLArr[4];
char ldrRArr[4];
// char motorAr[6];
// char angleAr[6];
// char ctrlAr[6];
int t_off = 30;
float gamma_i = 0.75;
bool isScheduledON= false;
unsigned long scheduledOnTime;
void setup() {
Serial.begin(115200);
setupMqtt();
setupWiFi();
dhtSensor.setup(DHT_PIN,DHTesp::DHT22);
timeClient.begin();
timeClient.setTimeOffset(5.5*3600);
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER,LOW);
pinMode(LDR1, INPUT);
pinMode(LDR2, INPUT);
motor.attach(23);
// connectToBroker();
// String(minAngle, 2).toCharArray(angleAr, 6);
// String(controllingFac, 2).toCharArray(ctrlAr, 6);
// mqttClient.publish("MEDIBOX-SET-ANG", angleAr);
// mqttClient.publish("MEDIBOX-SET-FAC", ctrlAr);
}
void loop() {
if(!mqttClient.connected()){
connectToBroker();
}
mqttClient.loop();
updateTemperature();
Serial.println(tempAr);
mqttClient.publish("MBOX-TEMP",tempAr);
updateLightIntensity();
// Serial.print(ldrLArr);
// Serial.println(ldrRArr);
mqttClient.publish("MBOX-LIGHT-L_NI", ldrLArr);
delay(50);
mqttClient.publish("MBOX-LIGHT-R_NI", ldrRArr);
delay(100);
checkSchedule();
delay(1000);
}
void setupWiFi(){
Serial.println("");
Serial.println("Connecting to");
Serial.println("Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST","");
while(WiFi.status()!=WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address");
Serial.println(WiFi.localIP());
}
void updateTemperature(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String(data.temperature,2).toCharArray(tempAr,6);
mqttClient.publish("MBOX-TEMP", tempAr);
delay((1000));
}
void updateLightIntensity()
{
float lsv = analogRead(LDR1) * 1.00;
float rsv = analogRead(LDR2) * 1.00;
float lsv_cha = (float)(lsv - 4063.00) / (32.00 - 4063.00);
float rsv_cha = (float)(rsv - 4063.00) / (32.00 - 4063.00);
// Serial.println(String(lsv_cha)+" "+String(rsv_cha));
updateAngle(lsv_cha, rsv_cha);
String(lsv_cha).toCharArray(ldrLArr, 4);
String(rsv_cha).toCharArray(ldrRArr, 4);
}
void setupMqtt(){
mqttClient.setServer("test.mosquitto.org",1883);
mqttClient.setCallback(receiveCallback);
}
void connectToBroker(){
while(!mqttClient.connected()){
Serial.print("Attempting MQTT connection...");
if(mqttClient.connect("ESP32-4654564645645")){
Serial.println("connected");
mqttClient.subscribe("MBOX-ON-OFF_NI");
mqttClient.subscribe("MBOX-ADMIN-SCH-ON_NI");
mqttClient.subscribe("MBOX-SERVO-ADJUSTMENTS_MINA");
mqttClient.subscribe("MBOX-SERVO-ADJUSTMENTS_CF");
}else{
Serial.print("Failed");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void buzzerOn(bool on){
if(on){
tone(BUZZER,256);
}else{
noTone(BUZZER);
}
}
void receiveCallback(char* topic,byte* payload, unsigned int length){
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]");
char payloadCharAr[length];
for(int i=0;i<length;i++){
Serial.print((char)payload[i]);
payloadCharAr[i]=(char)payload[i];
}
Serial.println();
if (strcmp(topic, "MBOX-ON-OFF_NI") == 0) {
if (payloadCharAr[0] == '1') {
digitalWrite(15, HIGH);
} else {
digitalWrite(15, LOW);
}
} else if (strcmp(topic, "MBOX-ADMIN-SCH-ON_NI") == 0) {
if (payloadCharAr[0] == 'N') {
isScheduledON = false;
} else {
isScheduledON = true;
scheduledOnTime = atol(payloadCharAr);
}
} else if (strcmp(topic, "MBOX-SERVO-ADJUSTMENTS_MINA") == 0) {
t_off = String(payloadCharAr).toInt();
} else if (strcmp(topic, "MBOX-SERVO-ADJUSTMENTS_CF") == 0) {
gamma_i = String(payloadCharAr).toFloat();
}
}
unsigned long getTime(){
timeClient.update();
return timeClient.getEpochTime();
}
void checkSchedule(){
if(isScheduledON){
unsigned long currentTime =getTime();
if (currentTime>scheduledOnTime){
buzzerOn(true);
isScheduledON=false;
mqttClient.publish("MBOX-ON-OFF","1");
mqttClient.publish("MBOX-SCHEDULE-ON-OFF","0");
Serial.println("Scheduled ON");
}
}
}
void updateAngle(float lsv, float rsv) {
float max_I = lsv;
float D = 1.5;
if (rsv > max_I) {
max_I = rsv;
D = 0.5;
}
int theta = t_off * D + (180 - t_off) * max_I * gamma_i;
theta = min(theta, 180);
motor.write(theta);
}