#include <WiFi.h>
#include <PubSubClient.h>
// Define pin numbers
#define LDR_PIN 33
#define LED_PIN 25
// Delay
#define DELAY 2000
unsigned long prevMillis = 0;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
// MQTT settings
const String ID = "a9669d39-e0bf-47a8-916a-c74724e2cd8c";
const String BROKER = "test.mosquitto.org";
const String CLIENT_NAME = ID + "light_client";
const String CLIENT_TELEMETRY_TOPIC = ID + "/telemetry";
const String SERVER_COMMAND_TOPIC = ID + "/commands";
WiFiClient espClient;
PubSubClient client(espClient); // Setup MQTT client
void reconnectMQTTClient() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(CLIENT_NAME.c_str())) {
Serial.println("connected");
}
else {
Serial.print("Retrying in 5 seconds - failed, rc=");
Serial.println(client.state());
delay(5000);
}
}
client.subscribe(SERVER_COMMAND_TOPIC.c_str());
}
void clientCallback(char *topic, uint8_t *payload, unsigned int length) {
String response;
for (int i = 0; i < length; i++) {
response += (char)payload[i];
}
Serial.print("Message received: ");
Serial.println(response);
bool led_on = (response == "True");
if (led_on)
digitalWrite(LED_PIN, HIGH);
else
digitalWrite(LED_PIN, LOW);
}
void createMQTTClient() {
client.setServer(BROKER.c_str(), 1883);
reconnectMQTTClient();
client.setCallback(clientCallback);
}
void setup() {
Serial.begin(115200);
// Connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("\nConnected!");
// Create MQTT client
createMQTTClient();
// Set pin mode
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - prevMillis >= DELAY) {
prevMillis = currentMillis;
// Check MQTT connection
reconnectMQTTClient();
// Process any messages that are coming in on the topic
client.loop();
// Read LDR value
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue / 4096.0 * 3.3;
float resistance = (1/3.3) * 1e4 * voltage / (1 - voltage / 3.3);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
// Send data
String telemetry = String(lux, 2);
Serial.print("Sending telemetry ");
Serial.println(telemetry.c_str());
client.publish(CLIENT_TELEMETRY_TOPIC.c_str(), telemetry.c_str());
}
//delay(2000);
}