#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include "esp_wifi.h"
#define DHTPIN 12
#define DHTTYPE DHT22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define GREEN_LED 14
#define RED_LED 27
#define BLUE_LED 26
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "mqtt.thingsboard.cloud";
const char* token = "iZVvopYViHRDeVhnb6RA";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
uint8_t newMACAddress[] = {0x4B, 0xA3, 0x7D, 0x5E, 0xB6, 0x8C};
void setup() {
Serial.begin(115200);
dht.begin();
// Inisialisasi pin LED
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BLUE_LED, LOW);
// Inisialisasi OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Initializing...");
display.display();
// Hubungkan ke WiFi
Serial.print("Connecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Nyalakan LED biru jika koneksi WiFi berhasil
digitalWrite(BLUE_LED, HIGH);
// Set server MQTT
client.setServer(mqtt_server, 1883);
// Ganti alamat MAC ESP32
Serial.print("[OLD] ESP32 Board MAC Address: ");
Serial.println(WiFi.macAddress());
if (esp_wifi_set_mac(WIFI_IF_STA, newMACAddress) == ESP_OK) {
Serial.print("[NEW] ESP32 Board MAC Address: ");
Serial.println(WiFi.macAddress());
} else {
Serial.println("Failed to set new MAC address");
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client", token, NULL)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
digitalWrite(BLUE_LED, HIGH);
}
void checkConditions(float temperature) {
if (temperature >= 26 && temperature <= 34) {
digitalWrite(GREEN_LED, true);
digitalWrite(RED_LED, false);
digitalWrite(BLUE_LED, false);
} else if (temperature > 34) {
digitalWrite(GREEN_LED, false);
digitalWrite(RED_LED, true);
digitalWrite(BLUE_LED, false);
} else {
digitalWrite(GREEN_LED, false);
digitalWrite(RED_LED, false);
digitalWrite(BLUE_LED, true);
}
}
void loop() {
if (!client.connected()) {
digitalWrite(BLUE_LED, LOW);
reconnect();
}
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
checkConditions(t);
String payload = "{\"temperature\":";
payload += String(t);
payload += ",\"humidity\":";
payload += String(h);
payload += "}";
if (client.publish("v1/devices/me/telemetry", payload.c_str())) {
Serial.println("Data sent successfully");
} else {
Serial.println("Failed to send data");
}
display.clearDisplay();
display.setCursor(0, 0);
display.print("Temp: ");
display.print(t);
display.print(" °C");
display.setCursor(0, 10);
display.print("Humidity: ");
display.print(h);
display.print(" %");
display.display();
delay(2000);
}