반응형

ESP32 피지컬 컴퓨팅 강좌 5강. 초음파 센서(HC-SR04)로 거리 측정 + 주차 거리 경보(LED/부저 단계)

대상: 1~4강(버튼/가변저항/PWM/부저)을 완료한 입문자

이번 강의 목표: 초음파 센서로 거리를 측정하고, 거리 단계에 따라 LED와 부저 경고 패턴이 달라지는 “주차 거리 경보” 장치를 만든다.


🎬 도입 이야기(왜 이걸 배우나요?)

차를 주차할 때 “삐…삐…삐삐삐!” 소리가 점점 빨라지면, 우리는 ‘가까워졌다’는 걸 즉시 알죠.
이 기능의 핵심은 거리 센서 + 단계형 피드백입니다.
오늘은 교실에서 바로 만들 수 있는 대표 거리 센서 HC-SR04를 ESP32에 연결하고,
거리 변화에 따라 빛(LED) + 소리(부저)가 “단계적으로” 바뀌는 경보 장치를 완성합니다.


✅ 5강 프로젝트

  • 프로젝트명: 주차 거리 경보(3단계)
  • 결과:
    • 거리를 cm로 측정해서 시리얼 모니터에 출력
    • 먼 거리: LED 약하게/부저 없음
    • 중간 거리: LED 켜짐/부저 느리게 “삐-”
    • 가까운 거리: LED 강하게/부저 빠르게 “삐삐삐”

🧰 준비물(BOM)

  • ESP32 개발보드 1개
  • 브레드보드 1개
  • 점퍼선 여러 개
  • 초음파 센서 HC-SR04 1개
  • LED 1개 + 220Ω 저항 1개
  • (이전 강의) 패시브 부저 1개(권장)
  • (선택) 버튼 1개(모드 전환 확장용)

중요(전압 레벨)
HC-SR04의 ECHO 핀은 5V 신호가 나오는 경우가 많습니다.
ESP32 입력은 3.3V라서, 안전하게 하려면 분압(저항 2개) 또는 레벨 시프터를 사용하세요.


🔌 회로 연결표

A) LED 연결(거리 표시)

  • ESP32 GPIO2 → (220Ω) → LED 긴 다리(+)
  • LED 짧은 다리(-) → GND

B) 부저 연결(경고음)

  • 부저 + → ESP32 GPIO25
  • 부저 - → GND

C) HC-SR04 연결

  • HC-SR04 VCC5V (ESP32 보드의 5V/VIN 핀)
  • HC-SR04 GNDGND
  • HC-SR04 TRIG → ESP32 GPIO5
  • HC-SR04 ECHO → (분압 후) ESP32 GPIO18

D) ECHO 분압(레벨 다운) 권장

아래처럼 저항 2개로 ECHO를 3.3V 수준으로 낮춥니다.

  • HC-SR04 ECHO → 저항 1kΩ → (노드) → ESP32 GPIO18
  • (노드) → 저항 2kΩ → GND

분압 비율 = 아래 저항 / (위+아래) = 2k / (1k+2k) = 0.666…
5V × 0.666… ≈ 3.33V → ESP32에 비교적 안전한 수준


🧠 핵심 개념

초음파 거리 측정 원리(아주 간단히)

  • TRIG로 초음파 “발사”
  • ECHO가 HIGH인 시간 = 왕복 시간
  • 거리(cm) ≈ (시간(μs) × 0.0343) / 2

🧪 실습 1: 거리(cm) 측정해서 출력하기

먼저 거리값이 잘 나오는지 확인합니다.

🧪 실습 코드 1: HC-SR04 거리 측정(단위 cm)
const int TRIG_PIN = 5;
const int ECHO_PIN = 18;

float readDistanceCM() {
  // TRIG: 10us 펄스
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // ECHO 펄스 폭(마이크로초) 측정
  // timeout: 30ms(약 5m) 정도로 제한
  unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000);

  if (duration == 0) return -1; // timeout

  // 거리 계산: (시간 * 음속) / 2
  // 음속 ≈ 0.0343 cm/us
  float cm = (duration * 0.0343) / 2.0;
  return cm;
}

void setup() {
  Serial.begin(115200);
  delay(300);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  Serial.println("HC-SR04 distance test start");
}

void loop() {
  float d = readDistanceCM();

  if (d < 0) {
    Serial.println("No echo (timeout)");
  } else {
    Serial.print("Distance: ");
    Serial.print(d, 1);
    Serial.println(" cm");
  }

  delay(150);
}

확인 포인트

  • 손을 가까이/멀리 하면 거리값이 바뀌어야 합니다.
  • 값이 -1(타임아웃)이 자주 나오면: 배선/전원/분압/센서 방향을 확인하세요.

✅ 5강 프로젝트: 주차 거리 경보(LED + 부저 단계)

거리값을 “그대로 출력”하는 게 아니라, 사람에게 직관적인 단계로 바꿔서 피드백합니다.
이게 피지컬 컴퓨팅의 핵심(센서 → 판단 → 출력)입니다.

단계 예시(조절 가능)
- 60cm 이상: 안전(부저 X)
- 30~60cm: 주의(느린 삐-)
- 30cm 미만: 위험(빠른 삐삐삐)

✅ 프로젝트 코드: 거리 경보(LED 밝기 + 부저 패턴)
const int TRIG_PIN = 5;
const int ECHO_PIN = 18;

const int LED_PIN  = 2;

// 부저(LEDC)
const int BUZZ_PIN = 25;
const int BUZZ_CH  = 1;
const int BUZZ_RES = 8;

// LED PWM(LEDC)
const int LED_CH   = 0;
const int LED_FREQ = 5000;
const int LED_RES  = 8; // 0~255

// 단계 기준(원하면 수정)
const float FAR_CM  = 60.0; // 이 이상: 부저 없음
const float NEAR_CM = 30.0; // 이 미만: 빠른 경보

// 부저 패턴 타이밍
unsigned long lastBeep = 0;
bool beepOn = false;

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000);
  if (duration == 0) return -1;

  return (duration * 0.0343) / 2.0;
}

void setup() {
  Serial.begin(115200);
  delay(300);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  // LED PWM
  ledcSetup(LED_CH, LED_FREQ, LED_RES);
  ledcAttachPin(LED_PIN, LED_CH);
  ledcWrite(LED_CH, 0);

  // BUZZ PWM
  ledcSetup(BUZZ_CH, 1000, BUZZ_RES);
  ledcAttachPin(BUZZ_PIN, BUZZ_CH);
  ledcWriteTone(BUZZ_CH, 0);

  Serial.println("Parking Distance Alarm Start");
}

