091
[C/C++] ESP32에서 3가지 작업(LCD,Switch,UART) 반복처리하기 본문
01. 핀 3개짜리 토글 스위치(Switch)
- SPDT(Single Pole Double Throw) : 3핀 스위치는 전자 회로에서 흔히 사용되는 스위치로, 하나의 입력(Common, 폴)과 두 개의 출력(Throw, 던)을 제공 -> 양쪽 출력 단자는 전기적으로 동등한 위치라서 VCC와 GND를 양쪽에 왼쪽/오른쪽 구분 없이 연결해주면 됨
02. 3가지 작업(LCD,Switch,UART) 유연하게 처리하기
- 하드웨어 :
- LCD : 빨간색(VCC)/검정색(GND)/노란색[SCL(Serial Clock Line),GPIO22] -> 클럭 신호(타이밍을 전송)/ 하얀색(SDA(Serial Data Line), GPIO21) -> 데이터 전송(내용) +) 비공식적 축약이라서 SDL이 아니라 SDA가 맞는게 맞음!! : 관련설명글 ->
(2025.03.24 - [Programming Language/C&C++] - [C/C++] LCD에 원하는 글자를 출력하기)
- Switch : 스위치의 경우, GPIO핀을 통해 디지털 입력값을 받아서 저장 후, 각 경우의 입력값을 LED로 연결되는 LED_PIN(출력)으로 출력해주는 것으로 별도의 신호를 처리하는 것 -> 그래서 LED 출력을 ON/OFF의 경우에서도 사용할 수 있는 것
//스위치가 HIGH == VCC(3.3V)
(ESP32의 3.3V) → (스위치의 Throw핀) → (스위치의 Common핀) → (ESP32의 GPIO 입력 핀, 예: GPIO 5)
//스위치가 LOW == GND(0V)
(ESP32의 GND) → (스위치의 Throw핀) → (스위치의 Common핀) → (ESP32의 GPIO 입력 핀, 예: GPIO 5)
- UART0을 이용하여 시리얼 버퍼에서 값을 입력받아 출력 : 관련설명글 ->
( 2025.03.15 - [Programming Language/C&C++] - [C/C++] ESP32와 Potentiometer를 이용하여 모드 설정 후 변경하기 )
- 소프트웨어 :
#include <Wire.h> // Include the I2C communication library
#include "LCD1602_Display.h" // Include the LCD1602_Display class
#define LED_PIN 4
#define SWITCH_PIN 5
#define PASSWORD "S113003391"
LCD1602_Display lcd(0x27, 16, 2); // Create LCD object with I2C address 0x27
bool userMode = false;
bool remoteMode = false;
void setup() {
Serial.begin(115200); // Initialize Serial Monitor
Wire.begin(21, 22); // Initialize I2C communication (SDA=21, SCL=22)
pinMode(LED_PIN, OUTPUT);
pinMode(SWITCH_PIN, INPUT);
lcd.init(); // Initialize the LCD display
lcd.displayText("Secure", 0, 0); // 초기 메시지 표시
}
void loop() {
int switchState = digitalRead(SWITCH_PIN);
//비밀번호 입력하기
if(!userMode && Serial.available()){
String password = Serial.readStringUntil('\n');
password.trim();
if(password == PASSWORD){
userMode = true;
lcd.displayText("Unlocked", 0, 0);
}
else Serial.println("NOT CORRECT PASSWORD, TRY AGAIN");
}
if(userMode){ //비밀번호로 통과해서 들어옴
if(Serial.available()){
String command = Serial.readStringUntil('\n');
command.trim();
if(command == "LMode"){
remoteMode = false;
}
else if(command == "RMode") remoteMode = true;
else Serial.println("Please Type LMode or RMode");
if(remoteMode){ //RMode
lcd.clearScreen();
lcd.displayText("Remote Control", 0, 0);
// ON/OFF 입력으로 받기
if(command == "ON") digitalWrite(LED_PIN,HIGH);
else if(command == "OFF") digitalWrite(LED_PIN,LOW);
}
}
if(!remoteMode) { //LMode
lcd.clearScreen();
lcd.displayText("Local Control", 0, 0);
if(switchState == HIGH) digitalWrite(LED_PIN,switchState);
else if(switchState == LOW) digitalWrite(LED_PIN,switchState);
delay(1000); // Delay for 1 second before updating
}
}
}
- 두 가지의 입력을 확인하는 부분을 유의해야함 ! 이 때 LMode, RMode와 함께 그 입력 변수를 이용하여 ON/OFF를 받는 것이 훨씬 유리함 & 로컬모드(!remoteMode)의 경우 입력값이 없으니 Serial.available() 블럭 밖에서 조건을 걸면 됨 !
비밀번호를 입력하고 들어옴 -> Local Mode(스위치나 버튼 등 물리적인 입력 장치로 제어) -- 기본
-> Remote Mode(UART(시리얼 통신)나 네트워크 등 원격 입력으로 제어)
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] ESP32와 MFRC522 연결해서 카드로 LED ON/OFF 하기 (0) | 2025.05.13 |
---|---|
[C/C++] ESP32에서 RTOS 사용하여 3가지 작업 유연하게 처리하기 (0) | 2025.04.13 |
[C/C++] ESP32에서 EEPROM 저장하기 (0) | 2025.04.08 |
[C/C++] LCD에 원하는 글자를 출력하기 (4) | 2025.03.24 |
[C/C++] ESP32와 Potentiometer를 이용하여 모드 설정 후 변경하기 (4) | 2025.03.15 |