#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
#include <time.h> // For time functions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = " "; //wifi-name
const char* password = " ";//wifi-passwd
const char* apiURL = " "; //Enter api access url here.
Servo weatherServo;
const int servoPin = 13;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800; // +5:30 IST
const int daylightOffset_sec = 0;
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;) ;
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
weatherServo.attach(servoPin);
delay(1500);
weatherServo.write(90); // Neutral position
delay(1500);
WiFi.begin(ssid, password);
display.setCursor(0, 0);
display.println("Connecting WiFi...");
display.display();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi Connected!");
display.display();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Waiting for NTP time sync...");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("\nTime synchronized!");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(apiURL);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload);
DynamicJsonDocument doc(4096);
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
time_t now = time(nullptr);
struct tm* timeinfo = localtime(&now);
int currentHour = timeinfo->tm_hour;
JsonArray tempArray = doc["hourly"]["temperature_2m"].as<JsonArray>();
JsonArray humidityArray = doc["hourly"]["relative_humidity_2m"].as<JsonArray>();
if (currentHour < tempArray.size() && currentHour < humidityArray.size()) {
float temperature = tempArray[currentHour];
float humidity = humidityArray[currentHour];
display.clearDisplay();
// Temperature
display.setTextSize(1);
display.setCursor(0,5);
display.println("Temp.");
display.setCursor(0, 30);
display.setTextSize(2);
display.print(temperature, 1);
display.setCursor(50, 37.5);
display.setTextSize(1);
display.println("C");
//Humidity
display.setTextSize(1);
display.setCursor(70, 5);
display.println("Humidity");
display.setCursor(70, 30);
display.setTextSize(2);
display.print(humidity,1);
display.setCursor(120, 35);
display.setTextSize(1);
display.println("%");
display.setTextSize(1);
display.setCursor(50, 55);
if (humidity >= 60) {
display.print("Rainy");
delay(1500);
weatherServo.write(180);
delay(1500);
} else {
delay(1500);
display.print("Sunny");
delay(1500);
}
display.display();
} else {
Serial.println("Hour out of range");
displayError("Hour out of range");
}
} else {
Serial.println("JSON Parsing Error");
displayError("JSON Error");
}
} else {
Serial.println("HTTP Request Failed");
displayError("HTTP Error");
}
http.end();
} else {
Serial.println("WiFi Disconnected");
displayError("WiFi Lost");
reconnectWiFi();
}
delay(60000);
}
void displayError(const char* msg) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 20);
display.println(msg);
display.display();
delay(2000);
}
void reconnectWiFi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Attempting to reconnect WiFi...");
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("WiFi");
display.println("Recon...");
display.display();
WiFi.reconnect();
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 10) {
delay(1000);
attempts++;
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Reconnected!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi OK!");
display.display();
} else {
Serial.println("\nWiFi Reconnection Failed");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi");
display.println("Failed!");
display.display();
delay(2000);
ESP.restart();
}
}
}
upload the code to xiao esp32s3 using any like arduino ide. Here you have to replace the api access url with with your url and netwok name password. you can also set the servo angle as your desired value.
还木有评论哦,快来抢沙发吧~