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

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

  2. Daniel Fernandes

    Saudações ozirisjunior! Achei bem interessante o seu código, porém,
    estou num dilema: carrego o código no NodeMCU, após, no Monitor serial ele mostra:
    WiFi Conectada
    Servidor iniciado!
    Endereço IP: 192.168.1.11

    Aí vem o problema: a página não acessa; mas, o interessante que umas 3 semanas atrás, eu carreguei o código e acessou com esse mesmo IP mas, colocando assim: 192.168.001.011
    Se você tem alguma experiência com isso, poderia me dar alguma dica? Será que é o modem que está bloqueando esse IP? Obrigado

    • Boa tarde Daniel, obrigado pelo contato. Pelo seu relato de bate pronto eu não consigo imaginar o que pode estar ocorrendo. Acredito que uma alternativa que pode ser utilizada afim de testar, seria fixar um IP via código. Coloque logo abaixo as linhas de configuração da rede wifi (variavel onde definimos o nome e a senha da rede sem fio).
      //DEFINIÇÃO DE IP FIXO PARA O NODEMCU
      IPAddress ip(192,168,1,190); //COLOQUE UMA FAIXA DE IP DISPONÍVEL DO SEU ROTEADOR. EX: 192.168.1.110
      IPAddress gateway(192,168,1,1); //GATEWAY DE CONEXÃO (ALTERE PARA O GATEWAY DO SEU ROTEADOR)
      IPAddress subnet(255,255,255,0); //MASCARA DE REDE
      //#####################################

      Depois, no void setup, coloque abaixo da linha “WiFi.begin(ssid, password);” o seguinte código: WiFi.config(ip, gateway, subnet);

      Teste com esses ajustes e veja se volta a funcionar. Abraços e obrigado.

Deixe uma resposta