Raspberry Pi
Tutorial de Rapberry Pi en español.
- Juan Antonio Villalpando -
Volver al índice del tutorial
____________________________
9.- FireBaseDB. Encender/Apagar LED. Deslizadores. App Inventor. Android.
GPIO2 es SDA
GPIO3 es SCL
- Vamos a Encender/Apagar un LED en tiempo real desde una aplicación construida con App Inventor para Android. Utilizaremos FireBaseDB (Google) (Gratis).
- También, mediante un pulsador enviaremos a la aplicación su estado, pulsado o no pulsado.
______________________________
1.- Entrar en la consola de FireBaseDB con una cuenta de Google.
- Entramos en FireBaseDB, pulsamos en "Ir a la consola"
- Agregamos un proyecto. Actuaremos en los lugares marcados.
- Vamos a Descripción general / Configuración de proyecto / General.
- Ahí localizamos el ID del proyecto, la Clave de API web y Nombre público, que será el
ProjectBucket.
- En Realtime Database / Datos, obtendremos la dirección de la base.
______________________________
2.- Aplicación en App Inventor para enviar datos a Firebase. LED.
p9_raspberry_firebase.aia
______________________________
- Diseño.
- Establecemos FirebaseURL y ProjectBucket con la información que hermos localizado anteriormente.
______________________________
- Bloques.
______________________________
- Ejecutar la aplicación y observar Firebase.
- Ejecutamos la aplicación anterior y observamos Firebase.
- Al pulsar los Botones aparecerá en FireBase la palabra "Encendido" o "Apagado".
- Además mediante el bloque FirebaseDB.DataChanged, obtenemos el retorno de la información en la Etiqueta1.
______________________________
3.- Raspberry Pi. Phyton. Pyrebase. De App a Raspberry.
- Vamos a Raspberry Pi. Vamos al terminal.
- Para que nuestro programa funcione con FireBase y Phyton es necesario instalar un paquete llamado "Pyrebase", también es necesario que nuestro Phyton sea de la versión 3 (python3).
- Raspbian tiene Python y Python3.
pi@raspberrypi:~ $ python -V
Python 2.7.16
pi@raspberrypi:~ $ python3 -V
Python 3.7.3
- Para instalar "Pyrebase" necesitamos el paquete pip, vamos a ver si lo tenemos:
pi@raspberrypi:~ $ pip --version
pip 18.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7)
[En caso que no tengas pip instalado, lo puedes instalar con la siguiente orden:]
pi@raspberrypi:~ $ curl https://bootstrap.pypa.io/get-pip.py | python3
- Ya tenemos pip instalado. Vamos a instalar "Pyrebase"
pi@raspberrypi:~ $ sudo pip 3 install Pyrebase
- Una vez instalado "Pyrebase" vamos a un editor de script, utilizo el Thonny Phyton IDE
- Observa los datos de config.
- El LED lo conectamos al terminal número 22, que corresponde con el GPIO8.
_______________________________
- Código para la Rasbperry.
|
# Juan A. Villalpando
# http://kio4.com/raspberry/9_firebasedb.htm
import RPi.GPIO as GPIO
import pyrebase
from time import sleep
config = {
"apiKey": "AIzaSyAo9cEmTy2pOEygEEIXdCUHc7uOlSFdcW4",
"authDomain": "kio4-3c240",
"databaseURL": "https://kio4-3c240.firebaseio.com/",
"storageBucket": "project-293607155139"
}
firebase = pyrebase.initialize_app(config)
database = firebase.database()
ProjectBucket = database.child("project-293607155139")
LED22 = 22 # Patillaje por numero, el 22 es el GPIO25.
GPIO.setmode(GPIO.BOARD) # Patillaje por numero.
GPIO.setwarnings(False)
GPIO.setup(LED22,GPIO.OUT)
print("Inicio. (CTRL + C para salir.)")
try:
while True: # Bucle principal
estadoLED22 = ProjectBucket.child("LED").get().val()
# print(estadoLED12)
if str(estadoLED22) == "\"Apagado\"":
print("Ahora esta apagado.")
GPIO.output(LED22, GPIO.LOW)
else:
print("Ahora esta encendido.")
GPIO.output(LED22, GPIO.HIGH)
except KeyboardInterrupt: # Salir con CTRL+C
print("Salida.")
GPIO.cleanup() # Limpiar GPIO
|
______________________________
4.- Raspberry Pi. Phyton. Pyrebase. De Raspberry a App.
p9_raspberry_firebase_boton.aia
- Ahora vamos a poner un pulsador (PushButton) en la Raspberry Pi, cuando esté pulsado enviará el texto "PULSADO" a FireBase, cuando no esté pulsado enviará "no pulsado".
- Añadimos una Etiqueta2 y los nuevos bloques que ves en la siguente imagen.
______________________________
- Bloques.
- Conectamos el pulsador en el terminal 18 (GPIO24) y el otro en el GND 20.
_______________________________
- Código para la Rasbperry.
|
# Juan A. Villalpando
# http://kio4.com/raspberry/9_firebasedb.htm
import RPi.GPIO as GPIO
import pyrebase
from time import sleep
config = {
"apiKey": "AIzaSyAo9cEmTy2pOEygEEIXdCUHc7uOlSFdcW4",
"authDomain": "kio4-3c240",
"databaseURL": "https://kio4-3c240.firebaseio.com/",
"storageBucket": "project-293607155139"
}
firebase = pyrebase.initialize_app(config)
database = firebase.database()
ProjectBucket = database.child("project-293607155139")
LED22 = 22 # Patillaje por numero, el 22 es el GPIO25.
PushButton18 = 18 # Patillaje por numero, el 18 es el GPIO24.
# El otro terminal a GND 20.
GPIO.setmode(GPIO.BOARD) # Patillaje por numero.
GPIO.setwarnings(False)
GPIO.setup(LED22,GPIO.OUT)
GPIO.setup(PushButton18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print("Inicio. (CTRL + C para salir.)")
try:
while True: # Bucle principal
estadoLED22 = ProjectBucket.child("LED").get().val()
# print(estadoLED12)
if str(estadoLED22) == "\"Apagado\"":
print("LED22 ahora esta apagado.")
GPIO.output(LED22, GPIO.LOW)
else:
print("LED22 ahora esta encendido.")
GPIO.output(LED22, GPIO.HIGH)
if GPIO.input(PushButton18) == GPIO.HIGH:
print("Botón no pulsado.")
ProjectBucket.child("project-293607155139").child("PushButton").set("no_pulsado")
else:
print("Botón PULSADO.")
ProjectBucket.child("project-293607155139").child("PushButton").set("PULSADO")
except KeyboardInterrupt: # Salir con CTRL+C
print("Salida.")
GPIO.cleanup() # Limpiar GPIO
|
______________________________
5.- Mueve un Deslizador en la aplicación y se mueve un Servo en Raspberry Pi.
p9_raspberry_firebase_Deslizador.aia
- Vamos a añadir un Servo. Lo conectaremos en el terminal 40 que es el GPIO21. Mantenemos el LED y el Pulsador.
- Al mover el Deslizador de la aplicación enviaremos un número entero desde el 0 al 180, a Firebase.
- El código Python tomará ese número y moverá al servo mediante PWM.
______________________________
- Diseño.
______________________________
- Bloques.
_______________________________
- Código para la Rasbperry.
|
# Juan A. Villalpando
# http://kio4.com/raspberry/9_firebasedb.htm
import RPi.GPIO as GPIO
import pyrebase
from time import sleep
config = {
"apiKey": "AIzaSyAo9cEmTy2pOEygEEIXdCUHc7uOlSFdcW4",
"authDomain": "kio4-3c240",
"databaseURL": "https://kio4-3c240.firebaseio.com/",
"storageBucket": "project-293607155139"
}
firebase = pyrebase.initialize_app(config)
database = firebase.database()
ProjectBucket = database.child("project-293607155139")
LED22 = 22 # Patillaje por numero, el 22 es el GPIO25.
PushButton18 = 18 # Patillaje por numero, el 18 es el GPIO24.
# El otro terminal a GND.
Servo40 = 40 # Patillaje por numero, el 40 es el GPIO21.
GPIO.setmode(GPIO.BOARD) # Patillaje por numero.
GPIO.setwarnings(False)
GPIO.setup(LED22,GPIO.OUT)
GPIO.setup(PushButton18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(Servo40,GPIO.OUT)
pwm=GPIO.PWM(40,50) # pin 40 a 50 Hz
pwm.start(0)
valorServo40 = 90
def SetAngle(angle):
duty = angle / 18 + 2
GPIO.output(40,True)
pwm.ChangeDutyCycle(duty)
sleep(1)
GPIO.output(40,False)
pwm.ChangeDutyCycle(0)
print("Inicio. (CTRL + C para salir.)")
try:
while True: # Bucle principal
estadoLED22 = ProjectBucket.child("LED").get().val()
print(estadoLED22)
valorServo40 = ProjectBucket.child("project-293607155139").child("Servo").get().val()
print(valorServo40)
if str(estadoLED22) == "\"Apagado\"":
print("LED22 ahora esta apagado.")
GPIO.output(LED22, GPIO.LOW)
else:
print("LED22 ahora esta encendido.")
GPIO.output(LED22, GPIO.HIGH)
if GPIO.input(PushButton18) == GPIO.HIGH:
print("Botón no pulsado.")
ProjectBucket.child("project-293607155139").child("PushButton").set("no_pulsado")
else:
print("Botón PULSADO.")
ProjectBucket.child("project-293607155139").child("PushButton").set("PULSADO")
SetAngle(int(valorServo40)) # Cámbia el ángulo
# pwm.stop()
except KeyboardInterrupt: # Salir con CTRL+C
print("Salida.")
GPIO.cleanup() # Limpiar GPIO
|
Para evitar que el servo vibre, creamos una variable llamada valorServo40 _old y agregamos este código:
if valorServo40 != valorServo40_old:
SetAngle(int(valorServo40)) # Cámbia el ángulo
valorServo4_old = valorServo40
______________________________
6.- Raspberry Pi genera dos números aleatorios. La app toma esos valores y los muestras en medidores.
p9_raspberry_firebase_temperatura.aia
- Raspberry genera dos números aleatorios, temperatura y presión; los envía a Firebase.
- La aplicación toma esos dos números los muestra en pantalla y en Gauges.
- He puesto dos Gauges realizado con Google Chart y uno realizado con Lienzo e imágenes.
_______________________________
- Código para la Rasbperry.
|
# Juan A. Villalpando
# http://kio4.com/raspberry/9_firebasedb.htm
import RPi.GPIO as GPIO
import pyrebase
from time import sleep
# generate random integer values
from random import seed
from random import randint
config = {
"apiKey": "AIzaSyAo9cEmTy2pOEygEEIXdCUHc7uOlSFdcW4",
"authDomain": "kio4-3c240",
"databaseURL": "https://kio4-3c240.firebaseio.com/",
"storageBucket": "project-293607155139"
}
firebase = pyrebase.initialize_app(config)
database = firebase.database()
ProjectBucket = database.child("project-293607155139")
temperatura = 50
presion = 350
print("Inicio. (CTRL + C para salir.)")
try:
while True: # Bucle principal
temperatura = randint(0, 100)
presion = randint(0, 700)
ProjectBucket.child("project-293607155139").child("temperatura").set(temperatura)
ProjectBucket.child("project-293607155139").child("presion").set(presion)
sleep(4)
except KeyboardInterrupt: # Salir con CTRL+C
print("Salida.")
GPIO.cleanup() # Limpiar GPIO
|
_______________________________
- Código de los Gauges.
|
<html><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
// Juan A. Villalpando
// http://kio4.com/raspberry/9_firebasedb.htm
google.charts.load('current', {'packages':['gauge']});
google.charts.setOnLoadCallback(drawChart);
temp_hume = window.AppInventor.getWebViewString().split(":");// Entrada de datos.
temperatura = temp_hume[0];
humedad = temp_hume[1];
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Label', 'Value'],
['Temp', 50],
]);
var options = {
width: 400, height: 120,
redFrom: 90, redTo: 100,
yellowFrom:75, yellowTo: 90,
minorTicks: 5
};
var chart = new google.visualization.Gauge(document.getElementById('chart_div_1'));
///////////////////////////////////////////////
var data2 = google.visualization.arrayToDataTable([
['Label', 'Value'],
['Pres', 350],
]);
var options2 = {
width: 400, height: 120,
greenFrom: 0, greenTo: 180,
redFrom: 600, redTo: 700,
yellowFrom:490, yellowTo: 600,
minorTicks: 5,
max: 700
};
var chart2 = new google.visualization.Gauge(document.getElementById('chart_div_2'));
///////////////////////////////////////////////
chart.draw(data, options);
data.setValue(0, 1, temperatura);
chart.draw(data, options);
chart2.draw(data2, options2);
data2.setValue(0, 1, humedad);
chart2.draw(data2, options2);
};
</script>
</head>
<body>
<div id="chart_div_1" style="width: 400px; height: 120px;"></div>
<div id="chart_div_2" style="width: 400px; height: 120px;"></div>
</body></html>
|
______________________________
- Diseño.
______________________________
- Bloques.
______________________________
- Comentarios. Las imágenes.
- Utilizo tres imágenes, el gauge_firebase1.png es la base, es decir donde están los números. La ponemos como fondo del Lienzo.
- El gauge_firebase2.png y el gauge_firebase3t .png son las agujas, negra y roja. Son imágenes con fondo transparente, están situadas sobre la imagen principal del Lienzo. como tienen fondo transparente se ven las tres imagenes una sobre otra.
- Observa que la temperatura va de 0 a 100, cuando es 0 la imagen se debe poner en dirección 135 y cuando es 100 se debe poner en dirección -135. Cuando es 50, la aguja debe estar dirigida hacia arriba.
- Para realizar ese cambio utilizamos la ecuación de la recta:
Y = -2.7 X + 135
- La presión cambia de 0 a 700, la ecuación será:
Y = -0.386 X + 135
___________________________________________________
|