Raspberry Pi é um computador do tamanho de um cartão de crédito. Liga-se de forma convencional a um monitor de computador ou uma TV, usando um teclado e um rato standard. Foi desenvolvido no Reino Unido pela Fundação Raspberry Pi, com o objetivo é promover o ensino de Ciência da Computação nas escolas.
Mais informação em https://www.raspberrypi.org/.
Este computador tem um preço acessível e o hardware que iremos usar tem, no máximo, um preço de aquisição de 60€. Consiste num Raspberry PI 3 Model B+, um buzzer e um sensor de temperatura DHT-11 (de 3 pinos com resistência incorporada).
Por exemplo, só o Raspberry PI está a custar cerca de 40€ neste site: https://mauser.pt/catalog/product_info.php?products_id=81510&src=raspberrypi.
Com este tutorial, pretende-se desenvolver um projeto que demonstre as seguintes funcionalidades:
A arquitetura básica do Raspberry PI;
O essencial do Raspberian (versão de Linux Debian);
Como se programa em Python para controlar dispositivos de hardware externos;
Como se desenvolve uma aplicação básica web utilizando a framework Flask.
Mãos à obra...
A arquitetura básica do Raspberry PI
O hardware deste modelo de Raspberry PI tem os conectores habituais: portas usb, hdmi, ethernet (rede cabelada) e wifi. O SO foi previamente carregado para um SD Card. Além deste conectores tem o GPIO que permite ligar outros dispositivos que se podem adquirir facilmente e a baixo custo.
Para além do computador, vamos ligar um buzzer e um sensor de temperatura e humidade (DHT-11).
Como se liga o DHT-11:
Notas:
O fio vermelho liga à alimentação de 5V (PWR/+);
o fio preto à massa (GND/-);
o azul ao GPIO 4 (usado para a comunicação de dados).
Como se liga o buzzer:
O fio vermelho liga à alimentação de 5V (PWR/+);
o fio preto à massa (GND/-);
o amarelo ao GPIO 3 (usado para a comunicação de dados).
Não tem que ser necessariamente assim, mas neste exemplo é desta forma que esta ligado.
O essencial do Raspberian (versão de Linux Debian)
Para que o desenvolvimento da nossa aplicação esteja facilitado é preciso conhecer o essencial do Linux. Desde logo, como aceder remotamente ao computador.
Para que tal seja possível é preciso (diretamente no Raspberry com um monitor, teclado e rato):
Garantir que o SHH (remote shell) está ativada (utilize o raspi-config para configurar);
Conhecer o endereço IP do raspberry (comando ifconfig);
Instalar, por exemplo, o Putty para aceder de uma máquina Windows.
raspi-config (da linha de comando/shell, dar o comando - sudo raspi-config):
ifconfig:
putty:
Para programar o buzzer temos que usar uma biblioteca com nome RPi (que já vem instalada, por defeito).
Assim, podemos usar o script:
import time
from RPi import GPIO
PIN = 3
BUZZER_REPETITIONS = 600
BUZZER_DELAY = 0.001
PAUSE_TIME = 0.3
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)
try:
for counter in range(BUZZER_REPETITIONS):
for value in [True, False]:
GPIO.output(PIN, value)
time.sleep(BUZZER_DELAY)
time.sleep(PAUSE_TIME)
except KeyboardInterrupt:
print('exit by user')
finally:
GPIO.cleanup() # this ensures a clean exit
Note-se que este script foi desenvolvido para o Python 3 e o seu Raspberry pode ter configurada a utilização da versão 2, por defeito. Para alterar a versão, siga os passos:
https://linuxconfig.org/how-to-change-from-default-to-alternative-python-version-on-debian-linux
Para programar o DHT-11, temos que instalar uma biblioteca que permite controlar este dispositivo: Adafruit_DHT, Esta biblioteca pode ser instalada a partir de https://github.com/adafruit/Adafruit_Python_DHT.
import Adafruit_DHT as Sensor
humidity, temperature = Sensor.read_retry(Sensor.DHT11, 4)
print("Temperature {0}º, Humidity {1}%".format(temperature,humidity))
Como se desenvolve uma aplicação básica web utilizando a framework Flask
Para a integração de todas estas peças de hardware e de código, vamos desenvolver uma aplicação web, que usa uma framework chamada Flask.
Optou-se por esta framework porque é o que designa por microframework, pelo facto de ser de uma grande simplicidade e não ser demasiadamente pesada para uma máquina com poucos recursos com é o Raspberry Pi.
Uma aplicação Flask básica, só precisa do seguinte código (app.py):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
Combinando todas as "peças" obtemos o seguinte:
helpers.py:
import time
from RPi import GPIO
import Adafruit_DHT as Sensor
from datetime import datetime
from threading import Thread
PIN = 3
BUZZER_REPETITIONS = 600
BUZZER_DELAY = 0.001
PAUSE_TIME = 0.3
def buzzer(repetitions=None):
if repetitions is None:
repetitions = BUZZER_REPETITIONS
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)
try:
for counter in range(repetitions):
for value in [True, False]:
GPIO.output(PIN, value)
time.sleep(BUZZER_DELAY)
time.sleep(PAUSE_TIME)
finally:
GPIO.cleanup() # this ensures a clean exit
def sensor():
humidity, temperature = Sensor.read_retry(Sensor.DHT11, 4)
d = {'humidity': humidity, 'temperature': temperature,
'datetime': datetime.strftime(datetime.now(), "%d-%m-%y %H:%M:%S")}
return d
class Readings(Thread):
def __init__(self):
self.sensor_read = []
Thread.__init__(self)
def get_readings(self):
return self.sensor_read
def run(self):
while True:
humidity, temperature = Sensor.read_retry(Sensor.DHT11, 4)
print("Temperature {0}º, Humidity {1}%".format(temperature, humidity))
d = {'humidity': humidity, 'temperature': temperature,
'datetime': datetime.strftime(datetime.now(), "%d-%m-%y %H:%M:%S")}
self.sensor_read.append(d)
self.sensor_read = self.sensor_read[-10:]
buzzer()
time.sleep(60 * 1)
app.py:
from flask import Flask
from flask import render_template
from helpers import *
import json
app = Flask(__name__)
app.config['DEBUG'] = False
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/buzzer')
@app.route('/buzzer/<int:repetitions>')
def view_buzzer(repetitions=None):
buzzer(repetitions)
return 'Buzzer activated!'
@app.route('/sensor-data')
def view_sensor_data():
d = sensor()
return json.dumps(d)
@app.route('/sensor')
def view_sensor():
d = sensor()
return render_template('sensor.html',
temperature=d['temperature'],
humidity=d['humidity'],
datetime=d['datetime'])
@app.route('/last')
def view_last():
return render_template('last.html',
sensor_read=r.get_readings())
if __name__ == '__main__':
r = Readings()
r.daemon = True
r.start()
app.run(host='0.0.0.0', port=5000)