#include <WiFi.h>
#include <MQTT.h>
#include <DHT.h>
#include "Adafruit_SSD1306.h"
#include "Adafruit_GFX.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
#define DHTPIN 21
#define DHTTYPE DHT22
#define LED_BIRU 15
#define LED_KUNING 16
#define LED_MERAH 17
#define LED_HIJAU 18
#define PWM_CHANNEL 0
#define PWM_FREQ 5000
#define PWM_RESOLUTION 8 // 8-bit: nilai 0 - 255
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
String statusSuhu;
WiFiClient net;
MQTTClient client;
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastMillis = 0;
void connect() {
Serial.print("Checking WiFi...");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.print("\nConnecting to MQTT...");
while (!client.connect("wokwi-client", "aldiiot22", "fPW8abRO87P5tTVn")) {
Serial.print(".");
delay(1000);
}
Serial.println("\nConnected to MQTT!");
client.subscribe("/perintah");
}
void messageReceived(String &topic, String &payload) {
Serial.println("Incoming: " + topic + " - " + payload);
digitalWrite(LED_HIJAU, HIGH);
delay(1000);
digitalWrite(LED_HIJAU, LOW);
}
void nyalakanLED(float suhu, float kelembaban) {
digitalWrite(LED_BIRU, LOW);
digitalWrite(LED_KUNING, LOW);
// Suhu <= 20 dianggap sangat dingin -> LED_MERAH terang
// Suhu >= 40 dianggap sangat panas -> LED_MERAH gelap
if (suhu <= 20) {
digitalWrite(LED_BIRU, HIGH);
statusSuhu = " (Rendah)";
} else if (suhu <= 35) {
digitalWrite(LED_KUNING, HIGH);
statusSuhu = " (Sedang)";
} else {
statusSuhu = " (Tinggi)";
}
// Atur kecerahan LED_MERAH berdasarkan suhu
float brightness = 255 - (suhu / 40.0) * 255.0;
brightness = constrain(brightness, 0, 255);
ledcWrite(PWM_CHANNEL, (int)brightness);
refreshOled(String(suhu), statusSuhu, String(kelembaban));
}
void refreshOled(String suhu, String statusSuhu, String kelembaban) {
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 5);
oled.println("Suhu :");
oled.setCursor(0, 20);
oled.println(suhu + " C" + statusSuhu);
oled.setCursor(0, 35);
oled.println("Kelembaban :");
oled.setCursor(0, 50);
oled.println(kelembaban + " %");
oled.display();
}
void setup() {
ledcSetup(0, 5000, 8);
ledcAttachPin(17, 0);
Serial.begin(115200);
Wire.begin(19, 20);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
WiFi.begin(ssid, pass);
dht.begin();
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_BIRU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
// pinMode(LED_MERAH, OUTPUT);
// pinMode(LED_MERAH, OUTPUT); --> GANTI DENGAN:
client.begin("aldiiot22.cloud.shiftr.io", net);
client.onMessage(messageReceived);
connect();
}
void loop() {
client.loop();
delay(10);
if (!client.connected()) {
connect();
}
if (millis() - lastMillis > 2000) { // kirim suhu tiap 2 detik
lastMillis = millis();
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
if (!isnan(suhu) && !isnan(kelembaban)) {
nyalakanLED(suhu, kelembaban);
client.publish("aldi/iot/suhu", String(suhu));
} else {
Serial.println("Gagal membaca suhu dari sensor!");
}
}
}