Proyectos IoT

Configura el Wi-Fi de Raspberry Pi vía Bluetooth para luego enviar datos a Ubidots

Ammar Chauhan
· 9 min de lectura
Enviar por correo electrónico

Al menos una vez en tu vida tuviste problemas para configurar las credenciales de Wi-Fi de una Raspberry Pi solo porque no tenías un monitor contigo en ese momento.

En esta guía, describiré cómo configurar una Raspberry Pi con un AP (punto de acceso) que puede realizarse a través de una aplicación portátil de Android. ¿No puedes conectar un cable Ethernet solo porque estás en una nueva ubicación? No se preocupe: después de seguir esta guía, podrá usar su Pi en cualquier ubicación, todo lo que necesita es escanear la red, elegir la red deseada para establecer la conexión, escribir las credenciales y ¡ya está conectado!

Implementé una herramienta simple que permite configurar el SSID y PSK de Raspberry pi Wi-Fi a través de comunicación Bluetooth. Por el momento, es súper básico: solo necesitas haber emparejado previamente tu teléfono Android con tu Raspberry Pi y haber escrito una aplicación básica para Android.

Personalmente creo que esto es muy útil para los que andan por ahí con su Raspberry Pi, moviéndola de un taller a otro, llevándola de casa al colegio, más todos los casos posibles que ahora mismo tienes en mente... Ahora bien, Sin discutir más, comencemos a construir cosas interesantes, comenzando con la instalación del script Python que se ejecutará en nuestra Raspberry Pi.

Requisitos

Paso a paso

  1. Configurar el Bluetooth de Raspberry Pi
  2. Emparejamiento de Raspberry Pi y teléfono Android
  3. Configuración del sensor DHT22 – Hardware
  4. Configuración del sensor DHT22 – Software
  5. Envío/Visualización de datos a Ubidots

1. Configurar el Bluetooth de Raspberry Pi

Al principio necesitarás un monitor + teclado conectado, alternativamente accede a la Raspberry Pi a través de SSH solo para poder establecer todas las configuraciones requeridas a través de la Terminal Raspbian.

Ejecute los siguientes comandos con cuidado para establecer las configuraciones adecuadas:

  1. Instale bluez (biblioteca bluetooth de Python):
$ sudo apt-get instalar python-bluez

2. Inicie el demonio Bluetooth en modo de compatibilidad. Para hacer esto, edite /etc/systemd/system/dbus-org.bluez.service ejecutando el siguiente comando:

$ sudo nano /etc/systemd/system/dbus-org.bluez.service

3. Luego, modifique el ExecStart :

ExecStart=/usr/lib/bluetooth/bluetoothd –C

4. Ahora, cargue el perfil del puerto serie usando el siguiente comando:

$ sudo sdptool agregar SP

5. Para guardar los cambios correctamente, reinicie su Pi:

$ sudo reiniciar

Después del reinicio, emparejemos el Bluetooth con nuestro teléfono Android.

2. Emparejamiento de Raspberry Pi y teléfono Android.

1. Empareje su teléfono Android con su Raspberry Pi. Para hacer esto, enciende el bluetooth de tu teléfono y ejecuta el siguiente comando en tu Pi:

$ bluetoothctl

Luego, una vez que comience el proceso de emparejamiento, inserte los siguientes parámetros. (Consulte la imagen para tener una mejor idea del proceso de flujo)

encendido visible al escanear activado

En este punto, su teléfono aparecerá en la lista de dispositivos disponibles. Toma nota de la dirección de tu teléfono.

confianza<PHONE_ADDRESS> par<PHONE_ADDRESS>

2. Para salir del ctl de bluetooth, escriba el comando quit:

$ dejar de fumar

3. [OPCIONAL – CONSEJO PROFESIONAL] Puede omitir la configuración anterior configurando el Bluetooth con la interfaz de usuario de Raspbian. Simplemente presione el ícono de Bluetooth y seleccione el Bluetooth de su teléfono.

4. Después de emparejar el Bluetooth, agregue el script de Python directamente en Raspbian escribiendo el comando nano copie/pegue el código fuente, o puede copiar directamente el archivo run.py.

$ sudo nano run.py

Código fuente (Copiar/Pegar):

