#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
#define LDRR 34
#define LDRL 32
#define MOTOR 2
WiFiClient espClient;
PubSubClient mqttClient(espClient);
WiFiUDP ntpUDP;
Servo motor;
char lightAr[6];
char nameLDR[2];
float minAngle=30.0;
float controlFac=0.75;
float lightIntensity ;
float D ;
void setup() {
Serial.begin(115200);
setupWiFi();
setupMqtt();
pinMode(LDRR, INPUT);
pinMode(LDRL, INPUT);
motor.attach(MOTOR, 500, 2400);
}
void loop() {
if(!mqttClient.connected()){
connectToBroker();
}
mqttClient.loop();
UpdateLightIn();
Serial.print(nameLDR);
Serial.print(": ");
Serial.println(lightAr);
AdjustServoMotor(lightIntensity);
mqttClient.publish("ENTC-LIGHT", lightAr);
mqttClient.publish("LDR-NAME", nameLDR);
delay(2000);
}
void setupWiFi(){
Serial.println();
Serial.print("Connecting to");
Serial.println("Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFI connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
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-515661532")){
Serial.println("connected");
//Subscribe
mqttClient.subscribe("OPTION-SELECT-MIN-ANG");
mqttClient.subscribe("OPTION-SELECT-CONT-FAC");
}
else{
Serial.print("Faild ");
Serial.print(mqttClient.state());
delay(5000);
}
}
}
void UpdateLightIn(){
float ldrRdata = analogRead(LDRR);
float ldrLdata = analogRead(LDRL);
if (ldrRdata > ldrLdata){
lightIntensity = (ldrRdata - 32.0)/(4063.0-32.0);
String(lightIntensity,2).toCharArray(lightAr,6);
String("R").toCharArray(nameLDR,2);
D = 0.5;
}
else {
lightIntensity = (ldrLdata - 32.0)/(4063.0-32.0);
String(lightIntensity,2).toCharArray(lightAr,6);
String("L").toCharArray(nameLDR,2);
D= 1.5;
}
}
void AdjustServoMotor(float lightInt){
float angle = (minAngle*D) +(180.0-minAngle)*lightInt*controlFac;
float rotatAngle;
if (angle < 180.0){
rotatAngle = angle;
}
else{
rotatAngle = 180.0;
}
Serial.print("D");
Serial.println(String(D));
Serial.print("Intensity");
Serial.println(String(lightIntensity));
Serial.print("controlFac");
Serial.println(String(controlFac));
Serial.print("minAngle");
Serial.println(String(minAngle));
Serial.println(String(rotatAngle));
motor.write(rotatAngle);
delay(500);
}
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,"OPTION-SELECT-MIN-ANG")==0){
float minAngOption = atof(payloadCharAr);
minAngle = minAngOption;
}
Serial.println("factor changed");
if (strcmp(topic,"OPTION-SELECT-CONT-FAC")==0){
float conFacOption = atof(payloadCharAr);
Serial.print("jdafjd: ");
Serial.println(String(conFacOption));
controlFac = conFacOption;
Serial.println("AngleChanged");
}
}