- LED on/off : 버튼 클릭할때마다 on, off 제어
- LED 무드등(밝기 조절) : 버튼 클릭할때마다 점점 밝아지고, 점점 어두워지도록 구현
- 부저센서출력 : 버튼 클릭하면 도레미파솔라시 부저센서 출력
- 초음파센서 : 버튼 클릭하면 10번 측정후에 최소거리값을 웹에 출력
- python -m pip install --upgrade flask 를 통해 설치
- Flask를 활용하면 웹에서 데이터를 받아올 수 있다.
- 장식자를 활용하여 URL 연결에 활용되고, 다음 행의 함수부터 장식자가 적용된다.
from flask import Flask
app = Flask(__name__)
@app.route('/') # 맨 앞에 @는 장식자(decorator)로, 함수 코드를 바꾸지 않아도 장식자 안의 내용만 바꿔서 함수의 동작을 조절할 수 있다.
# ('/') 에서 주소 뒤에 '/매개변수' 을 이용하면 매개변수에 해당되는 함수가 실행된다.
def home():
return render_template("index.html") # 처음 실행했을때 index.html 웹이 로드된다.
if __name__ == "__main__":
app.run()
- GPIO.setmode(GPIO.BCM) : 핀 번호를 GPIO모듈 번호로 사용 / (GPIO.BOARD) : 핀 번호를 보드번호를 참조
- GPIO.setup(Pin,GPIO.IN or OUT) : 핀 번호에서 전류를 보내는지 받는지 설정
- GPIO.PWM(Pin,Frequency) : 초당 펄스의 주파수를 유지한 채, 펄스의 길이를 변화시킴 (출력 조절)
- ON / OFF 버튼을 활용해 LED ON/OFF 제어
- POST를 통해 value 전달
- request.form['led']로 ON/OFF에 대한 값을 받는다.
# LED on, off 버튼으로 LED 제어
@app.route('/data/led', methods= ['POST'])
def led():
data = request.form['led']
if data == "on":
GPIO.output(ledonoff, 1)
elif data == "off":
GPIO.output(ledonoff, 0)
return home()
<h1>LED ON OFF</h1>
<form action='/data/led' method='post'>
<button type="submit" name="led" value="on">ON</button>
<button type="submit" name="led" value="off">OFF</button>
</form>
- PWM(Pulse Width Modulation : 펄스폭 변조) 방식으로 LED의 밝기를 조절하여 무드등을 구현
- brighter/darker 버튼에 따라 request.form['pwm']에 값이 할당되고, for문으로 ChangeDutyCycle을 이용하여 밝기 조절
# 무드등의 on 클릭하면 LED가 점점 밝아지고, off를 클릭하면 LED가 점점 어두워진다.
@app.route('/data/ledmood', methods = ['POST'])
def ledmood():
global i
data = request.form['pwm']
p.start(0)
try:
if data == "+":
for i in range(20):
p.ChangeDutyCycle(5*i)
time.sleep(0.1)
elif data == "-":
for i in reversed(range(20)):
p.ChangeDutyCycle(i)
time.sleep(0.1)
except KeyboardInterrupt:
print()
GPIO.cleanup()
return home()
<h1>PWM LED</h1>
<form action='/data/ledmood' method='post'>
<button type="submit" name="pwm" value="+">brighter</button>
<button type="submit" name="pwm" value="-">darker</button>
</form>
- buzzer 버튼을 클릭했을때 도레미파솔라시 의 음을 출력
- Buzzer 센서에 알맞는 주파수 값을 미리 정적으로 배열에 넣어주고, for문으로 순서대로 출력
# 부저 버튼을 클릭했을시 도레미파솔라시 출력
@app.route('/data/buzz', methods = ['POST'])
def Buzzsong():
data = request.form['buzz']
Melody = [261, 294, 329, 349, 440, 493, 523]
try:
if data == "on":
Buzz.start(90)
for i in range(0, len(Melody)):
Buzz.ChangeFrequency(Melody[i])
time.sleep(0.3)
Buzz.stop()
time.sleep(1)
except KeyboardInterrupt:
print()
GPIO.cleanup()
return home()
<h1>Buzzer</h1>
<form action='/data/buzz' method='post'>
<button type="submit" name="buzz" value="on">buzzer</button>
</form>
- 'Measure' 버튼을 클릭하면 초음파센서가 10번을 측정하는데, 10번 중 최소값을 웹에 출력한다.
# 거리를 10번 측정하고 최소값을 웹으로 쏴줍니다
@app.route('/data/ultra', methods = ['POST'])
def Ultra():
try:
global min
min = 700.0
for _ in range(10):
GPIO.output(triggerPin, GPIO.LOW)
time.sleep(0.00001)
GPIO.output(triggerPin, GPIO.HIGH)
while GPIO.input(echoPin) == 0:
start = time.time()
while GPIO.input(echoPin) == 1:
stop = time.time()
rtTotime = stop - start
distance = rtTotime * ( 34000 / 2 )
distance = round(distance, 2)
print("distance : %.2f cm" %distance)
time.sleep(0.2)
if min > distance:
min = distance
except KeyboardInterrupt:
print()
GPIO.cleanup()
return render_template("index2.html", distance = min) # 최소값을 웹에 전달
<h1>UltraSonic Sensor</h1>
<form action='/data/ultra' method='post'>
<h4>{{distance}} cm</h4>
<button type="submit" name="ultra" value="on">Measure</button>
</form>