void loop() {
  float d = readDistanceCM();

  // 거리 측정 실패 시(타임아웃) : 출력 끄기
  if (d < 0) {
    ledcWrite(LED_CH, 0);
    ledcWriteTone(BUZZ_CH, 0);
    delay(100);
    return;
  }

  // 1) LED 밝기(가까울수록 밝게)
  // 10~100cm를 255~0으로 매핑(가까우면 밝게)
  float clampD = d;
  if (clampD < 10) clampD = 10;
  if (clampD > 100) clampD = 100;

  int ledDuty = (int)map((int)clampD, 10, 100, 255, 0);
  ledcWrite(LED_CH, ledDuty);

  // 2) 부저 단계형 패턴
  unsigned long now = millis();

  if (d >= FAR_CM) {
    // 안전: 부저 끔
    ledcWriteTone(BUZZ_CH, 0);
    beepOn = false;
  } else if (d >= NEAR_CM) {
    // 주의: 느린 삐- (예: 500ms 간격)
    unsigned long interval = 500;
    if (now - lastBeep >= interval) {
      lastBeep = now;
      beepOn = !beepOn;
      ledcWriteTone(BUZZ_CH, beepOn ? 1200 : 0);
    }
  } else {
    // 위험: 빠른 삐삐삐 (예: 150ms 간격)
    unsigned long interval = 150;
    if (now - lastBeep >= interval) {
      lastBeep = now;
      beepOn = !beepOn;
      ledcWriteTone(BUZZ_CH, beepOn ? 1700 : 0);
    }
  }

  // 시리얼 출력(너무 잦으면 느려질 수 있어 간격을 둠)
  static unsigned long lastPrint = 0;
  if (now - lastPrint >= 200) {
    lastPrint = now;
    Serial.print("D=");
    Serial.print(d, 1);
    Serial.print("cm  LED=");
    Serial.print(ledDuty);
    Serial.print("  STATE=");
    if (d >= FAR_CM) Serial.println("SAFE");
    else if (d >= NEAR_CM) Serial.println("CAUTION");
    else Serial.println("DANGER");
  }

  delay(20);
}

🧩 체크포인트(자주 틀리는 부분 TOP 12)

  1. ECHO를 그대로 ESP32에 연결 → 5V 신호일 수 있어 분압/레벨시프터 권장
  2. TRIG/ECHO 핀 반대로 연결 → TRIG는 출력, ECHO는 입력
  3. 센서 전원 → HC-SR04는 보통 5V에서 안정적(3.3V에서 불안정할 수 있음)
  4. GND 공통 누락 → ESP32와 센서의 GND는 반드시 연결
  5. timeout 없이 pulseIn 사용 → 멈춤/렉 발생 가능, timeout을 꼭 넣기
  6. 거리값 튐 → 평균/중앙값 필터를 적용하면 안정됨(확장 과제)
  7. 너무 가까이(2~3cm) → HC-SR04는 최소 측정거리 근처에서 값이 이상할 수 있음
  8. 부저가 계속 울림 → 조건문에서 끄는 코드(0Hz)를 반드시 넣기
  9. LED 안 켜짐 → 극성/저항/핀 번호 확인
  10. 주파수 너무 높아 불쾌 → 800~1500Hz 사이로 조절해보세요
  11. 시리얼 출력 때문에 느려짐 → 출력 간격(lastPrint) 조절
  12. 핀 충돌 → 보드에 따라 문제 핀이 있으면 TRIG=17, ECHO=16 등으로 변경

🚀 확장 과제(선택)

  • 과제 1: 거리값을 5번 측정해서 평균내고 사용하기(노이즈 줄이기)
    힌트: 평균 필터
    // for (i=0..4) 거리 측정 누적 -> sum/5
    // 너무 빠르게 측정하면 센서가 꼬일 수 있어 20~40ms 간격 권장
  • 과제 2: LED 3개(녹/노/빨)로 단계 표시(신호등 방식)
  • 과제 3: 임계값을 “가변저항(3강)”으로 조절하게 만들기(거리 기준 튜닝)
  • 과제 4: OLED/LCD를 붙여 거리(cm)와 상태(SAFE/CAUTION/DANGER) 표시(중급 파트 예고)

📝 평가 루브릭(선택)

평가 요소 우수(4) 보통(3) 기초(2) 미흡(1)
센서 연결/안전 ECHO 레벨다운 이유 설명+구현 연결 정상, 측정 성공 오류 있으나 도움으로 수정 측정 실패
거리 측정 원리/공식 설명 가능 값이 안정적으로 변화 값이 자주 튐 값 출력 불가
단계 피드백 3단계 이상/패턴 설계 3단계 경보 정상 동작 일부 단계만 동작 피드백 없음
확장 과제 2개 이상 해결 + 설명 1개 해결 시도 흔적 미시도

⚠️ 유의사항

  • HC-SR04는 주변 환경(각도/재질/흡음)에 따라 값이 튈 수 있어요. “완벽한 센서”가 아니라는 걸 경험하는 것도 학습입니다.
  • 전압 레벨(5V→3.3V)을 무시하면 ESP32가 손상될 수 있으니, 가능하면 분압을 적용하세요.
  • 초음파 센서는 너무 빠른 연속 측정 시 오작동할 수 있어, 측정 간격 50ms 이상을 권장합니다.

➡️ 다음 예고(6강)

  • 6강: 온습도 센서(DHT11/22) + “미니 기상대” 만들기
  • 미니 프로젝트: 온습도 표시 + 임계값(더움/습함) 경고 LED/부저
반응형
반응형

ESP32 피지컬 컴퓨팅 강좌 4강. 부저(피에조)로 소리 만들기 + 알림 시스템 프로젝트

대상: 1~3강(업로드/버튼/가변저항+PWM)을 완료한 입문자

이번 강의 목표: ESP32로 ‘삐-’ 소리부터 간단한 멜로디까지 만들고, 센서값(가변저항)에 따라 경고음을 울리는 “알림 시스템”을 완성한다.


🎬 도입 이야기(왜 이걸 배우나요?)

스마트기기에서 “띵!”, “삐삐!”, “경고음!”이 없으면… 사용자는 지금 무슨 일이 벌어지는지 잘 모릅니다.
소리는 화면보다 빠르고, 멀리서도 들리고, 특히 교실/메이커실에서 피드백 장치로 매우 강력해요.
오늘은 LED에서 한 단계 더 나아가, ESP32로 소리(주파수)를 다루고
마지막에 ‘다이얼로 음높이를 바꾸는 전자악기 + 경고음 모드’까지 만들어봅니다.


