#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <WiFi.h>
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int DHT_PIN = 15;
DHTesp dhtSensor;
// Pin potensiometer
const int POT_PIN_1 = 12;
const int POT_PIN_2 = 14;
// LED indikator
const byte GREEN_LED = 19;
const byte YELLOW_LED = 18;
const byte BLUE_LED = 17;
const byte RED_LED = 16;
// WiFi & Adafruit IO
#define WLAN_SSID "Your_SSID"
#define WLAN_PASS "Your_PASSWORD"
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "Your_AIO_Username"
#define AIO_KEY "Your_AIO_Key"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Feed Adafruit IO
Adafruit_MQTT_Publish temperatureFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish ppmFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/ppm");
Adafruit_MQTT_Publish heartRateFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/heartrate");
Adafruit_MQTT_Subscribe temperatureSlider = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/temp_slider");
Adafruit_MQTT_Subscribe humiditySlider = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/humidity_slider");
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
// WiFi setup
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
mqtt.subscribe(&temperatureSlider);
mqtt.subscribe(&humiditySlider);
}
void loop() {
// MQTT connection
if (mqtt.connected() == false) {
reconnectMQTT();
}
mqtt.processPackets(100);
// Membaca sensor
float temperature = dhtSensor.getTemperature();
float humidity = dhtSensor.getHumidity();
int ppmValue = analogRead(POT_PIN_1);
int heartRate = analogRead(POT_PIN_2);
// Menampilkan data pada LCD
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(temperature); lcd.print(" C");
lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(humidity); lcd.print(" %");
lcd.setCursor(0, 2); lcd.print("PPM: "); lcd.print(ppmValue);
lcd.setCursor(0, 3); lcd.print("HR: "); lcd.print(heartRate);
// Mengirim data ke Adafruit IO
temperatureFeed.publish(temperature);
humidityFeed.publish(humidity);
ppmFeed.publish(ppmValue);
heartRateFeed.publish(heartRate);
// Membaca slider dari Adafruit IO
int tempSliderValue = readSlider(&temperatureSlider);
int humiditySliderValue = readSlider(&humiditySlider);
// Logika kontrol LED
// Suhu
digitalWrite(GREEN_LED, (temperature < tempSliderValue) ? HIGH : LOW);
// Kelembaban
digitalWrite(BLUE_LED, (humidity > humiditySliderValue) ? HIGH : LOW);
// Kualitas udara (PPM)
digitalWrite(YELLOW_LED, (ppmValue > 299) ? HIGH : LOW);
// Heart rate
digitalWrite(RED_LED, (heartRate < 120 || heartRate > 160) ? HIGH : LOW);
delay(1000);
}
// Fungsi membaca slider
int readSlider(Adafruit_MQTT_Subscribe *feed) {
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == feed) {
return atoi((char *)feed->lastread);
}
}
return 0; // Default value jika slider tidak terbaca
}
// Reconnect MQTT
void reconnectMQTT() {
while (mqtt.connected() == false) {
Serial.print("Connecting to MQTT... ");
if (mqtt.connect()) {
Serial.println("Connected!");
} else {
Serial.print("Failed, rc=");
Serial.print(mqtt.connectErrorString(mqtt.connectError()));
Serial.println(" Retry in 5 seconds...");
delay(5000);
}
}
}