091

[C/C++] ESP32에서 3가지 작업(LCD,Switch,UART) 반복처리하기 본문

Programming Language/C&C++

[C/C++] ESP32에서 3가지 작업(LCD,Switch,UART) 반복처리하기

공구일 2025. 4. 9. 04:07
728x90

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(시리얼 통신)나 네트워크 등 원격 입력으로 제어)
728x90