#define BLYNK_TEMPLATE_ID "TMPL6IidZBw6q"
#define BLYNK_TEMPLATE_NAME "DHT22 DS18B20"
#define BLYNK_AUTH_TOKEN "e9q7mhBZxwjFNeYFwEkSie1zwJZl7sHO"
// Konfigurasi ThingSpeak
#include "ThingSpeak.h"
#define THINGSPEAK_CHANNEL_ID 2810691 // Ganti dengan Channel ID Anda
#define THINGSPEAK_API_KEY "SFCD16AXBPHB3YJB" // Ganti dengan Write API Key Anda
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
// Pin Konfigurasi
#define DHTPIN 23
#define DHTTYPE DHT22
#define ONE_WIRE_BUS 4
#define RELAY_PIN 19
#define BUZZER_PIN 18
#define LED_PIN 17
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Virtual Pin Blynk
#define VPIN_DHT_TEMP V0
#define VPIN_DHT_HUM V1
#define VPIN_DS_TEMP V2
// Inisialisasi objek
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
WiFiClient client;
BlynkTimer timer;
unsigned long lastThingSpeakUpdate = 0;
const unsigned long thingSpeakDelay = 15000; // Delay 15 detik untuk ThingSpeak
// Fungsi untuk mengirim data ke ThingSpeak
void sendToThingSpeak(float dhtTemp, float dhtHum, float dsTemp) {
if (millis() - lastThingSpeakUpdate > thingSpeakDelay) {
Serial.println("\nMengirim data ke ThingSpeak...");
ThingSpeak.setField(1, dhtTemp);
ThingSpeak.setField(2, dhtHum);
ThingSpeak.setField(3, dsTemp);
int httpCode = ThingSpeak.writeFields(THINGSPEAK_CHANNEL_ID, THINGSPEAK_API_KEY);
if (httpCode == 200) {
Serial.println("✓ Data berhasil dikirim ke ThingSpeak");
} else {
Serial.println("❌ Gagal mengirim data ke ThingSpeak. Error: " + String(httpCode));
}
lastThingSpeakUpdate = millis();
}
}
// Fungsi untuk mengirim data ke Blynk dan ThingSpeak
void sendSensorData() {
Serial.println("\n-------- Membaca Sensor --------");
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.println("Membaca DHT22...");
if (isnan(h) || isnan(t)) {
Serial.println("❌ Gagal membaca DHT sensor!");
return;
} else {
Serial.print("✓ Suhu DHT22: ");
Serial.print(t);
Serial.print("°C, Kelembaban: ");
Serial.print(h);
Serial.println("%");
}
Serial.println("Membaca DS18B20...");
sensors.requestTemperatures();
float dsTemp = sensors.getTempCByIndex(0);
Serial.print("✓ Suhu DS18B20: ");
Serial.print(dsTemp);
Serial.println("°C");
// Kirim data ke Blynk
Serial.println("Mengirim data ke Blynk...");
Blynk.virtualWrite(VPIN_DHT_TEMP, t);
Blynk.virtualWrite(VPIN_DHT_HUM, h);
Blynk.virtualWrite(VPIN_DS_TEMP, dsTemp);
Serial.println("✓ Data terkirim ke Blynk");
// Kirim data ke ThingSpeak
sendToThingSpeak(t, h, dsTemp);
// Update OLED Display
Serial.println("Memperbarui OLED Display...");
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Monitoring System");
display.println("----------------");
display.print("DHT22: ");
display.print(t, 1);
display.println(" C");
display.print("Hum: ");
display.print(h, 1);
display.println(" %");
display.print("DS18B20: ");
display.print(dsTemp, 1);
display.println(" C");
display.display();
Serial.println("✓ OLED Display diperbarui");
// Kontrol otomatis berdasarkan suhu
Serial.print("Kontrol perangkat berdasarkan suhu: ");
Serial.println(t > 30 ? "AKTIF" : "NONAKTIF");
if (t > 30) {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
Serial.println("⚠️ Suhu tinggi! Relay, Buzzer, dan LED AKTIF");
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Serial.println("✓ Suhu normal. Relay, Buzzer, dan LED NONAKTIF");
}
Serial.println("--------------------------------");
}
void setup() {
Serial.begin(115200);
Serial.println("\nMemulai sistem...");
// Inisialisasi pin
Serial.println("Inisialisasi PIN...");
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
Serial.println("✓ PIN diinisialisasi");
// Inisialisasi I2C
Serial.println("Inisialisasi I2C...");
Wire.begin(21, 22);
Serial.println("✓ I2C diinisialisasi");
// Inisialisasi sensor
Serial.println("Inisialisasi sensor...");
dht.begin();
sensors.begin();
Serial.println("✓ Sensor diinisialisasi");
// Inisialisasi OLED
Serial.println("Inisialisasi OLED...");
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("❌ Gagal inisialisasi SSD1306");
for(;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.display();
Serial.println("✓ OLED diinisialisasi");
// Koneksi ke WiFi
Serial.println("Menghubungkan ke WiFi...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✓ Terhubung ke WiFi");
// Inisialisasi ThingSpeak
Serial.println("Inisialisasi ThingSpeak...");
ThingSpeak.begin(client);
Serial.println("✓ ThingSpeak diinisialisasi");
// Koneksi ke Blynk
Serial.println("Menghubungkan ke Blynk...");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.println("✓ Terhubung ke Blynk");
// Setup timer
timer.setInterval(2000L, sendSensorData);
Serial.println("✓ Timer diatur untuk 2 detik");
Serial.println("Setup selesai!");
}
void loop() {
Blynk.run();
timer.run();
}