예제 (Recipes)

이 섹션은 espzero 를 사용하여 다양한 센서와 부품을 제어하는 실전 예제를 다룹니다. 모든 예제는 import espzero; espzero.begin() 이 호출되었다고 가정합니다.

내장 LED (Built-in LED)

보드에 내장된 LED를 제어하는 가장 간단한 방법입니다.

from espzero import esp_led
from time import sleep

esp_led.on()  # 켜기
sleep(1)
esp_led.off() # 끄기
esp_led.blink() # 백그라운드에서 깜빡이기

디지털 출력 (LED)

일반 LED를 특정 핀에 연결하여 제어합니다.

from espzero import LED

led = LED(4) # GPIO 4번

led.on()
led.off()
led.toggle()

# 0.5초 켜지고 0.5초 꺼지기를 5번 반복 (비동기)
led.blink(on_time=0.5, off_time=0.5, n=5)

PWM 제어 (밝기 조절)

led.value = 0.5 # 50% 밝기
led.pulse()     # 서서히 밝아졌다 어두워졌다 반복

RGB LED

빨강, 초록, 파랑 핀을 각각 연결하여 다양한 색상을 만듭니다.

from espzero import RGBLED

rgb = RGBLED(red=25, green=26, blue=27)

rgb.color = (255, 0, 0)   # 빨간색
rgb.color = (0, 255, 0)   # 초록색
rgb.color = (255, 255, 0) # 노란색 (빨강+초록)
rgb.off()

부저 및 스피커 (Buzzer & Speaker)

단순 경고음 (Beep)

from espzero import Buzzer

bz = Buzzer(15)
bz.beep(on_time=0.1, off_time=0.1, n=3) # "삑-삑-삑"

멜로디 연주 (Play)

from espzero import Speaker

spk = Speaker(15)

# (음계, 박자) 튜플의 리스트
tune = [
    ('c4', 0.5), ('d4', 0.5), ('e4', 0.5), ('c4', 0.5),
    ('e4', 0.5), ('c4', 0.5), ('g4', 1.0)
]
spk.play(tune)

입력 장치 (Input Devices)

버튼 (Button)

from espzero import Button

btn = Button(5)

btn.when_pressed = lambda: print("눌림!")
btn.when_released = lambda: print("떨어짐!")

가변저항 (Potentiometer)

from espzero import Pot

pot = Pot(34) # 아날로그 핀 (ADC)

print("현재 값 (0-1):", pot.value)
print("전압 (V):", pot.voltage)

초음파 거리 센서 (Distance Sensor)

HC-SR04 등의 초음파 센서를 사용하여 거리를 측정합니다.

from espzero import DistanceSensor

# echo=14, trigger=13
ds = DistanceSensor(echo=14, trigger=13)

while True:
    print("거리: ", ds.distance, "cm")
    sleep(0.5)

온도 센서 (Temperature Sensor)

내장 온도 센서

ESP32 칩 내부의 온도를 측정합니다. (주의: 외부 기온과는 차이가 있을 수 있습니다.)

from espzero import esp_temp_sensor

print("칩 내부 온도:", esp_temp_sensor.temp, "C")

복합 예제: 버튼으로 조명 제어

버튼을 누를 때마다 LED가 토글되는 예제입니다.

from espzero import LED, Button, begin

begin()
led = LED(4)
btn = Button(5)

btn.when_pressed = led.toggle

while True:
    pass # 이벤트 대기

스텝 모터 (Stepper Motor)

드라이버 보드(예: ULN2003)를 통해 연결된 스텝 모터를 제어합니다.

아날로그 시계 (Analog clock)

연속으로 회전하는 아날로그 시계의 초침을 만듭니다:

from espzero import Stepper

# Second Hand Clock - Continuous 60s Rotation
# One full revolution every 60 seconds.

STEP_DELAY = 60.0 / 2048  # ??0.029296875 seconds per step (full-step)

stepper = Stepper((1, 2, 3, 4), step_delay=STEP_DELAY)

stepper.run_continuous(direction="cw")

자동 블라인드 (Automatic blinds)

