V tomto projektu vytvoříme samostatný webový server s Raspberry Pi, který může přepínat dvě LED. Tyto LED diody můžeme nahradit libovolným výstupem (jako je relé nebo tranzistor). K vytvoření webového serveru bude vyžívat mikrorámec Pythonu s názvem Flask.
Základní nastavení Raspberry Pi
Před aplikací Flask a programování GPIO pomocí tohoto mikrorámce Pythonu je nutné mít na RPi, nainstalovaný operační systém Raspbian. Chcete -li nainstalovat Raspbian a dokončit základní nastavení, můžete si přečíst průvodce Instalce Raspberry Pi, nastavení WiFi a SSH.
Instalace Flask
K přeměně Raspberry Pi na webový server použijeme mikrorámec Pythonu s názvem Flask.
Chcete-li nainstalovat Flask, musíte mít nainstalovaný pip. Spusťte následující příkazy pro aktualizaci vašeho Pi a instalaci pip:
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo apt-get install python-pip python-flask
Poté pomocí pip nainstalujete Flask a jeho závislosti:
pi@raspberrypi ~ $ sudo pip install flask
Schéma
Schéma tohoto projektu je poměrně jednoduché. Jednoduše see připojí dvě LED k pinům GPIO 23 a GPIO 24, jak ukazuje obrázek níže.
Vytvoření skriptu v Python
Toto je základní skript aplikace. Nastaví webový server a spolupráci s Raspberry Pi GPIO.
Chcete-li mít vše uspořádané, začněte vytvořením nové složky:
pi@raspberrypi ~ $ mkdir web-server
pi@raspberrypi ~ $ cd web-server
pi@raspberrypi:~/web-server $
Vytvořte nový soubor app.py
pi@raspberrypi:~/web-server $ nano app.py
Zkopírujte a vložte následující skript do svého Raspberry Pi
import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)
GPIO.setmode(GPIO.BCM)
# Create a dictionary called pins to store the pin number, name, and pin state:
pins = {
23 : {'name' : 'GPIO 23', 'state' : GPIO.LOW},
24 : {'name' : 'GPIO 24', 'state' : GPIO.LOW}
}
# Set each pin as an output and make it low:
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
@app.route("/")
def main():
# For each pin, read the pin state and store it in the pins dictionary:
for pin in pins:
pins[pin]['state'] = GPIO.input(pin)
# Put the pin dictionary into the template data dictionary:
templateData = {
'pins' : pins
}
# Pass the template data into the template main.html and return it to the user
return render_template('main.html', **templateData)
# The function below is executed when someone requests a URL with the pin number and action in it:
@app.route("/<changePin>/<action>")
def action(changePin, action):
# Convert the pin from the URL into an integer:
changePin = int(changePin)
# Get the device name for the pin being changed:
deviceName = pins[changePin]['name']
# If the action part of the URL is "on," execute the code indented below:
if action == "on":
# Set the pin high:
GPIO.output(changePin, GPIO.HIGH)
# Save the status message to be passed into the template:
message = "Turned " + deviceName + " on."
if action == "off":
GPIO.output(changePin, GPIO.LOW)
message = "Turned " + deviceName + " off."
# For each pin, read the pin state and store it in the pins dictionary:
for pin in pins:
pins[pin]['state'] = GPIO.input(pin)
# Along with the pin dictionary, put the message into the template data dictionary:
templateData = {
'pins' : pins
}
return render_template('main.html', **templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, debug=True)
Oddělení obsahu od skriptu v Python je způsob, jak udržet svůj projekt organizovaný.
Flask používá šablonovací stroj nazvaný Jinja2, který lze použít k odesílání dynamických dat ze skriptu Python do souboru HTML.
Vytvořte novou složku s názvem šablony:
pi@raspberrypi:~/web-server $ mkdir templates
pi@raspberrypi:~/web-server $ cd templates
pi@raspberrypi:~/web-server/templates $
Vytvořte nový soubor pod názvem main.html
pi@raspberrypi:~/web-server/templates $ nano main.html
Zkopírujte následující kód do RPi:
<!DOCTYPE html>
<head>
<title>RPi Web Server</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
</head>
<body>
<h1>RPi Web Server</h1>
{% for pin in pins %}
<h2>{{ pins[pin].name }}
{% if pins[pin].state == true %}
is currently <strong>on</strong></h2><div class="row"><div class="col-md-2">
<a href="/{{pin}}/off" class="btn btn-block btn-lg btn-default" role="button">Turn off</a></div></div>
{% else %}
is currently <strong>off</strong></h2><div class="row"><div class="col-md-2">
<a href="/{{pin}}/on" class="btn btn-block btn-lg btn-primary" role="button">Turn on</a></div></div>
{% endif %}
{% endfor %}
</body>
</html>
Spuštění webového serveru
Chcete-li spustit webový server Raspberry Pi, přesuňte se do složky, která obsahuje soubor app.py:
pi@raspberrypi:~/web-server/templates $ cd ..
Poté spusťte následující příkaz:
pi@raspberrypi:~/web-server $ sudo python app.py
Váš webový server by se měl okamžitě spustit!
Demonstrace
Otevřete adresu Raspberry Pi v prohlížeči zadáním její IP adresy, např.: http://192.168.1.98/.
Literatura:
[1] Raspberry Pi Web Server using Flask to Control GPIOs. Random Nerd Tutorials [online]. Random Nerd Tutorials, 2022 [cit. 2022-09-28]. Dostupné z: https://randomnerdtutorials.com/raspberry-pi-web-server-using-flask-to-control-gpios/
[2] Serving Raspberry Pi with Flask. Matt Richardson Creative Technologist [online]. Matt Richardson Creative Technologist, 2022 [cit. 2022-09-28]. Dostupné z: http://mattrichardson.com/Raspberry-Pi-Flask/