✅ 4강 프로젝트

  • 프로젝트명: 미니 전자악기(Manual) + 경고음(Alarm) 모드
  • 결과:
    • 모드 0: 가변저항으로 음높이(피치) 조절 → “전자악기”
    • 모드 1: 가변저항 값이 임계값을 넘으면 경고음 패턴 출력
    • 버튼을 누를 때마다 모드 전환(2~3강 내용 연결)

🧰 준비물(BOM)

  • ESP32 개발보드 1개
  • 브레드보드 1개
  • 점퍼선 여러 개
  • 피에조 부저(패시브) 1개 (권장: 패시브 부저 / 주파수 제어 가능)
  • (선택) 액티브 부저 1개 (단순 ON/OFF만 가능 — 멜로디는 어려움)
  • (이전 강의) 가변저항 10kΩ 1개
  • (이전 강의) 버튼 1개

패시브 vs 액티브 부저
- 패시브: 우리가 주파수를 만들어서 “도레미” 가능(추천)
- 액티브: 전원만 주면 “삐-” (주파수 조절/멜로디 어려움)


🧠 핵심 개념

1) 소리의 정체 = 주파수(Hz)

높은 소리 = 주파수 높음(예: 2000Hz), 낮은 소리 = 주파수 낮음(예: 200Hz)
부저에 PWM을 주면, PWM 주파수에 따라 음높이가 바뀝니다.

2) ESP32에서 “톤(tone)”은 LEDC로 만든다

ESP32는 LED처럼 LEDC(PWM) 채널로 주파수를 만들 수 있어요.
오늘은 ledcWriteTone()을 사용해서 간단하게 음을 냅니다.


🔌 회로 연결표

A) 부저 연결(패시브 권장)

  • 부저 +(긴 쪽/표시 있는 쪽) → ESP32 GPIO 25
  • 부저 - → ESP32 GND

GPIO25를 쓴 이유: PWM/출력으로 쓰기 무난한 핀이라 초보용으로 안정적입니다.
(보드 환경에 따라 다른 핀도 가능)

B) 가변저항 연결(3강과 동일)

  • 가변저항 한쪽 끝 → 3.3V
  • 가변저항 반대쪽 끝 → GND
  • 가변저항 가운데 핀(와이퍼) → GPIO34

C) 버튼 연결(2강과 동일)

  • 버튼 한쪽 → GND
  • 버튼 반대쪽 → GPIO15
  • 코드에서 INPUT_PULLUP 사용

🧪 실습 1: “삐-” 소리 내기(고정 주파수)

부저가 제대로 연결됐는지, 가장 간단하게 확인해봅니다.

🧪 실습 코드 1: 1000Hz 소리 0.2초 울리기
const int BUZZ_PIN = 25;

// LEDC 채널(부저용)
const int BUZZ_CH = 1;

void setup() {
  Serial.begin(115200);
  delay(300);

  // 주파수는 나중에 ledcWriteTone으로 설정 가능
  ledcSetup(BUZZ_CH, 1000, 8);       // (채널, 임시 주파수, 해상도)
  ledcAttachPin(BUZZ_PIN, BUZZ_CH);

  Serial.println("Buzzer test: 1000Hz beep");
}

void loop() {
  ledcWriteTone(BUZZ_CH, 1000);  // 1000Hz
  delay(200);
  ledcWriteTone(BUZZ_CH, 0);     // 0Hz = 소리 끔
  delay(800);
}

🧪 실습 2: 도레미(간단 멜로디) 만들기

이제 주파수를 바꿔서 멜로디처럼 들리게 만들어봅니다.

🧪 실습 코드 2: 도레미파솔라시도(간단 멜로디)
const int BUZZ_PIN = 25;
const int BUZZ_CH  = 1;

int notes[] = {262, 294, 330, 349, 392, 440, 494, 523}; // C4~C5 근사값
int noteCount = sizeof(notes) / sizeof(notes[0]);

void setup() {
  Serial.begin(115200);
  delay(300);

  ledcSetup(BUZZ_CH, 1000, 8);
  ledcAttachPin(BUZZ_PIN, BUZZ_CH);

  Serial.println("Melody: Do Re Mi...");
}

void loop() {
  for (int i = 0; i < noteCount; i++) {
    ledcWriteTone(BUZZ_CH, notes[i]);
    delay(220);
    ledcWriteTone(BUZZ_CH, 0);
    delay(60);
  }
  delay(800);
}

✅ 4강 프로젝트: “전자악기(Manual) + 경고음(Alarm)”

프로젝트 동작

  • 모드 0(전자악기): 가변저항 값 → 주파수(200~2000Hz)로 매핑 → 다이얼로 음높이 조절
  • 모드 1(경고음): 가변저항 값이 임계값(예: 3000) 이상이면 “삐삐” 경고 패턴
  • 버튼(액티브 로우)으로 모드 전환 + 디바운스 적용
✅ 프로젝트 코드: 전자악기 + 경고음(버튼 모드 전환)
const int POT_PIN  = 34; // 가변저항(ADC)
const int BTN_PIN  = 15; // 버튼(내부 풀업)
const int BUZZ_PIN = 25; // 부저

// 부저용 LEDC
const int BUZZ_CH = 1;
const int BUZZ_RES = 8;

// 모드: 0=Instrument, 1=Alarm
int mode = 0;

// 버튼 디바운스(액티브 로우)
int lastBtn = HIGH;
unsigned long lastDebounce = 0;
const unsigned long debounceMs = 40;

// Alarm 패턴용
unsigned long lastAlarm = 0;
bool alarmOn = false;

// 임계값(경고 기준)
const int THRESHOLD = 3000; // 0~4095 중 약 73% 지점

void setup() {
  Serial.begin(115200);
  delay(300);

  pinMode(BTN_PIN, INPUT_PULLUP);

  ledcSetup(BUZZ_CH, 1000, BUZZ_RES);
  ledcAttachPin(BUZZ_PIN, BUZZ_CH);
  ledcWriteTone(BUZZ_CH, 0);

  Serial.println("Buzzer Project: Instrument <-> Alarm");
}

