Webový server Raspberry Pi využívající Flask k ovládání GPIO

19.10.2022 Raspberry Pi #raspberrypi #flask #gpio

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/