|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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.

firebase.py

# 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.

firebase_2.py

# 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.

firebase_3.py

# 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.

firebase_4.py

# 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.

gauge_firebase.htm

<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

___________________________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información