void loop() {
  // 1) 버튼으로 모드 전환
  int nowBtn = digitalRead(BTN_PIN);

  if (nowBtn != lastBtn) lastDebounce = millis();

  if (millis() - lastDebounce > debounceMs) {
    static int stableBtn = HIGH;

    if (nowBtn != stableBtn) {
      stableBtn = nowBtn;

      if (stableBtn == LOW) {
        mode = (mode + 1) % 2;
        Serial.print("MODE = ");
        Serial.println(mode);

        // 전환 시 소리 끄기/패턴 초기화
        ledcWriteTone(BUZZ_CH, 0);
        alarmOn = false;
        lastAlarm = millis();
      }
    }
  }
  lastBtn = nowBtn;

  // 2) 모드별 동작
  int adc = analogRead(POT_PIN); // 0~4095

  if (mode == 0) {
    // Instrument: 다이얼로 음높이 조절
    int freq = map(adc, 0, 4095, 200, 2000); // 200~2000Hz
    ledcWriteTone(BUZZ_CH, freq);

    // (선택) 너무 시끄러우면 출력 빈도 줄이기
    // Serial.println(freq);

  } else {
    // Alarm: 임계값 이상이면 경고 패턴, 아니면 무음
    if (adc >= THRESHOLD) {
      // 150ms ON / 150ms OFF 반복
      if (millis() - lastAlarm >= 150) {
        lastAlarm = millis();
        alarmOn = !alarmOn;
        ledcWriteTone(BUZZ_CH, alarmOn ? 1400 : 0);
      }
    } else {
      ledcWriteTone(BUZZ_CH, 0);
      alarmOn = false;
    }
  }
}

🧩 체크포인트(자주 틀리는 부분 TOP 10)

  1. 액티브 부저를 패시브처럼 쓰려 함 → 액티브 부저는 주파수 제어가 잘 안 됩니다(패시브 권장).
  2. 부저 극성 → +/−가 있는 제품은 방향을 확인하세요(안 울릴 수 있음).
  3. GND 공통 누락 → 부저(-)가 GND에 안 가면 소리가 안 납니다.
  4. 아날로그 핀 착각 → 가변저항 와이퍼는 GPIO34(ADC)로!
  5. 5V 연결 → ESP32는 3.3V 기준. 가변저항도 3.3V에 연결하세요.
  6. 시리얼 모니터 속도 → 115200 확인
  7. 소리가 너무 큼 → 부저를 손가락으로 살짝 눌러보거나, 케이스/테이프로 소리 구멍을 줄여보세요(물리적 감쇠).
  8. 경고 모드가 ‘끊김’ → delay를 쓰지 않고 millis로 패턴을 만든 이유를 이해해보세요.
  9. 버튼 튐으로 모드가 여러 번 바뀜 → debounceMs를 60~80으로 올려보세요.
  10. 특정 핀에서 이상 동작 → 보드에 따라 민감 핀이 있으니 BUZZ_PIN을 26/27로 바꿔 테스트하세요.

🚀 확장 과제(선택)

  • 과제 1: 전자악기 모드에서 도레미 음계로 “스냅(양자화)”되도록 만들기
    힌트: 음계 배열에서 가까운 값 선택
    // notes[] = {262, 294, 330, 349, 392, 440, 494, 523};
    // adc(0~4095)를 인덱스(0~7)로 매핑해서 notes[idx] 사용
  • 과제 2: 경고 모드에서 “삐-삐-삐---” 같은 패턴을 배열로 만들어 재생하기
  • 과제 3: LED(3강)까지 붙여서 “소리 + 빛” 경고 시스템으로 확장하기

📝 평가 루브릭(선택)

평가 요소 우수(4) 보통(3) 기초(2) 미흡(1)
부저 동작 주파수(Hz) 개념 설명 가능 삐- 소리 정상 출력 간헐적/불안정 출력 실패
멜로디/패턴 배열로 음/패턴 구성 가능 간단 멜로디 재생 일부 음만 재생 멜로디 실패
통합 프로젝트 모드 전환+임계값 동작 안정적 Instrument/Alarm 모두 동작 한 모드만 동작 프로젝트 실패
확장 과제 2개 이상 해결 + 설명 1개 해결 시도 흔적 미시도

⚠️ 유의사항

  • 패시브 부저가 가장 학습 효과가 큽니다(주파수 제어 가능).
  • ESP32는 3.3V 로직. 외부 모듈(5V) 연결 시 레벨 변환이 필요할 수 있어요.
  • delay를 남발하면 버튼/패턴이 끊깁니다. 가능하면 millis 패턴을 습관화하세요.

➡️ 다음 예고(5강)

  • 5강: 초음파 센서(HC-SR04)로 거리 측정 + 거리 기반 경고 시스템
  • 미니 프로젝트: 주차 거리 경보(거리별 LED/부저 단계)
반응형
반응형

ESP32 피지컬 컴퓨팅 강좌 3강. 아날로그 입력(가변저항) + PWM 출력(LED 밝기) + 무드등 프로젝트

대상: 1~2강(업로드/버튼 입력)을 완료한 입문자

이번 강의 목표: 가변저항 값을 읽어 LED 밝기를 자연스럽게 조절하고, “자동 페이드” 효과까지 적용한다.


🎬 도입 이야기(왜 이걸 배우나요?)

교실에서 “조명이 너무 밝아…” “분위기 있게 바꾸고 싶어!” 같은 말이 나오면,
진짜 제품들은 버튼이 아니라 부드럽게 밝기가 바뀌는 다이얼을 쓰죠.
오늘은 그 다이얼의 정체인 아날로그 입력과, LED를 진짜처럼 밝기 조절하는 PWM을 배웁니다.
결과물은 바로: 가변저항으로 조절되는 무드등 + 자동 페이드 모드!


✅ 3강 프로젝트

  • 프로젝트명: 다이얼 무드등(Manual) + 자동 페이드(Auto)
  • 결과:
    • 모드 0: 가변저항으로 LED 밝기 조절
    • 모드 1: LED가 자동으로 부드럽게 밝아졌다 어두워짐(페이드)
    • 버튼을 누르면 모드가 전환됨(2강 내용 연결)

🧰 준비물(BOM)

  • ESP32 개발보드 1개
  • 브레드보드 1개
  • 점퍼선 여러 개
  • LED 1개
  • 저항 220Ω 1개 (LED용)
  • 가변저항(포텐셔미터) 10kΩ 1개
  • (선택) 버튼 1개 (모드 전환용 / 2강에서 사용했던 것)

중요! ESP32는 아날로그 입력(ADC)이 가능한 핀과 “주의 핀”이 있습니다.
이 강의에서는 안전하게 GPIO34(입력 전용 ADC)를 사용합니다. (34~39는 입력 전용)


