[ 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
으로 접속한다.