digitalWrite(PIN_RED, HIGH); // 레드 켜기digitalWrite(PIN_YELLOW, LOW); //digitalWrite(PIN_GREEN, LOW);delay(RED_TIME); // 일정 시간 동안 레드 LED를 켜둠
ESP32 코드
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-traffic-light */#define PIN_RED 25 // ESP32 핀 GPIO25가 트래픽 라이트 모듈의 R 핀에 연결됨#define PIN_YELLOW 26 // ESP32 핀 GPIO26가 트래픽 라이트 모듈의 Y 핀에 연결됨#define PIN_GREEN 27 // ESP32 핀 GPIO27이 트래픽 라이트 모듈의 G 핀에 연결됨#define RED_TIME 4000 // 밀리초 단위의 RED 시간#define YELLOW_TIME 4000 // 밀리초 단위의 YELLOW 시간#define GREEN_TIME 4000 // 밀리초 단위의 GREEN 시간voidsetup() {pinMode(PIN_RED, OUTPUT);pinMode(PIN_YELLOW, OUTPUT);pinMode(PIN_GREEN, OUTPUT);}// loop 함수는 계속해서 반복 실행됨voidloop() {// 빨간 불 켜기digitalWrite(PIN_RED, HIGH); // 켜기digitalWrite(PIN_YELLOW, LOW); // 끄기digitalWrite(PIN_GREEN, LOW); // 끄기delay(RED_TIME); // 일정 시간 동안 빨간 불 유지// 노란 불 켜기digitalWrite(PIN_RED, LOW); // 끄기digitalWrite(PIN_YELLOW, HIGH); // 켜기digitalWrite(PIN_GREEN, LOW); // 끄기delay(YELLOW_TIME); // 일정 시간 동안 노란 불 유지// 초록 불 켜기digitalWrite(PIN_RED, LOW); // 끄기digitalWrite(PIN_YELLOW, LOW); // 끄기digitalWrite(PIN_GREEN, HIGH); // 켜기delay(GREEN_TIME); // 일정 시간 동안 초록 불 유지}
특정 디자인과 지역 및 교차로에 사용되는 기술에 따라 신호등의 정확한 작동 방식이 다를 수 있다는 점을 유의하는 것이 중요합니다. 위에 설명된 원칙들은 교통 관리와 도로 안전을 높이기 위해 신호등이 어떻게 작동하는지에 대한 일반적인 이해를 제공합니다.
위의 코드는 개별 조명 제어를 보여줍니다. 이제, 코드를 더 잘 최적화하기 위해 개선해 보겠습니다.
ESP32 코드 최적화
조명 제어 기능을 구현하여 코드를 개선합시다.
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-traffic-light */#define PIN_RED 25 // ESP32 핀 GPIO25가 교통신호등 모듈의 R 핀에 연결됨#define PIN_YELLOW 26 // ESP32 핀 GPIO26가 교통신호등 모듈의 Y 핀에 연결됨#define PIN_GREEN 27 // ESP32 핀 GPIO27이 교통신호등 모듈의 G 핀에 연결됨#define RED_TIME 2000 // 밀리초 단위의 RED 시간#define YELLOW_TIME 1000 // 밀리초 단위의 YELLOW 시간#define GREEN_TIME 2000 // 밀리초 단위의 GREEN 시간#define RED 0 // 배열에서의 인덱스#define YELLOW 1 // 배열에서의 인덱스#define GREEN 2 // 배열에서의 인덱스constint pins[] = { PIN_RED, PIN_YELLOW, PIN_GREEN };constint times[] = { RED_TIME, YELLOW_TIME, GREEN_TIME };voidsetup() {pinMode(PIN_RED, OUTPUT);pinMode(PIN_YELLOW, OUTPUT);pinMode(PIN_GREEN, OUTPUT);}// loop 함수는 계속해서 반복 실행됩니다voidloop() {// 빨간 불 켜기 trafic_light_on(RED);delay(times[RED]); // 일정 시간 동안 빨간 불 유지// 노란 불 켜기 trafic_light_on(YELLOW);delay(times[YELLOW]); // 일정 시간 동안 노란 불 유지// 초록 불 켜기 trafic_light_on(GREEN);delay(times[GREEN]); // 일정 시간 동안 초록 불 유지}void trafic_light_on(int light) {for (int i = RED; i <= GREEN; i++) {if (i == light)digitalWrite(pins[i], HIGH); // 켜기elsedigitalWrite(pins[i], LOW); // 끄기 }}
포 루프를 사용하여 코드를 개선해 봅시다.
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-traffic-light */#define PIN_RED 25 // ESP32 핀 GPIO25가 신호등 모듈의 R 핀에 연결됨#define PIN_YELLOW 26 // ESP32 핀 GPIO26가 신호등 모듈의 Y 핀에 연결됨#define PIN_GREEN 27 // ESP32 핀 GPIO27이 신호등 모듈의 G 핀에 연결됨#define RED_TIME 2000 // 밀리초 단위의 빨간색 시간#define YELLOW_TIME 1000 // 밀리초 단위의 노란색 시간#define GREEN_TIME 2000 // 밀리초 단위의 초록색 시간#define RED 0 // 배열에서의 인덱스#define YELLOW 1 // 배열에서의 인덱스#define GREEN 2 // 배열에서의 인덱스constint pins[] = {PIN_RED, PIN_YELLOW, PIN_GREEN};constint times[] = {RED_TIME, YELLOW_TIME, GREEN_TIME};voidsetup() {pinMode(PIN_RED, OUTPUT);pinMode(PIN_YELLOW, OUTPUT);pinMode(PIN_GREEN, OUTPUT);}// loop 함수는 계속해서 반복 실행됨voidloop() {for (int light = RED; light <= GREEN; light ++) { trafic_light_on(light);delay(times[light]); // 일정 시간 동안 불을 켬 }}void trafic_light_on(int light) {for (int i = RED; i <= GREEN; i ++) {if (i == light)digitalWrite(pins[i], HIGH); // 켜기elsedigitalWrite(pins[i], LOW); // 끄기 }}
Delay() 대신 millis() 함수를 사용하자면 코드를 개선할 수 있습니다.
/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-traffic-light */#define PIN_RED 25 // ESP32 핀 GPIO25가 교통 신호등 모듈의 R 핀에 연결됨#define PIN_YELLOW 26 // ESP32 핀 GPIO26가 교통 신호등 모듈의 Y 핀에 연결됨#define PIN_GREEN 27 // ESP32 핀 GPIO27이 교통 신호등 모듈의 G 핀에 연결됨#define RED_TIME 2000 // 밀리초 단위의 빨간색 시간#define YELLOW_TIME 1000 // 밀리초 단위의 노란색 시간#define GREEN_TIME 2000 // 밀리초 단위의 초록색 시간#define RED 0 // 배열의 인덱스#define YELLOW 1 // 배열의 인덱스#define GREEN 2 // 배열의 인덱스constint pins[] = { PIN_RED, PIN_YELLOW, PIN_GREEN };constint times[] = { RED_TIME, YELLOW_TIME, GREEN_TIME };unsignedlong last_time = 0;int light = RED; // 빨간색 불부터 시작voidsetup() {pinMode(PIN_RED, OUTPUT);pinMode(PIN_YELLOW, OUTPUT);pinMode(PIN_GREEN, OUTPUT); trafic_light_on(light); last_time = millis();}// loop 함수는 계속해서 무한 반복됨voidloop() {if ((millis() - last_time) > times[light]) { light++;if (light >= 3) light = RED; // 새로운 사이클 trafic_light_on(light); last_time = millis(); }// 할 일: 여러분의 다른 코드}void trafic_light_on(int light) {for (int i = RED; i <= GREEN; i++) {if (i == light)digitalWrite(pins[i], HIGH); // 켜기elsedigitalWrite(pins[i], LOW); // 끄기 }}
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.