🧠 핵심 개념

1) 아날로그 입력(ADC)

디지털은 0/1만 읽지만, 아날로그는 “중간값”을 읽습니다.
ESP32의 analogRead()는 보통 0~4095 범위(12-bit)로 값을 반환합니다.

2) PWM(밝기 조절의 비밀)

LED 밝기는 전압을 ‘진짜로’ 바꾸는 게 아니라, 매우 빠르게 ON/OFF를 반복해 “평균”을 바꾸는 방식(PWM)으로 제어합니다.
ESP32(Arduino IDE)는 보통 analogWrite()가 보드에 따라 다르게 동작할 수 있어요.
그래서 여기서는 ESP32에서 가장 안정적인 LEDC(PWM) 방식으로 갑니다.


🔌 회로 연결표

A) LED 연결

  • ESP32 GPIO 2 → (220Ω) → LED 긴 다리(+)
  • LED 짧은 다리(-) → ESP32 GND

B) 가변저항(10kΩ) 연결

  • 가변저항 한쪽 끝 → ESP32 3.3V
  • 가변저항 반대쪽 끝 → ESP32 GND
  • 가변저항 가운데 핀(와이퍼) → ESP32 GPIO34

(선택) 버튼 연결(모드 전환)

  • 버튼 한쪽 → GND
  • 버튼 반대쪽 → GPIO15
  • 코드에서 INPUT_PULLUP 사용

🧪 실습 1: 가변저항 값 읽기(시리얼 모니터)

먼저 아날로그 값이 잘 읽히는지부터 확인합니다.

🧪 실습 코드 1: 가변저항(ADC) 값 확인
const int POT_PIN = 34;

void setup() {
  Serial.begin(115200);
  delay(300);
  Serial.println("Potentiometer ADC test...");
}

void loop() {
  int v = analogRead(POT_PIN);   // 보통 0~4095
  Serial.println(v);
  delay(120);
}

확인 포인트

  • 다이얼을 돌리면 값이 0 근처 ↔ 4095 근처로 부드럽게 변해야 합니다.
  • 값이 0만 나오면: 와이퍼(가운데 핀)가 GPIO34에 제대로 연결됐는지 확인하세요.

🧪 실습 2(핵심): 가변저항으로 LED 밝기 조절(LEDC PWM)

이제 아날로그 값을 “밝기”로 바꿔봅시다.
LED 밝기는 0~255 또는 0~1023 같은 범위로 매핑해 사용합니다. 여기서는 0~255로 씁니다.

🧪 실습 코드 2: 가변저항 → PWM 밝기
const int LED_PIN = 2;
const int POT_PIN = 34;

// LEDC(PWM) 설정
const int PWM_CH = 0;
const int PWM_FREQ = 5000;   // 5kHz (눈에 깜빡임이 거의 없음)
const int PWM_RES = 8;       // 8-bit: 0~255

void setup() {
  Serial.begin(115200);
  delay(300);

  ledcSetup(PWM_CH, PWM_FREQ, PWM_RES);
  ledcAttachPin(LED_PIN, PWM_CH);

  Serial.println("Pot -> PWM dimming start");
}

void loop() {
  int adc = analogRead(POT_PIN);           // 0~4095
  int duty = map(adc, 0, 4095, 0, 255);    // 0~255
  ledcWrite(PWM_CH, duty);

  Serial.print("ADC=");
  Serial.print(adc);
  Serial.print("  DUTY=");
  Serial.println(duty);

  delay(50);
}

✅ 3강 프로젝트: “무드등 + 자동 페이드” (버튼으로 모드 전환)

이번 프로젝트는 2강(버튼)과 3강(아날로그/PWM)을 합친 통합 미니 캡스톤입니다.
버튼을 누를 때마다 모드가 바뀝니다.

  • 모드 0: 다이얼(가변저항)로 밝기 조절
  • 모드 1: 자동 페이드(천천히 밝아졌다가 어두워짐)
✅ 프로젝트 코드: 무드등(Manual) + 자동 페이드(Auto) + 버튼 모드 전환
const int LED_PIN = 2;
const int POT_PIN = 34;
const int BTN_PIN = 15;

// PWM(LEDC)
const int PWM_CH = 0;
const int PWM_FREQ = 5000;
const int PWM_RES = 8;   // 0~255

// 모드: 0=Manual, 1=Auto Fade
int mode = 0;

// 버튼 디바운스(액티브 로우)
int lastBtn = HIGH;
unsigned long lastDebounce = 0;
const unsigned long debounceMs = 40;

// Auto Fade 상태
int duty = 0;
int stepDir = 1; // +1 또는 -1
unsigned long lastFade = 0;
const unsigned long fadeIntervalMs = 12; // 작을수록 더 부드럽고 빠름

void setup() {
  Serial.begin(115200);
  delay(300);

  pinMode(BTN_PIN, INPUT_PULLUP);

  ledcSetup(PWM_CH, PWM_FREQ, PWM_RES);
  ledcAttachPin(LED_PIN, PWM_CH);
  ledcWrite(PWM_CH, 0);

  Serial.println("Mood Lamp Start (Manual <-> Auto Fade)");
}

void loop() {
  // 1) 버튼 처리(모드 전환)
  int nowBtn = digitalRead(BTN_PIN);

  if (nowBtn != lastBtn) lastDebounce = millis();

  if (millis() - lastDebounce > debounceMs) {
    static int stableBtn = HIGH;

    if (nowBtn != stableBtn) {
      stableBtn = nowBtn;

      if (stableBtn == LOW) { // 눌림 확정
        mode = (mode + 1) % 2;
        Serial.print("MODE = ");
        Serial.println(mode);

        // 모드 전환 시 상태 초기화
        if (mode == 1) {
          duty = 0;
          stepDir = 1;
          lastFade = millis();
        }
      }
    }
  }
  lastBtn = nowBtn;

  // 2) 모드 동작
  if (mode == 0) {
    // Manual: 다이얼 밝기 조절
    int adc = analogRead(POT_PIN);
    int d = map(adc, 0, 4095, 0, 255);
    ledcWrite(PWM_CH, d);
  } else {
    // Auto Fade: duty 0~255 왕복
    if (millis() - lastFade >= fadeIntervalMs) {
      lastFade = millis();

      duty += stepDir;
      if (duty >= 255) { duty = 255; stepDir = -1; }
      if (duty <= 0)   { duty = 0;   stepDir =  1; }

      ledcWrite(PWM_CH, duty);
    }
  }
}