시간 기반 블라인드 컨트롤러:

from espzero import Stepper
from time import localtime, sleep

stepper = Stepper((1, 2, 3, 4), step_sequence="half")

OPEN_TIME = (7, 0)  # Open at 7:00 AM (hour, minute)
CLOSE_TIME = (20, 0)  # Close at 8:00 PM
ROTATIONS = 5  # Number of full rotations needed to fully open/close blinds

# Track state
is_open = False


def open_blinds():
    global is_open
    if not is_open:
        for _ in range(ROTATIONS):
            stepper.rotate(1, "cw")
        is_open = True


def close_blinds():
    global is_open
    if is_open:
        for _ in range(ROTATIONS):
            stepper.rotate(1, "ccw")
        is_open = False


def check_schedule():
    now = localtime()
    current_time = (now.tm_hour, now.tm_min)

    # Check if it's time to open
    if current_time == OPEN_TIME and not is_open:
        open_blinds()

    # Check if it's time to close
    elif current_time == CLOSE_TIME and is_open:
        close_blinds()


# Set starting position (closed)
stepper.reset_position()
is_open = False

# Check every 30 seconds
while True:
    check_schedule()
    sleep(30)

LCD 디스플레이 (LCD Display)

I2C 버스와 PCF8574 I2C 어댑터를 사용하여 LiquidCrystal 디스플레이(LCD)에 문자를 출력합니다.

from espzero import I2cLcd
from time import sleep

lcd =  I2cLcd(1, 3, 2)  # i2c_id=1, scl=3, sda=2

lcd.putstr('Hello World')
sleep(1)
lcd.move_to(0, 1)
lcd.putstr('Hello Pi Pico')

GPIO 핀만 사용하여 LiquidCrystal 디스플레이(LCD)에 문자를 출력합니다.

from espzero import GpioLcd
from time import sleep

# Create the LCD object
lcd = GpioLcd(rs_pin=16,
              enable_pin=17,
              d4_pin=18,
              d5_pin=19,
              d6_pin=20,
              d7_pin=21,
              num_lines=2, 
              num_columns=16)

lcd.putstr('Hello World')
sleep(1)
lcd.move_to(0, 1)
lcd.putstr('Hello Pi Pico')

AI 비전 (AI Vision)

ESP32-S3 AI 비전 카메라와 에디터 연동 및 단독 실행 AI 예제입니다.

PC 연동 AI (MediaPipe 연동)

ESP32 카메라 영상을 PC(에디터)로 전송하고, PC의 MediaPipe 라이브러리를 사용해 손가락 관절 등을 실시간으로 분석합니다. 분석된 좌표는 다시 ESP32에 전송되어 제어에 사용됩니다.

from espzero import vision
from time import sleep

# PC로 실시간 카메라 영상 전송 시작
vision.start_stream_to_pc()

while True:
    # 에디터가 분석하여 주입해 준 손가락 좌표 읽기
    if "__pc_ai_data" in globals():
        x = __pc_ai_data.get("hand_x", 0)
        y = __pc_ai_data.get("hand_y", 0)
        print("손가락 위치 -> X:", x, "Y:", y)
    sleep(0.1)

기기 단독 AI (On-Device TFLite)

ESP32 내부에 다운로드한 .tflite 모델 파일을 읽어와 직접 AI 추론을 수행합니다. PC와 연결되지 않은 상태에서도 동작할 수 있습니다.

참고

사용 가능한 샘플 .tflite 모델 파일들은 구글의 텐서플로우 라이트 공식 모델 저장소(https://www.tensorflow.org/lite/guide/hosted_models)에서 직접 내려받을 수 있습니다.

import camera
import tflite
from time import sleep

# 카메라 초기화 및 TFLite 모델 로드
camera.init(framesize=camera.FRAME_QVGA)
model = tflite.load("model.tflite")

while True:
    img = camera.capture()
    if img:
        # 이미지 분석 및 클래스 결과 추출
        result = model.detect(img)
        print("인식된 클래스 ID:", result.class_id)
    sleep(0.5)