#!/usr/bin/env python #Run.py importar sistema operativo desde bluetooth importar * desde wifi importar celda, esquema importar subproceso tiempo de importación wpa_supplicant_conf = "/etc/wpa_supplicant/wpa_supplicant.conf" sudo_mode = "sudo " def wifi_connect(ssid , psk): # escribe la configuración wifi en el archivo cmd = 'wpa_passphrase {ssid} {psk} | sudo tee -a {conf} > /dev/null'.format( ssid=str(ssid).replace('!', '\!'), psk=str(psk).replace('!', '\ !'), conf=wpa_supplicant_conf ) cmd_result = "" cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) # reconfigurar wifi cmd = sudo_mode + 'wpa_cli -i wlan0 reconfigure' cmd_result = os.system (cmd) print cmd + " - " + str(cmd_result) time.sleep(10) cmd = 'iwconfig wlan0' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) cmd = 'ifconfig wlan0 ' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) p = subproceso.Popen(['hostname', '-I'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out , err = p.communicate() si está fuera: dirección_ip = fuera otra cosa: dirección_ip = "<Not Set> " return dirección_ip def ssid_discovered(): Cells = Cell.all('wlan0') wifi_info = 'Ssid encontrado: \n' para el actual en el rango(len(Cells)): wifi_info += Cells[current].ssid + "\ n" wifi_info+="!" print wifi_info return wifi_info def handle_client(client_sock) : # get ssid client_sock.send(ssid_discovered()) print "Esperando SSID..." ssid = client_sock.recv(1024) if ssid == ' ' : devolver imprimir "ssid recibido" imprimir ssid # obtener psk client_sock.send("esperando-psk!") imprimir "Esperando PSK..." psk = client_sock.recv(1024) if psk == '' : devolver imprimir "psk recibido" print psk ip_address = wifi_connect(ssid, psk) print "ip address: " + ip_address client_sock.send("ip-address:" + ip_address + "!") return intenta: while True: server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) puerto = server_sock.getsockname()[1] uuid = "815425a5-bfac-47bf-9321-c5ff980b5e11" publicidad_servicio( server_sock, "Configuración de RPi Wifi" , service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], perfiles = [ SERIAL_PORT_PROFILE ]) print "Esperando conexión en el canal RFCOMM %d" % puerto client_sock, client_info = server_sock.accept() print "Conexión aceptada desde ", client_info handle_client (client_sock) client_sock.close() server_sock.close() # configuración finalizada imprimir 'Configuración finalizada\n' excepto (KeyboardInterrupt, SystemExit): imprimir '\nSaliendo\n'

5. Después del paso anterior, es hora de hacer ejecutable el script otorgando los permisos necesarios:

$ chmod +x ejecutar.py

Para ejecutar:

$ sudo ./run.py

6. En este punto, abra la aplicación de Android y seleccione raspberrypi en los dispositivos emparejados por Bluetooth. Ingrese el SSID , PSK y presione el Iniciar configuración . En unos segundos el Wi-Fi de la Raspberry Pi debería estar conectado, como se muestra en las imágenes a continuación.

7. Para ejecutar el script durante el proceso de arranque de pi, edite /etc/rc.local y agregue la siguiente línea de código:

(dormir 10;/ruta/a/script/./run.py)&

3. Configuración del sensor DHT22 - Hardware

1. Establezca las conexiones adecuadas, como se muestra en el siguiente diagrama:

4. Configuración del sensor DHT22 - Software

1. Instale los paquetes necesarios ejecutando los siguientes comandos:

$ sudo apt-obtener actualización
$ sudo apt-get install build-essential python-dev python-openssl git

2. Cargue la biblioteca de sensores. En mi caso, utilizo una biblioteca Adafruit prediseñada que admite una variedad de sensores:

$ git clon https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT

3. Con la biblioteca ya cargada, ejecute el siguiente comando para crear una biblioteca de Python que le permita realizar la integración fácilmente para este y otros proyectos.

$ sudo python setup.py instalar

4. Si todo funciona correctamente, deberíamos poder leer la temperatura y la humedad. La forma más sencilla es utilizar primero los archivos de demostración que ya están disponibles en nuestra Pi:

$ cd ejemplos

