NodeMCU + Matriz de Led 8*32 – Letreiro digital com envio texto via web

A ideia desse exemplo é mostrar um nodeMCU conectado ao wifi e também a uma matriz de led 8*32, trabalhando como um webserver fornecendo acesso a uma simples página web para o envio de dois parâmetros: texto e velocidade da rolagem.

Assim, via browser de qualquer dispositivo conectado a mesma rede, ao acessar o endereço IP do nodeMCU (endereço esse que é possível obter no monitor serial da IDE do arduino depois do sketch compilado) será possível definir o texto e também a velocidade a ser exibido pelo display.

O resultado dessa integração é um letreiro digital, com controle via web do conteúdo a ser exibido e a velocidade que o mesmo se desloca.

NodeMCU Utilizado:

Matriz de led 8*32:

Download do Sketch.

Download das Bibliotecas utilizadas.

Esquema de ligação:

Vídeo do exemplo em funcionamento:

Abraços e obrigado!

###Atualização 07/06/2018

Conforme sugestão de um visitante, resolvi montar um exemplo onde o nodeMcu trabalha no formato AP. Sendo assim não é necessário conectar o nodeMcu na mesma rede que o dispositivo que irá controlar a mensagem do display.

Nesse caso o nodeMcu cria uma rede wifi, onde o celular/pc/tablet irá se conectar para então ter acesso a pagina web que gerencia o texto e velocidade.

Código

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

//#####################################//
const char ssid[] = "letreiro";    //Definir o nome da rede a ser criada 
const char password[] = "12345678";       //Definir a senha a ser utilizada
String readString;
char c;
String acao;
String txtLed = "AGUARDANDO.....";
String velLed;
int velLedInt;

WiFiServer server(80);
//#####################################//

//#####################################//
int pinCS = 5;
int numberOfHorizontalDisplays = 4;
int numberOfVerticalDisplays = 1;
String tape = "AGUARDANDO.....";
int wait = 300; // Em milessegundos.
int spacer = 1;
int width = 5 + spacer;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
//#####################################//


void setup() {
  
  Serial.begin(115200);
 
  server.begin();
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  Serial.println();


  IPAddress local_ip(192, 168, 1, 1); //Ip fixo definido para o nodeMcu.
  IPAddress gateway(192, 168, 1, 1);   
  IPAddress subnet(255, 255, 255, 0);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  WiFi.softAPIP();


  //#####################################//
  matrix.setIntensity(15);
  matrix.setRotation(0, 1);
  matrix.setRotation(3, 1);
  matrix.setRotation(1, 1);
  matrix.setRotation(2, 1);
  //#####################################//
}

