اگه دنبال یه ساعت دیجیتال هوشمند هستی که هم زمان رو نشون بده هم وضعیت آب و هوا رو، این دستگاه مبتنی بر اینترنت اشیا (IoT) همونیه که لازمش داری! میتونیم این ساعت رو با استفاده از هر کدوم ار بردهای ESP32 مثل برد توسعه ESP32-DevKitC یا Wemos D1 R32 درست کنیم. از نمایشگر OLED برای نمایش استفاده میکنیم. برای این کار سراغ ماژول OLED با پروتکل I2C رفتیم.

با این ساعت میتونی لحظه به لحظه دما رو ببینی و همیشه از شرایط اطراف با خبر باشی. چند تا چیز جالب در مورد این ساعت:
- نمایش زمان دیجیتال با کیفیت بالا
- نمایش وضعیت آب و هوا و دما به صورت آنلاین
- نصب و راهاندازی راحت، روی میز یا دیوار
- طراحی مینیمال و سبک که با هر جایی جور درمیاد
با این ساعت، نه تنها از زمان و وضعیت محیط خبر داری، بلکه تجربهای هوشمند و مدرن از تکنولوژی روز و IOT هم خواهی داشت. ایدهآل برای خونه، دفتر کار و حتی یه هدیه باحال برای دوستات!
🛠 قطعات مورد نیاز:
- برد ESP32
- نمایشگر OLED (مثلاً 0.96 اینچ)
- سیمهای جامپر برای اتصال
- منبع تغذیه 5 ولت یا USB
⚡ روش اتصال:
اتصال OLED به ESP32:پایههای ماژول نمایشگر رو طبق جدول زیر به پینهای برد وصل کن.
| پایه نمایشگر OLED | اتصال به ESP32 |
|---|---|
| VCC (VDD) | 3.3V یا 5V |
| GND | GND |
| SCL (SCK) | GPIO 22 (یا پین SCL) |
| SDA | GPIO 21 (یا پین SDA) |
برد رو به کامپیوتر وصل کن و با Arduino IDE برنامه زیر رو آپلود کن.
⚠️ دقت کن: کتابخانههای Adafruit SSD1306 و Adafruit GFX برای راه اندازی ماژول نمایشگر OLED نصب باشن.
با همین اتصالات ساده، نمایشگر OLED آماده نمایش زمان و وضعیت آب و هوا میشه و میتونی برنامهریزی و بهروزرسانی آنلاین داشته باشی.
💻 کد
حالا بریم سراغ کد این پروژه.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
#include <WiFi.h> #include <HTTPClient.h> #include <ArduinoJson.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "time.h" // WiFi credentials const char* ssid = "WiFi_SSID"; const char* password = "WiFi_Password"; // OLED settings // OLED settings #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // NTP settings const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3 * 3600 + 30 * 60; // Tehran GMT+3:30 const int daylightOffset_sec = 0; // Weather API const char* weatherURL = "https://api.open-meteo.com/v1/forecast?latitude=35.6892&longitude=51.3890¤t_weather=true"; String weatherText = "Loading..."; // Shared variables String currentTime = "--:--:--"; // Mutex for display SemaphoreHandle_t displayMutex; void updateTimeTask(void* parameter) { for(;;) { struct tm timeinfo; if(getLocalTime(&timeinfo)) { char buf[9]; sprintf(buf, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); currentTime = String(buf); } vTaskDelay(1000 / portTICK_PERIOD_MS); // 1 second } } void updateWeatherTask(void* parameter) { for(;;) { if(WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(weatherURL); int httpCode = http.GET(); if(httpCode == 200) { String payload = http.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); float temp = doc["current_weather"]["temperature"]; float wind = doc["current_weather"]["windspeed"]; const char* condition = doc["current_weather"]["weathercode"] | "Clear"; weatherText = "Temp: " + String(temp) + "C\nWind: " + String(wind) + " km/h\nCond: " + String(condition); } http.end(); } vTaskDelay(10000 / portTICK_PERIOD_MS); // 10 seconds } } void displayTask(void* parameter) { for(;;) { if(xSemaphoreTake(displayMutex, portMAX_DELAY) == pdTRUE) { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(currentTime); display.setTextSize(1); display.setCursor(0,30); display.println(weatherText); display.display(); xSemaphoreGive(displayMutex); } vTaskDelay(500 / portTICK_PERIOD_MS); // update display every 0.5 sec } } void setup() { Serial.begin(115200); // Initialize OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("SSD1306 allocation failed"); for(;;); } display.clearDisplay(); display.display(); // Connect to WiFi Serial.print("Connecting to WiFi..."); WiFi.begin(ssid, password); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Connected!"); // Init NTP configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // Create mutex displayMutex = xSemaphoreCreateMutex(); // Create tasks xTaskCreate(updateTimeTask, "TimeTask", 2048, NULL, 1, NULL); xTaskCreate(updateWeatherTask, "WeatherTask", 8192, NULL, 1, NULL); xTaskCreate(displayTask, "DisplayTask", 4096, NULL, 1, NULL); } void loop() { // Nothing here, tasks handle everything } |


هیچ نظری ثبت نشده است! اولین نفر باشید.