온도, 습도에 기압까지 한 번에! 정밀 측정의 신세계 (AHT20 + BMP280)

온도, 습도, 기압 모든 걸 빠르게 정확하게 측정하고 가격도 정말 쌉니다. 온습도 측정용으로는 현존 최고의 제품인 것 같아서 소개합니다.

구동하려면 라이브러리

  1. ahtx0.py github.com
  2. bmp280.py github.com
  3. ssd1306.py github.com

를 인터넷에서 검색해서 다운 받아서 장치에 넣으면 됩니다.

python main.py

from machine import Pin, I2C
import ssd1306
import ahtx0
import bmp280
import time

print("Scan 1 (SDA1, SCL2):", I2C(0, sda=Pin(1), scl=Pin(2)).scan())

# 1. I2C Configuration (SDA=Pin 1, SCL=Pin 2)
# ESP32-C3 allows flexible pin remapping for Hardware I2C.
i2c = I2C(0, sda=Pin(1), scl=Pin(2), freq=100000)

# 2. Device Initialization
try:
    # Initialize OLED (Address 0x3C is standard for SSD1306)
    oled = ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
    
    # Initialize AHT20 Temperature & Humidity Sensor
    aht = ahtx0.AHT10(i2c) 
    
    # Initialize BMP280 Barometric Pressure Sensor (Address 0x77 detected by scan)
    bmp = bmp280.BMP280(i2c, addr=0x77)
    
    print("All devices initialized successfully!")
except Exception as e:
    print("Initialization failed:", e)
    oled = None

# 3. Main Loop
if oled:
    while True:
        try:
            # Read environmental data
            temp = aht.temperature
            humi = aht.relative_humidity
            pres = bmp.pressure / 100 # Convert Pa to hPa
            
            # Clear display
            oled.fill(0)
            
            # Draw Dashboard UI
            oled.rect(0, 0, 128, 64, 1) # Border
            oled.text("WEATHER STATION", 5, 5)
            oled.line(0, 15, 128, 15, 1) # Header separator
            
            # Display formatted data
            oled.text("Temp: {:.1f} C".format(temp), 10, 22)
            oled.text("Humi: {:.1f} %".format(humi), 10, 35)
            oled.text("Pres: {:.0f} hPa".format(pres), 10, 48)
            
            # Refresh screen
            oled.show()
            
        except Exception as e:
            print("Failed to read data:", e)
        
        # Update interval: 2 seconds
        time.sleep(2)

배선도 맞고 코드도 맞는데 안되는 경우는 구입한 장치의 I2C 장치의 주소가 달라서 생기는 에러인데.

print("Scan 1 (SDA1, SCL2):", I2C(0, sda=Pin(1), scl=Pin(2)).scan())

이런 코드로 주소가 제대로 잡히는지 확인하고 주소가 다르면 고쳐주면 됩니다.

주요 부품별 일반적인 I2C 주소

대부분의 모듈은 공장 출고 시 기본 주소가 정해져 있지만, 보드 뒷면의 납땜 점퍼(AD0, ADDR 핀 등)를 통해 주소를 바꿀 수 있는 경우도 많습니다.

부품 종류주요 모델기본 주소 (Hex)비고
디스플레이SSD1306 (OLED)0x3C 또는 0x3D0x3C가 압도적으로 많음
온습도 센서AHT10 / AHT200x38
DHT200x38AHT20과 호환됨
SHT30 / SHT310x44 또는 0x45
기압/고도BMP280 / BME2800x76 또는 0x77
가속도/자이로MPU-60500x68 또는 0x69
조도 센서BH17500x23
I/O 확장기PCF8574 (LCD)0x27 또는 0x3F캐릭터 LCD 백팩용

주소가 왜 두 개씩(예: 0x76, 0x77) 있나요?

같은 센서를 한 보드에 두 개 연결하고 싶을 때를 대비해서, 제조사가 주소를 선택할 수 있게 설계했기 때문입니다.

  • 방법: 센서 모듈 뒷면의 ‘ADDR’ 혹은 ‘AD0’ 핀에 GND를 연결하느냐, 3.3V를 연결하느냐에 따라 주소가 바뀝니다.

사양 (Specifications)

  • AHT20 (온습도): * 습도 범위: 0~100% RH (오차 ±2%)
    • 온도 범위: -40~85°C (오차 ±0.3°C)
    • 특징: 이전 모델(DHT11/22)보다 훨씬 정밀하고 I2C 인터페이스라 안정적임.
  • BMP280 (기압/온도):
    • 기압 범위: 300~1100 hPa (오차 ±1 hPa)
    • 특징: 기압 변화를 통해 **해발 고도(Altitude)**를 계산할 수 있음. (드론이나 날씨 데이터용으로 필수)

테스트에 사용된 모듈은 ssd1306, aht20+bmp280 이 합쳐진 모듈이라 총 3개의 i2c 주소가 스캔되어야 정상입니다.

온도값의 차이: “AHT20과 BMP280 모두 온도 센서가 들어있습니다. 두 센서의 온도값이 미세하게 다를 수 있는데, 보통은 전용 온습도 센서인 AHT20의 값이 더 정확하므로 이를 메인 데이터로 사용하는 것이 좋습니다.”

배선의 깔끔함: “VCC, GND, SCL, SDA 단 4핀만 병렬로 연결하면 되기 때문에 ESP32-C3 Super Mini 같은 초소형 보드와 결합했을 때 최고의 휴대성을 보여줍니다.”

코멘트

“온도, 습도에 기압까지 한 번에! 정밀 측정의 신세계 (AHT20 + BMP280)” 에 하나의 답글

  1. micro2iot 아바타

    [구매정보] 블로그에서 사용한 부품 구매정보입니다.
    아래 링크를 통해 구매 시 소정의 수수료를 제공받으며, 채널 운영에 큰 도움이 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다