🧩 체크포인트(자주 틀리는 부분 TOP 9)

  1. 가변저항 가운데 핀(와이퍼) 착각 → “가운데 핀”이 GPIO34로 가야 합니다.
  2. 5V에 연결 → 가변저항 한쪽 끝은 반드시 3.3V로!
  3. GPIO34에 출력 연결 → 34~39는 입력 전용이라 LED를 연결하면 안 됩니다.
  4. LED가 어둡거나 안 켜짐 → LED 극성/저항(220Ω)/GND 공통 확인
  5. analogRead 값이 4095 근처로 고정 → 와이퍼가 3.3V에 직접 닿았거나 배선 오류
  6. 밝기 변화가 계단처럼 보임 → 8-bit는 0~255라 약간 계단감이 있을 수 있어요(확장 과제로 10-bit로 바꿔보기)
  7. 버튼 모드가 한 번에 여러 번 넘어감 → 디바운스(ms) 값을 60~80으로 올려보세요
  8. 시리얼 출력이 깨짐 → 보드레이트 115200 확인
  9. 핀 충돌 → 보드/환경에 따라 GPIO2/15가 민감하면 LED=4, 버튼=16 같은 핀으로 변경

🚀 확장 과제(선택)

  • 과제 1: PWM 해상도를 10-bit(0~1023)로 바꾸고 더 부드럽게 만들기
    힌트: 10-bit로 바꾸기
    // PWM_RES = 10 으로 변경 (0~1023)
    // duty 매핑도 0~1023으로 변경
    // ledcWrite(PWM_CH, duty);
  • 과제 2: Auto Fade 속도를 “다이얼”로 조절하기(가변저항=속도)
  • 과제 3: “야간 모드” 추가(밝기 상한을 80으로 제한)

📝 평가 루브릭(선택)

평가 요소 우수(4) 보통(3) 기초(2) 미흡(1)
아날로그 입력 0~4095 범위/원리 설명 가능 값이 정상 변화 값 변화가 불안정 값 확인 불가
PWM 제어 LEDC 설정/해상도 이해 밝기 조절 정상 동작 밝기 변화가 제한적 동작 안 됨
통합 프로젝트 모드 전환+페이드까지 안정적 Manual/Auto 모두 동작 한 모드만 동작 프로젝트 실패
확장 과제 2개 이상 해결 + 설명 1개 해결 시도 흔적 미시도

⚠️ 유의사항

  • 가변저항은 반드시 3.3V 기준으로 연결하세요(5V 금지).
  • ADC 핀은 노이즈가 있을 수 있어요. 값이 흔들리면 평균(필터)을 적용하면 안정됩니다(다음 강의에서 맛보기).
  • LED가 깜빡이는 게 보이면 PWM 주파수(FREQ)를 1000~5000 사이로 조절해보세요.

➡️ 다음 예고(4강)

  • 4강: 부저(피에조)로 소리 만들기 + “알림/경고” 시스템
  • 미니 프로젝트: 다이얼로 음높이 조절하는 전자악기 + 경고음(모드)
반응형
반응형

ESP32 피지컬 컴퓨팅 강좌 2강. 전기 기초(전압/전류/저항) + 브레드보드 실전 + 버튼 입력(풀업/풀다운)

대상: 1강에서 ESP32 업로드를 성공한 입문자

이번 강의 목표: 버튼 입력을 안정적으로 읽고, 눌렀을 때 LED가 동작하는 “모드 전환” 프로젝트를 완성한다.


🎬 도입 이야기(왜 이걸 배우나요?)

LED는 잘 깜빡이는데… 버튼을 연결하니 값이 0/1이 미친 듯이 튄다는 경험, 해보셨죠?
이건 “내가 뭘 잘못했나?”가 아니라 전기 신호가 떠있는(Floating) 상태라서 그래요.
오늘은 전기 기초를 딱 필요한 만큼만 잡고, 풀업/풀다운으로 버튼 입력을 ‘단단하게’ 만드는 날입니다.


✅ 2강 프로젝트

  • 프로젝트명: 버튼으로 “모드 전환 램프” 만들기
  • 결과: 버튼을 누를 때마다 LED 모드가 OFF → ON(고정) → BLINK(점멸)로 바뀐다.

🧰 준비물(BOM)

  • ESP32 개발보드 1개
  • 브레드보드 1개
  • 점퍼선(수-수) 여러 개
  • 택트 스위치(버튼) 1개
  • LED 1개
  • 저항 220Ω 1개 (LED용)
  • (선택) 저항 10kΩ 1개 (외부 풀다운 구성 시)

⚡ 핵심 개념(딱 필요한 만큼만)

  • 전압(V): 밀어주는 힘(수압 같은 느낌)
  • 전류(A): 실제로 흐르는 양(물의 흐름)
  • 저항(Ω): 흐름을 방해하는 정도(관의 굵기/마찰)

LED는 그냥 연결하면 과전류로 망가질 수 있어요. 그래서 220Ω 저항을 직렬로 꼭 넣습니다.

ESP32는 3.3V 로직입니다. 입력 핀에 5V를 넣으면 보드가 손상될 수 있어요.
버튼 연결은 3.3V / GND 기준으로 구성합니다.


🔌 회로 연결표

1) LED 연결(외부 LED 권장)

  • ESP32 GPIO 2 → (220Ω 저항) → LED 긴 다리(+)
  • LED 짧은 다리(-) → ESP32 GND

2) 버튼 연결(가장 추천: 내부 풀업 사용)

버튼은 “한쪽은 GND, 다른 한쪽은 GPIO”로 연결하고, 코드에서 INPUT_PULLUP을 사용합니다.
이 방식이 부품이 적고 안정적이라 수업/입문용으로 정말 좋습니다.

  • 버튼 한쪽 → ESP32 GND
  • 버튼 반대쪽 → ESP32 GPIO 15 (입력 핀)
  • 코드에서: pinMode(15, INPUT_PULLUP)

내부 풀업을 쓰면 평소에는 HIGH(1), 버튼을 누르면 GND로 연결되어 LOW(0)가 됩니다.
즉, 눌렀을 때 LOW가 나오는 “액티브 로우(Active LOW)” 형태예요.


🧪 실습 1: 버튼 값 확인(시리얼 모니터)

먼저 버튼이 제대로 읽히는지부터 확인해봅니다.

🧪 실습 코드 1: 버튼 입력(내부 풀업) 확인
const int BTN_PIN = 15;

