Visualización en Arduino de BIS con MicroPython

Actualizado: 4 minuto de lectura

Visualización en Arduino de BIS con MicroPython

Introducción

Ver Introducción del Internet de las Cosas en artículo anterior de Visualización en Arduino de la Barra de Información del Sistema

Objetivo

En este artículo se mostrará como automatizar el despliegue de la información que está almacenada en un archivo de texto en un servidor de páginas en Internet, el cual es actualizado por el programa Barra de Información del Sistema, utilizando MicroPython.

MicroPython es una implementación ágil y eficiente del lenguaje de programación Python 3 que incluye un pequeño subconjunto de la biblioteca estándar de Python y está optimizado para ejecutarse en microcontroladores y en entornos restringidos.

El MicroPython pyboard es una placa de circuito electrónico compacto que ejecuta MicroPython en el metal desnudo, brindándole un sistema operativo Python de bajo nivel que se puede usar para controlar todo tipo de proyectos electrónicos.

MicroPython está repleto de características avanzadas, como un indicador interactivo, enteros arbitrarios de precisión, cierres, comprensión de listas, generadores, manejo de excepciones y más. Sin embargo, es lo suficientemente compacto como para caber y ejecutarse en solo 256k de espacio de código y 16k de RAM.

MicroPython pretende ser lo más compatible posible con Python normal para permitirle transferir código fácilmente desde el escritorio a un microcontrolador o sistema integrado.

Software

Hardware

Código

  • Repositorio en Github
    • Fritzing
    • ampy
      • Configuración

        Item Valor
        Puerto Asignado por driver
        Velocidad 115200
        SSID Asignado por usuario
        Contraseña Asignado por usuario
      • Display_on_Arduino_of_System_Information_Bar_-_esp8266_nodemcu.py

        # Display_on_Arduino_of_System_Information_Bar_-_esp8266_nodemcu.py
        # v0.0.1 - 2018-11-12 - nelbren.com
        from machine import Pin, I2C
        from esp8266_i2c_lcd import I2cLcd
        import network, utime, urequests as requests
        import wifi
        
        link = "http://104.251.217.217/si.txt"
        LCD_COLS,LCD_ROWS = 20,4; n = 0
        i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
        lcd = I2cLcd(i2c, 0x27, LCD_ROWS, LCD_COLS)
        
        def wait_time():
          lcd.blink_cursor_off()
          lcd.move_to(LCD_COLS - 3, LCD_ROWS - 1)
          lcd.putstr('{:03}'.format(n))
          lcd.move_to(LCD_COLS - 1, LCD_ROWS - 1)
          lcd.blink_cursor_on()
        
        def lcd_print(msg, r = 0):
          lcd.move_to(0, r)
          if len(msg) > LCD_COLS:
            if r >= LCD_ROWS - 1:
              lcd.putstr(msg[0:LCD_COLS - 3] + "...")
            else:
              lcd.putstr(msg[0:LCD_COLS])
              lcd_print(msg[LCD_COLS:], r + 1)
          else:  
            lcd.putstr(msg)
        
        def setup():
          lcd.backlight_on()
          lcd_print("SSID: " + wifi.SSID, 0)
          nic = network.WLAN(network.STA_IF)
          nic.active(True)
          nic.connect(wifi.SSID, wifi.PASSWORD)
          n = 0
          while not nic.isconnected():
            lcd_print('{:020}'.format(n), 1)
            utime.sleep(1)
            n+=1
          lcd.clear()
          lcd_print("MYIP: " + nic.ifconfig()[0])
        
        def display_error(msg, nn):
          global n
          lcd.clear()
          lcd_print(msg)
          lcd.backlight_on()
          n = nn
        
        setup()
        while True:
          wait_time()
          if n <= 0:
            n = 120
            try:
              r = requests.get(link)
            except:
              display_error('Communication error', 5)
              pass
            else:  
              if r.status_code == 200:
                lcd.backlight_on()
                lcd_print(r.text)
                utime.sleep(2)
                if r.text.find('*') == -1: lcd.backlight_off()
                r.close()
              else:      
                display_error('Get failed!', 5)
          else:
            utime.sleep(1)
          n-=1    
        
      • Display_on_Arduino_of_System_Information_Bar_-_esp8266_nodemcu.py

