Processor

【라즈베리파이】 웹 서버를 이용하여 LED On/Off 하기

작성자 임베디드코리아 작성일26-05-29 01:01 조회124회 댓글0건
[ 1 ] 모듈을 임포트한다
      ____________________________
      import RPi.GPIO as GPIO
      ____________________________

      ◆ 라즈베리파이(Raspberry Pi)의 GPIO(General Purpose Input/Output) 핀을
          제어하기 위해 해당 라이브러리를 불러온다.
      ◆ RPi.GPIO: 라즈베리파이 재단에서 제공하는 공식 파이썬 라이브러리로,
                      라즈베리파이 OS에 기본적으로 내장되어 있다.
      ◆ as GPIO: 라이브러리 이름을 그대로 쓰면 코드가 길어지기 때문에, 타이핑을 줄이고
                      가독성을 높이기 위해 'GPIO'라는 짧은 별칭(Alias) 으로 지정하는 파이썬 문법이다.

[ 2 ] 핀 넘버를 부르는 방식을 선택한다
      ___________________
        GPIO.setmode()
      ---------------------------
      : 핀 번호를 참조하는 방식에 대한 함수이다

      ◆ GPIO.setmode(GPIO.BOARD) 와 GPIO.setmode(GPIO.BCM)
          두가지 모드가 있다.

          ▶ GPIO.BOARD 는 보드의 물리적 핀번호를 기준하여 라즈베리파이 제어시 사용되며,
              이러한 유형의 번호부여 장점은 SBC보드가 변경이 되어도 소스코드의 변경 되지 않는
              장점이 있다.

          ▶ GPIO.BCM는 Broadcom SOC 채널에 의한 핀을 참조하는 GPIO모듈 번호이다.
              Broadcom SOC 채널 지정을 나타내며 버전 번호가 변경되면 BCM 채널이 변경 된다.

          ex) BOARD 모드의 11번 핀 = BCM 모드의 17번 핀

          ** 여러 버전의 라즈베리파이를 사용할 계획이 있다면 GPIO.BCM보다 GPIO.BOARD가 더 안전 할 수 있다.**

[ 3 ] 핀 모드를 설정한다
      ___________________________________
        출력 :  GPIO.setup(18, GPIO.OUT)
        입력 :  GPIO.setup(18, GPIO.IN)
      ----------------------------------------------------

      list를 사용해 한번에 여러 핀을 설정 할 수도 있고, output 모드로 설정하는 경우 초기값을 줄 수도 있다.
        ____________________________________________________
​          GPIO.setup([18, 19, 20], GPIO.OUT, initial=GPIO.HIGH)
        ------------------------------------------------------------------------------

[ 4 ] 핀에서 값을 입력(input) 한다.
      ___________________________
        변수 = GPIO.input(channel)
      -----------------------------------------
        참 : True, 1, GPIO.HIGH
        거짓 : False, 0, GPIO.LOW

[ 5 ] 핀에서 값을 입력(input) 한다.
        ___________________________
        GPIO.output(channel, state)
        -----------------------------------------
        state ==>
        참 : True, 1, GPIO.HIGH
        거짓 : False, 0, GPIO.LOW

[ 6 ] 리소스 비우기
      ________________
        GPIO.cleanup()
      -----------------------

$ python -m pip config set global.break-system-packages true
$ pip install python-socketio uvicorn fastapi

● 웹 서버를 이용하여 LED를 ON, OFF 한다.

---< flask_WebServer_LED.py >--------------------------------------------
from flask import Flask, render_template_string
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)

app = Flask(__name__)

led_state = "off"
def led_onoff(led_state):
    print("led_state : ",led_state)
    if led_state == 1:
        GPIO.output(23, 1)
    elif led_state == 0:
        GPIO.output(23, 0)

control_page = """
<script>
function btn_click(state)
{
    if(state == 0){
        state = 1;
    } else {
        state = 0;
    }
    window.location.href='/' + state
}
</script>

<input type='button' onClick='btn_click({{gpio23}})' value='led switch'/>
"""

@app.route('/')
@app.route('/<state>')
def led_start(state="n"):
    print("state : ",state)
    if state != "n" and state != "favicon.ico":
        led_onoff(int(state))
        return render_template_string(control_page, gpio23=int(state))
    else :
        return render_template_string(control_page, gpio23=0)

if __name__ == '__main__':
    app.run(host='192.168.1.65', debug=True, port=5000)
------------------------------------------------------------------------------
$ python flask_WebServer_LED.py

실행 시키고
웹 브라우저에서
http://192.168.1.65:5000
으로 접속한다.