// #include <SPI.h>
// #include <Wire.h>
// #include <Adafruit_GFX.h>
// #include <Adafruit_SSD1306.h>
// #define SCREEN_WIDTH 128 // OLED display width, in pixels
// #define SCREEN_HEIGHT 64 // OLED display height, in pixels
// #define SPEAKER_PIN 10
// #define TRIGGER_PIN 15
// #define ECHO_PIN 23
// #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
// #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
// Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// float measureDistance() {
// // Kirim pulsa trigger
// digitalWrite(TRIGGER_PIN, LOW);
// delayMicroseconds(2);
// digitalWrite(TRIGGER_PIN, HIGH);
// delayMicroseconds(10);
// digitalWrite(TRIGGER_PIN, LOW);
// // Hitung durasi pulsa echo
// long duration = pulseIn(ECHO_PIN, HIGH);
// // Konversi durasi menjadi jarak (cm)
// float distance = duration * 0.034 / 2; // Kecepatan suara 340 m/s
// return distance;
// }
// void setup() {
// Serial.begin(115200);
// // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
// Serial.println("SSD1306 allocation failed");
// for(;;); // Don't proceed, loop forever
// }
// // Inisialisasi pin trigger dan echo
// pinMode(TRIGGER_PIN, OUTPUT);
// pinMode(ECHO_PIN, INPUT);
// // Show initial display buffer contents on the screen --
// // the library initializes this with an Adafruit splash screen.
// display.display();
// delay(2000); // Pause for 2 seconds
// // Clear the buffer
// display.clearDisplay();
// // Show the display buffer on the screen. You MUST call display() after
// // drawing commands to make them visible on screen!
// display.display();
// delay(2000);
// }
// void loop() {
// // Clear the buffer
// display.clearDisplay();
// // Mengukur jarak
// float distance = measureDistance();
// Serial.print("Distance: ");
// Serial.print(distance);
// Serial.println(" cm");
// // Tampilkan teks di layar OLED
// display.setTextSize(1); // Ukuran teks
// display.setTextColor(SSD1306_WHITE); // Warna teks
// display.setCursor(10, 1); // Posisi teks (x, y)
// display.println("Distance: " + String(distance) + " cm"); // Teks yang ditampilkan
// display.setCursor(10, 10); // Posisi teks (x, y)
// // Logika status berdasarkan jarak
// if (distance <= 50) {
// Serial.println("BAHAYA");
// display.println("BAHAYA"); // Teks yang ditampilkan
// } else if (distance <= 100) {
// Serial.println("WASPADA");
// display.println("WASPADA"); // Teks yang ditampilkan
// } else if (distance <= 200) {
// Serial.println("SIAGA");
// display.println("SIAGA"); // Teks yang ditampilkan
// } else {
// Serial.println("AMAN");
// display.println("AMAN"); // Teks yang ditampilkan
// }
// display.display();
// // Delay untuk stabilitas pembacaan
// delay(100);
// }
//////////////////////////////////////////////
// #define BLYNK_TEMPLATE_ID "TMPL6sDID37q0"
// #define BLYNK_TEMPLATE_NAME "PIR"
// #define BLYNK_AUTH_TOKEN "FwR_kqG8Xhq4rY7BYTMlzOvgCJvGU3dP"
// #include <WiFiClient.h>
// #include <BlynkSimpleEsp32.h>
// Blynk@wokwi:ff31ef6c8e4f64cd5acd23b415d84f7e5555fc1f
#include <ArduinoJson.h>
#include "RTClib.h"
#include "time.h"
#include <Timezone.h>
#include "icon.h"
#include <WiFiClientSecure.h>
#include <WiFiClient.h>
#include <WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <HttpClient.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SPEAKER_PIN 10
#define TRIGGER_PIN 15
#define ECHO_PIN 23
WiFiClient wifiClient;
HttpClient http; //Object of class HTTPClient
// Timing-related variables
time_t UTCtime;
time_t nowUTC;
time_t nowLocal;
// Timezone rules for GMT+7 (Jakarta, Bangkok, Hanoi)
TimeChangeRule WIB = {"WIB", Last, Sun, Mar, 1, 420}; // Waktu Indonesia Barat 7x60=420
TimeChangeRule GMT = {"GMT", Last, Sun, Oct, 2, 0}; // Standard Time
Timezone ID(WIB, GMT);
// Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = "Wokwi-GUEST"; // Hostpot name
const char* password = ""; //wifi password
String apiKey = "289d691821ba2fa55ac4affb7065be20"; //openweather apikey
String city = "1648580"; //City name
String units = "metric"; //or standart, imperial
String payload;
int wifi_stat = 0;
int wifiIcon = LOW;
const char* weather_0_main;
const char* weather_0_icon;
float main_temp = 0;
int main_humidity = 0;
String weatherr;
String Icon;
long dt;
String date_time;
unsigned long previousMillis_1 = 0;
const long interval_1 = 30000; //interval time HTTP req
void setup () {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display(); //adafruit logo
delay(2000); // Pause for 2 seconds
display.clearDisplay();
// just intro
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(45,20); display.println(F("OpenWeatherMap"));
display.setTextSize(1);
display.setCursor(15,40); display.println(F("Current Weather"));
display.display();
delay(1000);
display.clearDisplay();
WiFi.mode(WIFI_STA);
//ConnectWIFI();
delay(1000);
}
void loop() {
unsigned long currentMillis_1 = millis();
DisplayUpdate();
if (currentMillis_1 - previousMillis_1 >= interval_1) {
previousMillis_1 = currentMillis_1;
req_data();
}
}
void req_data(){
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
String address;
// http://api.openweathermap.org/data/2.5/weather?id=1642911&appid=289d691821ba2fa55ac4affb7065be20
// idn code 1642911
address = "api.openweathermap.org/data/2.5/weather?id=";
address += city;
address += "&appid=";
address += apiKey ;
http.begin(wifiClient, address);// get the result (*the error code*)
// HTTPClient http;
// http.begin(URL + "lat=" + lat + "&lon=" + lon + "&units=metric&appid=" + apiKey); //Specify request destination
int httpCode = http.GET();//Send the request
if (httpCode > 0) { //Check the returning code
payload = http.getString(); //Get the request response payload
Serial.println(payload); //Print the response payload
}
http.end(); //Close connection
const size_t capacity = JSON_ARRAY_SIZE(1) + 2*JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(14) + 290;
DynamicJsonDocument doc(capacity);
// Deserialize the JSON document
DeserializationError error = deserializeJson(doc, payload);
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
JsonObject weather_0 = doc["weather"][0];
weather_0_main = weather_0["main"];
weather_0_icon = weather_0["icon"];
Icon = String(weather_0_icon);
weatherr =String(weather_0_main);
JsonObject main = doc["main"];
main_temp = main["temp"];
main_humidity = main["humidity"];
nowUTC = doc["dt"];
char buff[20];
nowLocal = ID.toLocal(nowUTC);
//Print Data
Serial.println("Current Weather");
Serial.println(datetimestring(buff, nowLocal));
Serial.print(weather_0_main);Serial.print(", Temp: ");
Serial.print(main_temp);Serial.print(", Hum:");
Serial.print(main_humidity); Serial.println();
}else{
ConnectWIFI();
}
}
char * datetimestring(char * dest, DateTime datetime) {
static const char datetimeTemplate[] PROGMEM = "YY/MM/DD hh:mm"; //stored in PROGMEM to save space in ram // YYYY/MM/DD hh:mm:ss
strcpy_P(dest, datetimeTemplate); //copy template to buffer
return (datetime.toString(dest));
}
void DisplayUpdate(){
int x_cursor;
int TextSize;
char buff[20];
display.clearDisplay();
checkWIFI();
if (wifi_stat == 0){
// if the LED is off turn it on and vice-versa:
//Serial.println(F(" Wifi Not Connected"));
display.setTextSize(1);
display.setCursor(2,24); display.print("Connecting ...");
if (wifiIcon == LOW) {
display.drawBitmap(108, 2, wifi_icon, 16, 16, WHITE);
wifiIcon = HIGH;
} else {
display.drawBitmap(108, 2, wifi_icon, 16, 16, BLACK);
wifiIcon = LOW;
}
}else{
display.drawBitmap(106, 2, wifi_icon, 16, 16, WHITE);
//display variable
display.setTextColor(WHITE);
display.setTextSize(1);
//display.setCursor(80,40);display.print(humNow); display.println(" %");
display.setCursor(64,56);display.println(city);
display.setCursor(64,40);display.println(weatherr);
display.setCursor(0,2);display.println(datetimestring(buff, nowLocal));
display.setTextSize(2);
display.setCursor(64,24); display.print(main_temp);//display.println(" C");
DisplayBitmap();
}
display.display();
delay(600);
}
void DisplayBitmap(){
if (Icon=="01d"){
display.drawBitmap(0, 0, d01, 64, 64, WHITE);
}
else if (Icon=="01n"){
display.drawBitmap(0, 0, n01, 64, 64, WHITE);
}
else if (Icon=="02n"){
display.drawBitmap(0, 0, n02, 64, 64, WHITE);
}
else if (Icon=="02d"){
display.drawBitmap(0, 0, d02, 64, 64, WHITE);
}
else if ((Icon=="03d")||(Icon=="03n")){
display.drawBitmap(0, 0, Clouds, 64, 64, WHITE);
}
else if ((Icon=="04d")||(Icon=="04n")){
display.drawBitmap(0, 0, Broken_clouds, 64, 64, WHITE);
}
else if ((Icon=="09d")||(Icon=="09n")){
display.drawBitmap(0, 0, Shower_rain, 64, 64, WHITE);
}
else if ((Icon=="10d")||(Icon=="10n")){
display.drawBitmap(0, 0, Rain, 64, 64, WHITE);
}
else if ((Icon=="11d")||(Icon=="11n")){
display.drawBitmap(0, 0, Thunderstorm, 64, 64, WHITE);
}
else if ((Icon=="13d")||(Icon=="13n")){
display.drawBitmap(0, 0, Snow, 64, 64, WHITE);
}
else if ((Icon=="50d")||(Icon=="50n")){
display.drawBitmap(0, 0, Mist, 64, 64, WHITE);
}
else{
display.drawBitmap(0, 0, Unknows, 32, 32, WHITE);
}
}
void checkWIFI(){
if(WiFi.status() == WL_CONNECTED){
wifi_stat=1;
}else{
wifi_stat=0;
}
}
void ConnectWIFI(){
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
int i=0;
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
++i;
if (i==30){
i=0;
Serial.println("\n Failed to Connect.");
break;
}
}
if (WiFi.status() == WL_CONNECTED){
Serial.println("\nConnected.");
wifi_stat=1;
}
}
}