#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2591.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <LiquidCrystal.h>
#include <WiFi.h>
#include <ThingSpeak.h> // Include ThingSpeak Library
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Adafruit IO settings
#define IO_USERNAME ""
#define IO_KEY ""
#define IO_SERVER "io.adafruit.com"
#define IO_PORT 1883
// Adafruit IO MQTT client
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, IO_SERVER, IO_PORT, IO_USERNAME, IO_KEY);
// Define LCD pins
#define LCD_RS 4
#define LCD_EN 5
#define LCD_D4 18
#define LCD_D5 19
#define LCD_D6 21
#define LCD_D7 22
// Define Adafruit IO feeds
Adafruit_MQTT_Publish lightIntensity_pub = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/light");
Adafruit_MQTT_Subscribe switch_subscription = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/switch");
// Define LED and photoresistor pins
#define LED_PIN 12
#define LDR_PIN 34
// Initialize LCD
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
// ThingSpeak settings
const unsigned long channelID = ;
const char *readAPIKey = "";
// Function to connect to MQTT server
void MQTT_connect() {
int8_t ret;
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to Adafruit IO: ");
while ((ret = mqtt.connect()) != 0) {
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying connection...");
mqtt.disconnect();
delay(5000);
}
Serial.println("Connected to Adafruit IO!");
// Subscribe to the switch control topic
mqtt.subscribe(&switch_subscription);
}
void setup() {
Serial.begin(115200);
// Initialize LCD
lcd.begin(16, 2); // Adjust these values according to your LCD's dimensions
lcd.clear();
lcd.print("Adafruit IO");
lcd.setCursor(0, 1);
lcd.print("Connecting...");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Connect to Adafruit IO
MQTT_connect();
// Set LED pin as output
pinMode(LED_PIN, OUTPUT);
// Initialize ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Read analog value from photoresistor pin
int sensorValue = analogRead(LDR_PIN);
// Convert analog value to light intensity
uint16_t lightIntensity = map(sensorValue, 0, 1000, 0, 100); // Adjust the mapping range as needed
Serial.print("Light Intensity: ");
Serial.println(lightIntensity);
// Publish light intensity to Adafruit IO
if (mqtt.connected()) {
if (!lightIntensity_pub.publish((double)lightIntensity)) {
Serial.println("Failed to publish light intensity to Adafruit IO");
}
} else {
Serial.println("Disconnected from Adafruit IO. Reconnecting...");
MQTT_connect();
}
// Read light intensity from ThingSpeak
int thingSpeakIntensity = ThingSpeak.readLongField(channelID, 1, readAPIKey);
// Compare light intensity from ThingSpeak with current light intensity
if (thingSpeakIntensity == lightIntensity) {
Serial.println("ThingSpeak and LCD match!");
} else {
Serial.println("ThingSpeak and LCD do not match!");
}
// Check for incoming switch control message
mqtt.processPackets(1000); // Allow MQTT client to process incoming messages
// Control LED based on light intensity and switch state
String switchState = (char*)switch_subscription.lastread; // Convert to String
if (lightIntensity < 250 || switchState.toInt() == 1) {
digitalWrite(LED_PIN, HIGH); // Turn on LED
} else {
digitalWrite(LED_PIN, LOW); // Turn off LED
}
// Clear LCD and print light intensity
lcd.clear();
lcd.print("Light Intensity:");
lcd.setCursor(0, 1);
lcd.print(lightIntensity);
delay(1000);
}