#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <ThingSpeak.h>
// 1. Definisi Pin Output
const int LED_RED = 17;
const int LED_YELLOW = 18;
const int LED_GREEN = 19;
const int BUZZER = 27;
// 2. Definisi Pin I2C (Gunakan pin yang sama untuk LCD & BMP180)
#define SDA_PIN 12
#define SCL_PIN 14
// 3. Konfigurasi Objek
Adafruit_BMP085 bmp;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat 0x27 untuk Wokwi
WiFiClient client;
// 4. Konfigurasi ThingSpeak
unsigned long myChannelNumber = 33323354;
const char * myWriteAPIKey = "0Y62M2B2XGVR2KSV";
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Mulakan I2C pada pin 12 (SDA) & 14 (SCL)
Wire.begin(SDA_PIN, SCL_PIN);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Cuaca...");
// Inisialisasi BMP180
if (!bmp.begin()) {
Serial.println("BMP180 tidak dijumpai!");
lcd.setCursor(0, 1);
lcd.print("Sensor Error! ");
}
// Sambungan WiFi Wokwi
Serial.print("Connecting WiFi...");
lcd.setCursor(0, 1);
lcd.print("WiFi Connecting.");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
lcd.setCursor(0, 1);
lcd.print("WiFi Connected! ");
ThingSpeak.begin(client);
delay(2000);
lcd.clear();
}
void loop() {
// Baca tekanan udara (convert ke hPa)
float pressure = bmp.readPressure() / 100.0F;
// Paparan Serial Monitor
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" hPa");
// Paparan LCD Baris 1
lcd.setCursor(0, 0);
lcd.print("Pres: ");
lcd.print(pressure, 1);
lcd.print(" hPa ");
resetIndicators();
lcd.setCursor(0, 1);
// Logik Indikator Berdasarkan Tekanan Udara
if (pressure > 1020) {
lcd.print("High: Cerah ");
digitalWrite(LED_GREEN, HIGH);
}
else if (pressure >= 1001 && pressure <= 1019) {
lcd.print("Norm: Mendung ");
digitalWrite(LED_YELLOW, HIGH);
}
else {
lcd.print("Low: Ribut/Hujan");
digitalWrite(LED_RED, HIGH);
tone(BUZZER, 1000);
}
// Upload data ke ThingSpeak
ThingSpeak.setField(1, pressure);
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Update ThingSpeak Berjaya");
} else {
Serial.println("Ralat ThingSpeak: " + String(x));
}
// Delay 20 saat (Syarat akaun percuma ThingSpeak)
delay(20000);
}
void resetIndicators() {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
noTone(BUZZER);
}