void setup() {
  Serial.begin(115200);
  delay(300);

  pinMode(BTN_PIN, INPUT_PULLUP); // 내부 풀업: 기본 HIGH, 누르면 LOW
  Serial.println("Button test start (Active LOW)...");
}

void loop() {
  int v = digitalRead(BTN_PIN);
  Serial.println(v);   // 안 누르면 1, 누르면 0
  delay(150);
}

확인 포인트

  • 시리얼 모니터 Baud: 115200
  • 버튼을 안 누르면 1, 누르면 0이 나오면 성공

🧪 실습 2: 버튼으로 “모드 전환 램프” 만들기

버튼을 누를 때마다 모드가 바뀌도록 만들려면, “계속 누르는 동안”이 아니라 딱 한 번 눌린 순간만 잡아야 합니다.
또 버튼은 물리적으로 튀는 현상(바운스)이 있어서 디바운스가 필요합니다.

✅ 프로젝트 코드: 버튼으로 모드 전환(OFF → ON → BLINK)
const int LED_PIN = 2;
const int BTN_PIN = 15;

// 모드: 0=OFF, 1=ON, 2=BLINK
int mode = 0;

// 버튼 상태 추적(액티브 로우)
int lastBtn = HIGH;
unsigned long lastDebounce = 0;
const unsigned long debounceMs = 40;

// 블링크 타이밍
unsigned long lastBlink = 0;
const unsigned long blinkMs = 300;
bool ledState = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BTN_PIN, INPUT_PULLUP);

  Serial.begin(115200);
  delay(300);
  Serial.println("Mode Lamp Start (OFF->ON->BLINK)");
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  // 1) 버튼 읽기 + 디바운스
  int nowBtn = digitalRead(BTN_PIN);

  if (nowBtn != lastBtn) {
    lastDebounce = millis(); // 변화 감지 시각 갱신
  }

  // 변화가 안정된 후에만 "확정" 처리
  if (millis() - lastDebounce > debounceMs) {
    // 버튼이 HIGH->LOW로 바뀌는 순간(눌림)을 잡는다
    static int stableBtn = HIGH;

    if (nowBtn != stableBtn) {
      stableBtn = nowBtn;

      if (stableBtn == LOW) { // 눌림 확정
        mode = (mode + 1) % 3;
        Serial.print("MODE = ");
        Serial.println(mode);

        // 모드가 바뀌면 LED 상태 초기화
        if (mode == 0) digitalWrite(LED_PIN, LOW);
        if (mode == 1) digitalWrite(LED_PIN, HIGH);
        if (mode == 2) {
          ledState = false;
          digitalWrite(LED_PIN, LOW);
          lastBlink = millis();
        }
      }
    }
  }

  lastBtn = nowBtn;

  // 2) 모드 동작
  if (mode == 2) { // BLINK
    if (millis() - lastBlink >= blinkMs) {
      lastBlink = millis();
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState ? HIGH : LOW);
    }
  }
}

🧩 체크포인트(자주 틀리는 부분 TOP 8)

  1. INPUT_PULLUP인데 눌렀을 때 1이라고 생각함 → 내부 풀업은 눌렀을 때 LOW(0)입니다.
  2. 버튼 다리 방향 → 택트 스위치는 내부에서 2개씩 연결되어 있어요. 90도 회전해서 꽂으면 회로가 달라질 수 있습니다.
  3. GND 연결 빠짐 → GND를 공통으로 묶지 않으면 입력이 안정되지 않습니다.
  4. LED 극성 반대로 연결 → 긴 다리(+), 짧은 다리(-) 확인!
  5. 저항을 LED에 안 넣음 → LED 손상 가능. 220Ω은 거의 “필수 습관”입니다.
  6. GPIO 핀 선택 이슈 → 특정 GPIO는 부팅에 영향(스트랩 핀)이 있을 수 있어요. 문제 있으면 버튼 핀을 4/16/17 등으로 바꿔보세요.
  7. 업로드 실패 → 1강 체크(보드/포트/케이블/BOOT)부터 다시!
  8. 시리얼 보드레이트 불일치 → 115200으로 맞추기

🚀 확장 과제(선택)

  • 과제 1: 모드를 4개로 늘려서 “SOS 점멸” 모드 추가하기
  • 과제 2: 짧게 누르기/길게 누르기 구분해서 길게 누르면 OFF로 리셋
  • 과제 3: BLINK 속도를 버튼으로 조절(누를 때마다 100ms씩 빨라지기)

📝 평가 루브릭(선택)

평가 요소 우수(4) 보통(3) 기초(2) 미흡(1)
회로 구성 LED/버튼 연결을 스스로 점검·수정 안내대로 연결 완료 연결 오류가 있으나 도움으로 수정 회로가 완성되지 않음
입력 안정화 풀업/액티브로우 개념 설명 가능 버튼 입력이 안정적으로 동작 가끔 오동작 입력 튐/오동작 지속
모드 전환 디바운스 포함, 모드 로직 확장 가능 3모드 정상 전환 일부 모드만 동작 전환 불가
확장 과제 2개 이상 해결 + 이유 설명 1개 해결 시도 흔적 있음 미시도

⚠️ 유의사항

  • ESP32 입력 핀에는 5V를 직접 넣지 마세요(3.3V 로직).
  • 버튼 입력은 Floating(떠있는 상태)가 되지 않게 풀업/풀다운 중 하나를 반드시 적용하세요.
  • 수업 운영 팁: 먼저 “실습1(버튼 값 출력)”을 성공시키고, 그다음 모드 프로젝트로 넘어가면 실패율이 확 줄어듭니다.

➡️ 다음 예고(3강)

  • 3강: 아날로그 입력(가변저항) + PWM 출력(LED 밝기) + 부드러운 디밍
  • 미니 프로젝트: 가변저항으로 무드등 밝기 조절 + 자동 페이드 효과
반응형
반응형

ESP32 피지컬 컴퓨팅 강좌 1강. 준비물 & 개발환경(Arduino IDE) 세팅 + 첫 실습(LED Blink)

대상: ESP32를 처음 만져보는 입문자(학생/교사/메이커)

이번 강의 목표: ESP32 보드를 PC에 연결하고, Arduino IDE에서 첫 업로드(Hello Blink)를 성공한다.


🎬 도입 이야기(왜 이걸 배우나요?)

