본문 바로가기

ESP32

ESP32 IoT 기반 기상 관측소

반응형

 

 

IoT 기반 기상 관측소 설정은 ESP32 마이크로컨트롤러, DHT22 온도 및 습도 센서, RTC(실시간 시계) 모듈, OLED 디스플레이를 사용하여 실시간으로 환경 데이터를 모니터링하고 표시합니다.

 

주요 구성 요소:

 

1. ESP32: 이 마이크로컨트롤러는 프로젝트의 핵심으로, 센서의 데이터를 처리하고 OLED 디스플레이를 제어합니다. 내장 Wi-Fi를 통해 원격 액세스 및 모니터링을 위해 클라우드 플랫폼으로 데이터를 전송할 수도 있습니다.

 

2. DHT22 센서: 이 센서는 주변 온도와 습도를 측정합니다. 센서는 이 데이터를 ESP32로 전송하여 처리합니다.

 

3. RTC(실시간 시계) 모듈: RTC 모듈은 정확한 시간 및 날짜 정보를 제공합니다. 이는 센서 데이터에 타임스탬프를 적용하여 사용자가 시간 경과에 따른 환경 조건을 추적할 수 있도록 하는 데 중요합니다. 시계 모듈은 독립적으로 실행되므로 ESP32가 재설정되어도 정확한 시간을 유지합니다.

 

4. OLED 디스플레이: OLED 화면은 현재 시간, 온도, 습도와 같은 데이터를 표시하는 데 사용됩니다. 이미지에서 디스플레이는 HH:MM:SS 형식(12:34:40)으로 시간을 표시하여 RTC 모듈 사용을 나타냅니다.

 

작동:

 

이 IoT 기상 관측소는 DHT22 센서에서 실시간 온도 및 습도 데이터를 수집하는 동시에 RTC 모듈을 사용하여 현재 시간을 표시합니다. ESP32는 이 정보를 처리하여 OLED 화면에 표시합니다. ESP32는 Wi-Fi 기능을 통해 원격 모니터링 및 분석을 위해 클라우드 서비스에 데이터를 업로드할 수도 있습니다.

 

이 설정은 스마트 홈, 사무실 또는 야외 애플리케이션에서 날씨를 추적하는 데 이상적입니다. 컴팩트한 크기, 실시간 데이터 모니터링 및 연결성 덕분에 환경 모니터링을 위한 실용적인 솔루션입니다.

 

유튜브 영상 참고 

 

코드 

 

#include <Wire.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>  // Include library for real-time clock (RTC)
// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// DHT Sensor settings
#define DHTPIN 4 // Pin where the DHT sensor is connected
#define DHTTYPE DHT22 // DHT11 or DHT22
DHT dht(DHTPIN, DHTTYPE);
// RTC settings
RTC_DS3231 rtc; // Use your specific RTC module
void setup() {
    Serial.begin(115200);
    dht.begin();
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    if (!rtc.begin()) {
        display.println("RTC Error");
        display.display();
        while (1); // Loop forever
    }
    // Show initialization message
    display.setTextSize(2);
    display.setCursor(0, 0);
    display.println("Smart Weather");
    display.setTextSize(1);
    display.setCursor(0, 30);
    display.println("Initialized");
    display.display();
    delay(3000); // Show for 3 seconds
}
void drawDottedLine(int y) {
    for (int x = 0; x < SCREEN_WIDTH; x += 2) {
        display.drawPixel(x, y, SSD1306_WHITE);
    }
}
void drawWeatherAnimation() {
    // Simple animated cloud
    for (int i = 0; i < 5; i++) {
        display.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_BLACK); // Clear the display
        display.setCursor(30 + i, 10); // Move cloud position
        display.print("TECH ZAID");
        display.display(); // Refresh display
        delay(100);
    }
}
void loop() {
    // Read humidity and temperature
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    // Check if readings are valid
    if (isnan(humidity) || isnan(temperature)) {
        display.clearDisplay();
        display.setCursor(0, 0);
        display.println("Failed to read");
        display.display();
        return;
    }
    // Get current time
    DateTime now = rtc.now();
    // Clear display for temperature
    display.clearDisplay();
    // Display Temperature with animation
    drawWeatherAnimation(); // Show animated weather
    display.setTextSize(2);
    display.setCursor(0, 30);
    display.print("Temp: ");
    display.print(temperature);
    display.print(" C");
    drawDottedLine(55); // Draw dotted line below temperature
    display.display(); // Refresh display
    delay(2000); // Show temperature for 2 seconds
    // Clear display for humidity
    display.clearDisplay();
    // Display Humidity with animation
    drawWeatherAnimation(); // Show animated weather
    display.setTextSize(2);
    display.setCursor(0, 30);
    display.print("Humidity: ");
    display.print(humidity);
    display.print(" %");
    drawDottedLine(55); // Draw dotted line below humidity
    display.display(); // Refresh display
    delay(2000); // Show humidity for 2 seconds
    // Clear display for time
    display.clearDisplay();
    // Display time
    display.setTextSize(1);
    display.setCursor(0, 0);
    display.print("🕒 Time:");
    display.setTextSize(2);
    display.setCursor(0, 15);
    display.print(now.hour());
    display.print(":");
    if (now.minute() < 10) {
        display.print("0");
    }
    display.print(now.minute());
    display.print(":");
    if (now.second() < 10) {
        display.print("0");
    }
    display.print(now.second());
    display.display(); // Refresh display
    delay(2000); // Show time for 2 seconds
}

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^