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

구동하려면 라이브러리
- ahtx0.py github.com
- bmp280.py github.com
- 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 또는 0x3D | 0x3C가 압도적으로 많음 |
| 온습도 센서 | AHT10 / AHT20 | 0x38 | |
| DHT20 | 0x38 | AHT20과 호환됨 | |
| SHT30 / SHT31 | 0x44 또는 0x45 | ||
| 기압/고도 | BMP280 / BME280 | 0x76 또는 0x77 | |
| 가속도/자이로 | MPU-6050 | 0x68 또는 0x69 | |
| 조도 센서 | BH1750 | 0x23 | |
| 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 같은 초소형 보드와 결합했을 때 최고의 휴대성을 보여줍니다.”



micro2iot에 답글 남기기 응답 취소