#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include "ThingSpeak.h"
// ✅ 1. Pin Output (UPDATED)
const int LED_RED = 23; // changed from 21 → 23
const int LED_YELLOW = 16;
const int LED_GREEN = 18;
const int BUZZER = 13;
// ✅ 2. I2C Pins (SAFE DEFAULT)
#define SDA_PIN 21
#define SCL_PIN 22
// ✅ 3. Objects
Adafruit_BMP085 bmp;
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiClient client;
// ✅ 4. ThingSpeak
unsigned long myChannelNumber = 3323326;
const char * myWriteAPIKey = "H3I1G9KQRNUJSPAF";
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUZZER, OUTPUT);
// ✅ FIXED I2C
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Cuaca...");
// ✅ BMP180 Check
if (!bmp.begin()) {
Serial.println("BMP180 tidak dijumpai!");
lcd.setCursor(0, 1);
lcd.print("Sensor Error! ");
} else {
Serial.println("BMP180 OK!");
}
// ✅ WiFi
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() {
float pressure = bmp.readPressure() / 100.0F;
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" hPa");
lcd.setCursor(0, 0);
lcd.print("Pres: ");
lcd.print(pressure, 1);
lcd.print(" hPa ");
resetIndicators();
lcd.setCursor(0, 1);
if (pressure > 1020) {
lcd.print("High: Cerah ");
Serial.println("High Pressure - Clear Weather");
digitalWrite(LED_GREEN, HIGH);
}
else if (pressure >= 1001 && pressure <= 1019) {
lcd.print("Norm: Mendung ");
Serial.println("Normal Pressure - Moderate Weather");
digitalWrite(LED_YELLOW, HIGH);
}
else {
lcd.print("Low: Ribut/Hujan");
Serial.println("Low Pressure - Rain/Storm Alert");
digitalWrite(LED_RED, HIGH);
tone(BUZZER, 1000);
}
// ✅ ThingSpeak Upload
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(20000);
}
void resetIndicators() {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
noTone(BUZZER);
}