5. Ejecute el siguiente código de muestra. Donde el primer parámetro (11) indica qué sensor se utilizó (22 para el DHT22) y el segundo, a qué GPIO está conectado (no el número de pin, sino el número de GPIO). Esto produce una salida como la siguiente:

$ sudo ./AdafruitDHT.py 11 4

Resultado esperado:

$ sudo ./AdafruitDHT.py 11 4 Temperatura=24.0* Humedad=41.0%

5. Envío de datos a Ubidots

1. Cree un script de Python usando nano editor y pegue el siguiente código en la terminal. Para hacer esto, inserte el siguiente comando:

$ sudo nano ubidots 3.py

Código fuente:

importar tiempo solicitudes de importación importar matemáticas importar aleatorio importar sistema importar sensor Adafruit_DHT = 22 #Seleccione su pin de versión DHT = 18 #Ingrese su pin de DHT22 TOKEN = "…" # Coloque su TOKEN aquí DEVICE_LABEL = "Raspberrypi" # Coloque la etiqueta de su dispositivo aquí VARIABLE_LABEL_1 = "temperatura" # Coloque aquí su primera etiqueta de variable VARIABLE_LABEL_2 = "humedad" # Coloque aquí su segunda etiqueta de variable # Intente obtener una lectura del sensor. Utilice el método read_retry que reintentará hasta # 15 veces para obtener una lectura del sensor (esperando 2 segundos entre cada reintento). humedad, temperatura = Adafruit_DHT.read_retry(sensor, pin) # Quite el comentario de la línea siguiente para convertir la temperatura a Fahrenheit. # temperatura = temperatura * 9/5.0 + 32 # Tenga en cuenta que a veces no obtendrá una lectura y # los resultados serán nulos (porque Linux no puede # garantizar el tiempo de las llamadas para leer el sensor). # Si esto sucede, ¡inténtalo de nuevo! def build_payload(variable_1, variable_2): # Crea dos valores aleatorios para enviar datos value_1 = temperatura value_2 = humedad payload = {variable_1: value_1, variable_2: value_2, } return payload def post_request(payload): # Crea los encabezados para las solicitudes HTTP url = "http://industrial.api. ubidots .com" url = "{}/api/v1.6/devices/{}".format(url, DEVICE_LABEL) headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"} # Hace que el estado de las solicitudes HTTP = 400 intentos = 0 mientras que el estado >= 400 y los intentos <= 5: req = request.post(url=url, headers=headers, json=payload) status = req.status_code intentos += 1 time.sleep(1) # Procesa los resultados si status >= 400: print("[ERROR] No se pudieron enviar datos después de 5 intentos, verifique \ sus credenciales de token e Internet conexión") return False print("La solicitud [INFO] se realizó correctamente, su dispositivo está actualizado") return True def main(): payload = build_payload( VARIABLE_LABEL_1, VARIABLE_LABEL_2) print("[INFO] Intentando enviar datos") post_request( carga útil) print("[INFO] terminado") if __name__ == '__main__': while (True): print('Temp={0:0.1f}* Humedad={1:0.1f}%'.format(temperatura , humedad)) humedad, temperatura = Adafruit_DHT.read_retry(sensor, pin) main() time.sleep(1) ```

Después de pegar el código fuente, hay que asignar el TOKEN Ubidots donde se indica en el script de Python:

$ sudo nano ubidots 3.py

2. Ahora con todo configurado, puedes ejecutar el código de muestra para comenzar a transmitir datos a tu cuenta Ubidots :

$ sudo python ubidots 3.py

En este punto, si consulta la sección de dispositivos de su cuenta Ubidots , podrá ver un nuevo dispositivo creado llamado "RaspberryPi".

3. Para visualizar sus datos de manera eficiente, configuremos un Dashboard de Ubidots . Para crearlo, vaya a la Dashboard (Datos > Dashboard )

4. Luego, presione " Agregar nuevo widget " y seleccione su widget:

5. Seleccione la variable que desea mostrar:

6. Asigne un nombre personalizado al widget y presione el ícono verde para finalizar la creación del widget.

Ahora puede monitorear variables de forma remota desde cualquier ubicación gracias a la plataforma de desarrollo de aplicaciones IoT Ubidots :

Artículos recomendados: