Visualización en Arduino de la Barra de Información del Sistema

Demostración

  • Arduino WeMos D1 R2
  • Simulación de Hardware

Introducción

El Internet de las Cosas es un concepto que se refiere a una interconexión digital de objetos cotidianos con internet.

Para el año de 2020, se tiene un pronostico que habran 31 billones de dispositivos y 4 billones de personas.

Uno de los dispositivos que ha revolucionado el concepto de Hazlo tu mismo (conocido como DIY, por sus siglas en inglés y significa Do It Yourself) es Arduino.

Arduino es una plataforma electrónica de código abierto basada en hardware y software fáciles de usar. Las placas Arduino pueden leer entradas (luz en un sensor, un dedo en un botón o un mensaje de Twitter) y convertirla en una salida: activar un motor, encender un LED y publicar algo en línea. Puede decirle a su tarjeta qué debe hacer enviando un conjunto de instrucciones al microcontrolador en la tarjeta.

Objetivo

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

Software

Hardware

Código

  • Repositorio en Github
    • Fritzing
    • Arduino IDE
      • Configuración
      • Display_on_Arduino_of_System_Information_Bar_-_WemosD1R2.ino
      // Display on Arduino of System Information Bar - WemosD1R2.c
      // v0.0.1 - 2018-10-07 - nelbren.com
      
      #include <ESP8266WiFi.h>
      #include "LiquidCrystal_I2C.h"
      
      const char* host = "104.251.217.217";
      const int   port = 80;
      const char* uri = "/si.txt";
      String httpPacket = "GET " + String(uri) + 
                          " HTTP/1.1\r\n" + 
                          "Host: " + String(host) + "\r\n" + 
                          "Connection: close\r\n\r\n";
      
      int n = 0;
      
      const char* ssid = "CHANGE-TO-YOUR-SSID";
      const char* password = "CHANGE-TO-YOUR-PASSWORD";
      const int addr = 0x27, en = 2, rw = 1,rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
      LiquidCrystal_I2C lcd(addr, en, rw, rs, d4, d5, d6, d7);
      const int lcd_cols = 20;
      const int lcd_rows = 4;
      
      void wait_time() {
        String msg = "";
        char buffer[10];
        lcd.noBlink();
        sprintf(buffer, "%03d", n);
        msg.concat(buffer);
        lcd.setCursor(lcd_cols - 3, lcd_rows - 1);
        lcd.print(buffer);
        lcd.setCursor(lcd_cols - 1, lcd_rows - 1);
        lcd.blink();
        Serial.print(buffer); 
        Serial.print(",");
      }
      
      void lcd_print(String msg, int r = 0) {
        String msg2;
        int wc_x, wc_y;
        int l = msg.length();
        lcd.setCursor(0, r);
        if (l > lcd_cols) {
          if (r >= lcd_rows - 1) {
            msg2 = msg.substring(0, lcd_cols - 3) + "...";     
            lcd.print(msg2);
            wc_x = msg2.length()-1;
            wc_y = r;
          } else {
            lcd.print(msg.substring(0, lcd_cols));
            wc_x = lcd_cols - 1;
            wc_y = r + 1;
            lcd_print(msg.substring(lcd_cols), r + 1);
          }
        } else {
          lcd.print(msg);
          wc_x = msg.length() - 1;
          wc_y = r;
        }
      }
      
      void setup(void) {
        String msg = "My IP: ";
        Serial.begin(115200); 
        lcd.begin(lcd_cols, lcd_rows);
        lcd.setBacklightPin(3,POSITIVE);
        lcd.setBacklight(LOW);  
        lcd.home();  
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) { delay(500); }
        IPAddress myIP = WiFi.localIP();
        msg.concat(myIP.toString());
        lcd.clear();
        lcd_print(msg);
        Serial.println(msg);
      }
      
      void display_error(String msg, int nn) {
        lcd_print(msg);
        lcd.setBacklight(HIGH);
        n = nn;
      }
      
      void read_stream(WiFiClient client) {
        unsigned long timeout = millis();
        while (client.available() == 0) {
          if (millis() - timeout > 5000) {
            display_error("Comm failed (2)!", 10);
            client.stop();
            return;
          }
        }   
        if (client.find("\r\n\r\n")){
          delay(5);
          unsigned int i = 0;
          String message = "";
          while (i<60000) {
            if(client.available()) {
              char c = client.read();
              if (c != '\r' && c != '\n') message += c;
              i=0;
            }
            i++;
          }
          Serial.println("\r\n[" + message + "]");
          lcd.setBacklight(HIGH);
          lcd_print(message, 0);
          delay(500);
          if (message.indexOf("*") == -1) lcd.setBacklight(LOW);
          delay(500);
        } else {
          display_error("Comm failed (3)!", 15);
        }
      }
      
      void loop(void){
        wait_time();
        if ( n <= 0 ) {
          WiFiClient client;
          n = 120;
          if (!client.connect(host, port)) {
            display_error("Comm failed (1)!", 5);
            return;
          }  
          client.print(httpPacket);
          read_stream(client);
        } else {
          delay(1000);
        }
        n--;
      }
      
      • [Display_on_Arduino_of_System_Information_Bar_-WemosD1R2.ino](https://raw.githubusercontent.com/nelbren/display_on_arduino_of_sib/master/arduino_ide/Display_on_Arduino_of_System_Information_Bar-WemosD1R2/Display_on_Arduino_of_System_Information_Bar-_WemosD1R2.ino)

Actualización de archivo de texto

  1. Instalar el programa Barra de Información del Sistema.

  2. Crear el siguiente programa (secuencia de comandos):
    $ cat loop.bash
    #!/bin/bash
    # loop.bash
    # v0.0.1 - 2018-10-07 - nelbren.com
    
    si=/usr/local/npres/bin/system/si.bash
    output=/home/hosting/npr3s/si/si.txt
    
    while true; do
      $si -n | cut -d"|" -f1 > $output
      sleep 120
    done
    
  3. Iniciar el programa:
     $ sudo nohup ./loop.bash &