void loop() {

  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
    matrix.fillScreen(LOW);
  
    //####################################################################################//
    WiFiClient client = server.available();
    if (client) {
      boolean currentLineIsBlank = true;
      while (client.connected()) {
        if (client.available()) {
          char c = client.read();
  
          if (readString.length() < 100) {
            readString += c;
          }
  
          if (c == '\r') {
            if(readString.indexOf("?") > 0){
              //##SEPARANDO O VALOR DA VARIAVEL ACAO##//
              int acaoI = readString.indexOf("?a=") + 3;
              int acaoF = readString.indexOf("&txt=");
              acao = readString.substring(acaoI,acaoF);
              Serial.print("ACAO: ");
              Serial.println(acao);
    
              //##SEPARANDO O VALOR DA VARIAVEL TXTLED##//
              int txtLedI = readString.indexOf("&txt=") + 5;
              int txtLedF = readString.indexOf("&vel=");
              txtLed = readString.substring(txtLedI,txtLedF);
              txtLed.replace("%20"," ");
              Serial.print("NÚMERO LED: ");
              Serial.println(txtLed);
              if(txtLed.length() != 0){
                tape = txtLed;
                Serial.println("passou aqui");
              }
    
              //##SEPARANDO O VALOR DA VARIAVEL VELLED##//
              int velLedI = readString.indexOf("&vel=") + 5;
              int velLedF = readString.indexOf("FIM");
              velLed = readString.substring(velLedI,velLedF);
              velLedInt = velLed.toInt();
              Serial.print("VELOCIDADE: ");
              Serial.println(velLedInt);
    
              int letter = 0;
              int x = 31;
              int y = 0;
              int i = 0;
              int width = 6;
    
              if(velLedInt != 0){
                wait = velLedInt;
              }
    
            }
    
    
            String buf = "";
            buf += "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n";
            buf += "<html>";
            buf += "<head>";
            buf += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
            buf += "<meta name='viewport' content='width=device-width,minimum-scale=1.0,maximum-scale=1.0'>";
            buf += "<script type=\"text/javascript\">function mudarAction(){  var text = document.form1.text.value; var vel = document.form1.vel.value; document.form1.action = \"?a=ligar&txt=\"+text+\"&vel=\"+vel+\"FIM\"; document.form1.submit();}</script>";
            buf += "<title>LETREIRO ONLINE</title>";
            buf += "</head>";
            buf += "<body>";
            buf += "<form id=\"form1\" name=\"form1\" method=\"post\" action=\"\">";
            buf += "<table width=\"300\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
            buf += "<tr>";
            buf += "<td align=\"center\"><font face=\"verdana\" size=\"2\"><strong>LETREIRO DIGITAL</strong></font></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td>&nbsp;</td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td align=\"center\"><font face=\"verdana\" size=\"2\"><strong>TEXTO</strong></font></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td align=\"center\">";
            buf += "<input name=\"text\" type=\"text\" id=\"text\" size=\"49\" /></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td align=\"center\"><font face=\"verdana\" size=\"2\"><strong>VELOCIDADE</strong></font></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td><table border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
            buf += "<tr>";
            buf += "<td width=\"70\"><font face=\"verdana\" size=\"2\">ALTA</font></td>";
            buf += "<td width=\"15\"><input type=\"radio\" name=\"vel\" id=\"vel1\" value=\"100\" />";
            buf += "</td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td><font face=\"verdana\" size=\"2\">MEDIA</font></td>";
            buf += "<td><input type=\"radio\" name=\"vel\" id=\"vel2\" value=\"300\" checked=\"checked\" /></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td><font face=\"verdana\" size=\"2\">LENTA</font></td>";
            buf += "<td><input type=\"radio\" name=\"vel\" id=\"vel3\" value=\"500\" /></td>";
            buf += "</tr>";
            buf += "</table></td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td>&nbsp;</td>";
            buf += "</tr>";
            buf += "<tr>";
            buf += "<td align=\"center\"><input type=\"button\" name=\"button\" id=\"button\" value=\"ENVIAR\" onclick=\"mudarAction();\" /></td>";
            buf += "</tr>";
            buf += "</table>";
            buf += "</form>";
            buf += "</body>";
            buf += "</html>";
            
            client.print(buf);
            client.flush();
            client.stop();
            readString="";
          }
        }
      }
  //break;
    }
  //####################################################################################//
  
  int letter = i / width;
  int x = (matrix.width() - 1) - i % width;
  int y = (matrix.height() - 8) / 2; // center the text vertically
  
  while ( x + width - spacer >= 0 && letter >= 0 ) {
  if ( letter < tape.length() ) {
  matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
  }
  
  letter--;
  x -= width;
  }
  
  matrix.write(); 
  
  delay(wait);
  }

}

Depois de compilar o código no nodeMcu, basta conectar o dispositivo a rede criada (no caso do exemplo a rede se chama “letreiro”), digitar a senha “12345678” e depois no browser do dispositivo acessar o endereço 192.168.1.1 (ip fixo definido no código).

O restante funciona igual o exemplo do vídeo.

Abraços e obrigado!

Anteriores

Exemplo de funcionamento – Controle Infra Vermelho 17 teclas com módulo receptor

Próximo

Sensor horizontal para nível de caixa D’Agua / Tanque / Áquario

2 Comentários

  1. wildson

    bom dia.
    estou comesando agora a fazer projetos baseado em arduino, vou fazer esse seu projeto e gostaria de saber se voce vende o material e se eu tambem quiser aumentar de 4 matrizes de led para 8 onde na linha de codigo eu informo essa mudanca ou ja e automatico.

    • ozirisjunior

      Bom dia Wildson, Vendo os itens sim, basta você me informar quais os itens você deseja que monto um anúncio pra você no mercado livre. Você pode aumentar o número de matrizes sem problema, tem uma linha que precisa ser ajustada para isso. Seria essa “int numberOfHorizontalDisplays = 4;” bastaria mudar de 4 para 8. Você pode entrar em contato via email, oziris@ozirisjunior.com.br . Abraços e obrigado.

Deixe uma resposta