Uso

  1. Obtener
    git clone https://github.com/nelbren/display_on_arduino_of_sib_with_micropython.git
    

    Salida:

      Cloning into 'display_on_arduino_of_sib_with_micropython'...
      remote: Enumerating objects: 33, done.
      remote: Counting objects: 100% (33/33), done.
      remote: Compressing objects: 100% (26/26), done.
      remote: Total 33 (delta 8), reused 32 (delta 7), pack-reused 0
      Unpacking objects: 100% (33/33), done.   
    
  2. Configuración
    cd display_on_arduino_of_sib_with_micropython/micropython
    ./mpi.bash
    

    Salida:

      Please copy 'cfg.bash.example' to 'cfg.bash', and change wifi and port config
    
    cp cfg.bash.example cfg.bash
    

    NOTA: Cambiar el valor de port en el archivo cfg.bash

  3. Flash
    • Borrar
       ./mpi.bash -fe
      

      Salida:

       Sure? (Yes/Any=No):
       Yes
       esptool.py v2.5.1
       Serial port /dev/cu.SLAB_USBtoUART
       Connecting........_
       Detecting chip type... ESP8266
       Chip is ESP8266EX
       Features: WiFi
       MAC: 84:f3:eb:XX:XX:XX
       Uploading stub...
       Running stub...
       Stub running...
       Erasing flash (this may take a while)...
       Chip erase completed successfully in 6.9s
       Hard resetting via RTS pin...
      
    • Cargar el Firmware
       ./mpi.bash -ff
      

      Salida:

       Sure? (Yes/Any=No):
       Yes
       esptool.py v2.5.1
       Serial port /dev/cu.SLAB_USBtoUART
       Connecting........_
       Detecting chip type... ESP8266
       Chip is ESP8266EX
       Features: WiFi
       MAC: 84:f3:eb:XX:XX:XX
       Uploading stub...
       Running stub...
       Stub running...
       Configuring flash size...
       Auto-detected Flash size: 4MB
       Flash params set to 0x0040
       Compressed 604872 bytes to 394893...
       Wrote 604872 bytes (394893 compressed) at 0x00000000 in 34.9 seconds (effective 138.6 kbit/s)...
       Hash of data verified.
       |
       Leaving...
       Hard resetting via RTS pin...
      
  4. Conexión serial
    ./mpi.bash -s
    

    Salida:

    >> import os
    >> print(os.listdir())
     ['boot.py']
    >> print('hello world!')
     hello world!
    >> print('for quit of screen press CONTROL+A and type :quit')
     for quit of screen press CONTROL+A and type :quit    
    >>    
    
  5. Demos
    • Listar contenido
       ./mpi.bash -al
      

      Salida:

       /boot.py
      
    • Información del Sistema
       ./mpi.bash -di
      

      Salida:

       run mysources/info.py:
         Platform: esp8266
           Version: 3.4.0
           Modules: {'flashbdev': <module 'flashbdev'>}
             Uname: (sysname='esp8266', nodename='esp8266', release='2.2.0-dev(9422289)', version='v1.9.4-8-ga9a3caad0 on 2018-05-11', machine='ESP module with ESP8266')
       MAC address: 84:f3:eb:xx:xx:xx
       Memory free: 24544 bytes
         Frequency: 80000000 hz
       Count 5K ms: 56210
         Frequency: 160000000 hz
       Count 5K ms: 97798
         Frequency: 80000000 hz
       Count 5K ms: 56042
       DONE.  
      
    • Shift Cipher
       ./mpi.bash -ds
      

      Salida:

       RUN BOARD:
       ==========
       run mysources/160Mhz.py:
       DONE.
       intento 00: PHHW PH DIWHU WKH WRJD SDUWB
       ...
       intento 24: NFFU NF BGUFS UIF UPHB QBSUZ
       |
       real	0m3.512s
       user	0m0.130s
       sys	0m0.057s
       run mysources/080Mhz.py:
       DONE.
       intento 00: PHHW PH DIWHU WKH WRJD SDUWB
       ...
       intento 24: NFFU NF BGUFS UIF UPHB QBSUZ
       |
       real	0m3.915s
       user	0m0.132s
       sys	0m0.061s
       |
       RUN LOCAL:
       ----------
       intento 00: PHHW PH DIWHU WKH WRJD SDUWB
       ...
       intento 24: NFFU NF BGUFS UIF UPHB QBSUZ
       |
       real	0m0.129s
       user	0m0.021s
       sys	0m0.041s
      
  6. Display on Arduino of System Information Bar with Micropython
    • Configuración de Wifi
      • SSID
         ./mpi.bash -dm
        

        Salida:

         Please configure the 'main_ssid' in 'cfg.bash'
        

        NOTA: Cambiar el valor de main_ssid en el archivo cfg.bash

      • Contraseña
         ./mpi.bash -dm
        

        Salida:

         Please configure the 'main_pass' in 'cfg.bash'
        

        NOTA: Cambiar el valor de main_pass en el archivo cfg.bash

    • Subir el programa
       ./mpi.bash -dm
      

      Salida:

       put esp8266_i2c_lcd.py...uploading:
       put resources/esp8266_i2c_lcd.py...DONE.
       put lcd_api.py...uploading:
       put resources/lcd_api.py...DONE.
       put mysources/wifi.py...DONE.
       put mysources/main.py...DONE.
       run mysources/reset.py...DONE.
      

Actualización de archivo de texto

Ver Actualización de archivo de texto en artículo anterior de Visualización en Arduino de la Barra de Información del Sistema