“수업 시간에 센서로 온도도 재고, 대시보드로 그래프도 띄워보자!”라고 마음먹었는데…
보드를 샀더니 가장 먼저 막히는 곳이 있습니다. 바로 ‘개발환경 세팅’이죠.
오늘은 ‘진짜 프로젝트 시작 전’ 가장 중요한 관문인 ESP32 첫 업로드를 끝내고,
다음 강의부터 센서/모터/통신을 마음껏 붙일 준비를 완료합니다.


✅ 1강 프로젝트

  • 프로젝트명: ESP32 “Hello Blink”
  • 결과: 보드의 LED가 1초마다 깜빡이고, 시리얼 모니터에 상태가 출력된다.

🧰 준비물(BOM)

  • ESP32 개발보드 1개 (권장: ESP32 DevKit V1, NodeMCU-32S, ESP32-WROOM 계열)
  • USB 케이블 1개
    • 충전 전용 케이블은 데이터 전송이 안 되어 인식 실패가 자주 납니다.
    • DevKit V1는 보통 Micro USB, 최신 보드는 USB-C일 수 있어요.
  • (선택) 외부 LED 1개 + 220Ω 저항 1개 + 브레드보드 + 점퍼선

🔌 회로 연결표(이번 강의)

방법 A) 보드 내장 LED 사용(가장 쉬움)

  • 대부분의 ESP32 보드는 내장 LED가 있습니다.
  • 다만 보드 종류에 따라 LED 핀이 다를 수 있어요. (그래서 아래에 LED 핀 확인법을 같이 안내합니다)

방법 B) 외부 LED 사용(확실한 방법)

연결표

  • ESP32 GPIO 2 → (220Ω 저항) → LED의 긴 다리(+) 아노드
  • LED의 짧은 다리(-) 캐소드 → ESP32 GND

주의: LED는 극성이 있어요. 반대로 꽂으면 안 켜집니다.


🧑‍💻 개발환경 세팅(Arduino IDE)

1) Arduino IDE 설치

  • Arduino IDE(2.x 권장)를 설치합니다.

2) ESP32 보드 매니저 추가

  1. Arduino IDE 실행
  2. File(파일) → Preferences(환경설정)
  3. Additional Boards Manager URLs에 아래 주소 추가
📌 Boards Manager URL
https://espressif.github.io/arduino-esp32/package_esp32_index.json

3) ESP32 보드 설치

  1. Tools(도구) → Board(보드) → Boards Manager(보드 매니저)
  2. esp32 검색
  3. “esp32 by Espressif Systems” 설치

4) 보드/포트 선택

  • Tools → Board에서 사용하는 보드 선택
    • 가장 무난: “ESP32 Dev Module”
    • 보드가 명확하면: NodeMCU-32S / DOIT ESP32 DEVKIT V1 등
  • Tools → Port에서 연결된 포트 선택

🧪 실습 코드(Hello Blink + 시리얼 출력)

아래 코드를 그대로 붙여넣고 업로드해보세요.

🧪 실습 코드: Hello Blink
// ESP32 1강: Hello Blink + Serial Monitor
// 외부 LED를 GPIO2에 연결했다면 그대로 OK
// 내장 LED를 쓰면 LED_BUILTIN이 동작하지 않는 보드도 있으니,
// 필요하면 LED_PIN 값을 2 또는 보드 내장 LED 핀에 맞게 바꾸세요.

const int LED_PIN = 2;   // 많이 쓰는 기본값(GPIO2). 보드에 따라 다를 수 있음.

void setup() {
  pinMode(LED_PIN, OUTPUT);

  Serial.begin(115200);
  delay(300); // 시리얼 안정화

  Serial.println("ESP32 Hello Blink Start!");
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  Serial.println("LED: ON");
  delay(1000);

  digitalWrite(LED_PIN, LOW);
  Serial.println("LED: OFF");
  delay(1000);
}

시리얼 모니터 확인

  • Tools → Serial Monitor 열기
  • Baud rate115200으로 설정
  • “LED: ON / OFF”가 1초마다 출력되면 성공!

🧩 체크포인트(자주 틀리는 부분 TOP 6)

  1. 케이블 문제: 충전 전용 케이블이면 포트가 안 잡힙니다. (데이터 케이블로 교체)
  2. 포트 선택: Tools → Port에서 포트를 잘못 고르면 업로드가 실패합니다.
  3. 보드 선택: “ESP32 Dev Module”로 시작하면 대부분 해결됩니다.
  4. 드라이버: 어떤 보드는 USB-시리얼 칩(CH340/CP2102)을 씁니다. PC에서 인식이 안 되면 드라이버 문제일 수 있어요.
  5. 부트 모드: 업로드 중 “Connecting…”에서 멈추면 보드의 BOOT 버튼을 눌러야 하는 경우가 있습니다.
  6. 내장 LED 핀: LED_BUILTIN이 안 먹히는 보드가 있어요. 그땐 외부 LED(GPIO2)로 테스트하면 확실합니다.

🚀 확장 과제(선택)

  • 과제 1: 깜빡이는 주기를 0.2초 / 2초로 바꿔보고 “왜 체감이 달라지는지” 설명해보기
  • 과제 2: ON/OFF 대신 “1~10 카운트”를 시리얼에 출력하기
  • 과제 3: 외부 LED를 GPIO4로 옮기고 코드에서 LED_PIN만 수정해보기

📝 평가 루브릭(선택)

평가 요소 우수(4) 보통(3) 기초(2) 미흡(1)
환경 세팅 보드/포트/시리얼 속도까지 스스로 설정 안내를 따라 설정 완료 부분 설정, 도움 필요 설정 실패
업로드 성공 오류 원인도 설명 가능 업로드 성공 여러 번 시도 후 성공 업로드 실패
동작 확인 LED + 시리얼 출력 모두 확인 둘 중 하나 확인 결과가 불안정 결과 확인 불가
확장 과제 2개 이상 해결 + 이유 설명 1개 해결 시도 흔적 있음 미시도

⚠️ 유의사항

  • ESP32는 3.3V 로직을 사용합니다. 5V 신호를 직접 넣으면 손상될 수 있어요.
  • GPIO는 보드마다 “사용 가능한 핀/부트 스트랩 핀”이 다릅니다. (추후 강의에서 안전 핀 정리합니다)
  • 업로드가 안 될 때는 보드/포트/케이블 3가지를 먼저 의심하세요.

➡️ 다음 예고(2강)

  • 2강: 전기 기초(전압/전류/저항) + 브레드보드 실전 + 버튼 입력(풀업/풀다운)
  • 미니 프로젝트: 버튼으로 모드 전환 램프(짧게/길게 누르기)
반응형

+ Recent posts