RuiViana

MeshV18.ino

Feb 17th, 2019
246
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //------------( INCLUINDO DEFININDO E CONFIGURANDO BIBLIOTECAS )
  2. #include "setting.h"
  3. #include <painlessMesh.h>
  4. #include <SPIFFS.h>
  5. #include <AsyncTCP.h>
  6. #include <ESPAsyncWebServer.h>
  7. //------------( CONFIGURANDO SSID, PASSWORD E PORT DA REDE MESH )
  8. #define   MESH_PREFIX     "whateverYouLike"
  9. #define   MESH_PASSWORD   "somethingSneaky"
  10. #define   MESH_PORT       5555
  11. //--------( CONFIGURANDO SSID, PASSWORD E NOME DO HOST DA REDE WIFI )
  12. #define   STATION_SSID     ssid
  13. #define   STATION_PASSWORD password
  14. #define   HOSTNAME "HTTP_BRIDGE"
  15. #define   LED  2                                      // GPIO number of connected LED, ON ESP-12 IS GPIO2
  16. #define   bot  4                                      // GPIO botao, ON ESP-12 IS GPIO4
  17. SimpleList<uint32_t> nodes;
  18. IPAddress getlocalIP();
  19. painlessMesh  mesh;
  20. AsyncWebServer server(80);
  21. IPAddress myIP(0, 0, 0, 0);
  22. IPAddress myAPIP(0, 0, 0, 0);
  23. //------------( (     DECLARA VARIAVEIS GLOBAIS DE SISTEMA      )
  24. uint32_t  myID;                                       // MAC do root
  25. String payLoad = "";                                  // String de js
  26. String nodID = "";                                    // Identificacao do no da rede mesh
  27. String nodMAC[16][12];                                // Matriz para guardar os MACs em HEX e parametros
  28. uint32_t onlyMAC[16];                                 // Matriz para guardar os MACs em HEX
  29. uint32_t numero[] = {3289255477,2133650233, 887620719, 887631948, 2143346377, 2483971700,2484121542} ;
  30. String local[] = {"Root","Sala", "Quarto1", "Quarto2", "Quarto3", "Cozinha", "Varanda"};
  31. bool existe = 0;                                      // Controle de no na matriz
  32. int16_t qtdeNos = -1;                                 // Nos identificados na rede -1 para que qdo ident root fica 0
  33. bool stLED = 1;                                       // Status do LED  1 = Ligado
  34. String master;                                        // String pa montar msg
  35. String nodeMatrix[] = {"btnNode1", "btnNode2", "btnNode3"};
  36.  
  37. int encontrou ;
  38. int jota ;
  39. //----------------------------------------------------------
  40. void listaNodes()
  41. {
  42.   for (uint16_t i = 1; i < 16; i++)
  43.   {
  44.     nodMAC[i][2] = "0";                               // Zera status de todos no's
  45.   }
  46.   String listNodID;
  47.   nodes = mesh.getNodeList();
  48.   SimpleList<uint32_t>::iterator node = nodes.begin();
  49.   while (node != nodes.end()) {
  50.     //Serial.println(*node);
  51.     listNodID = separaDados(String(*node, HEX));
  52.  
  53.     node++;
  54.     for (uint16_t i = 1; i < 16; i++) {                   // Matriz de 0 a 15
  55.       if (listNodID == nodMAC[i][0]) {                    // Verifica se ja registrou o MAC do no
  56.         {
  57.           nodMAC[i][2] = "1";                             // Se registrou, informa presenca do no'
  58.         }
  59.         break;                                            // Sai do for
  60.       }
  61.     }
  62.   }
  63. }
  64. //--------------------------------------------------------------
  65. String separaDados(String dataNode )
  66. {
  67.   dataNode.toUpperCase();                                 // Maiusculas
  68.   String b0, b1, b2, b3 = " " ;                           // variaveis de trabalho
  69.   b0 = dataNode.substring(0, 2);                          // Separa os bytes
  70.   b1 = dataNode.substring(2, 4);
  71.   b2 = dataNode.substring(4, 6);
  72.   b3 = dataNode.substring(6, 8);
  73.   dataNode = b0 + ": " + b1 + ": " + b2 + ": " + b3;      // Junta no formato  XX:XX:XX:XX
  74.   return dataNode;
  75. }
  76. //--------------------------------------------------------------
  77. void montaLocal()
  78. {
  79.   WiFi.begin(ssid, password);
  80.   WiFi.config(IPAddress(192, 168, 0, 60), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0)); // Idem
  81.   Serial.println("");                                       // Imprime
  82.   while (WiFi.status() != WL_CONNECTED)                     // Aguarda conexão
  83.   {
  84.     delay(500);                                             // Delay
  85.     Serial.print(".");                                      // Imprime . enquanto não conecta
  86.   }
  87.   Serial.println("");                                       // Imprime
  88.   Serial.print("Connected to ");
  89.   Serial.println(ssid);
  90.   Serial.print("IP address: ");
  91.   Serial.println(WiFi.localIP());
  92. }
  93. //--------------------------------------------------------------
  94. void setup() {
  95.   Serial.begin(115200);
  96.   for (uint16_t i = 0; i < 16; i++)                       // Carrega vago em toda a matriz dos nos
  97.   {
  98.     nodMAC[i][0] = "vago";                                // Limpa a matriz
  99.   }
  100.  
  101.   pinMode(LED, OUTPUT);
  102.   pinMode(bot, INPUT_PULLUP);
  103.   if (!SPIFFS.begin()) {
  104.     Serial.println("An Error has occurred while mounting SPIFFS");
  105.     return;
  106.   }
  107.   //---------------( CONFIGURANDO E INICIALIZANDO A REDE MESH )
  108.   mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 );
  109.   mesh.onReceive(&receivedCallback);
  110.   mesh.stationManual(STATION_SSID, STATION_PASSWORD);
  111.   mesh.setHostname(HOSTNAME);
  112.   myAPIP = IPAddress(mesh.getAPIP());
  113.   Serial.println("My AP IP is " + myAPIP.toString());
  114.   myID   =  mesh.getNodeId();                                     // Obtem o ID do root
  115.   montaPacote();
  116.   extraiDados(myID, master);
  117.   carregaPagina();
  118. }
  119. //--------------------------------------------------------------
  120. void montaPacote()
  121. {
  122.   master = "|1|";                                         // ESP model ESP8266 = 0 ESP32 = 1
  123.   master += "1|";                                         // status ESP
  124.   master += "1|";                                         // Bot
  125.   master += stLED;                                        // Status LED
  126.   master += "|";                                          // Sepaarador
  127.   master += "1020";                                       // Valor analogico
  128.   master += "*";                                          // End Of Msg
  129. }
  130. //--------------------------------------------------------------
  131. void loop() {
  132.   mesh.update();
  133.   if (myIP != getlocalIP()) {
  134.     montaLocal();
  135.     myIP = WiFi.localIP();
  136.     Serial.println("My WiFi IP is " + myIP.toString());
  137.   }
  138.   if (digitalRead(bot) == LOW)                            // Se botao esta pressionado
  139.   {
  140.     delay(30);                                            // Debouncing
  141.     if (digitalRead(bot) == LOW)                          // Se botao continua pressionado
  142.     {
  143.       digitalWrite(LED, !digitalRead(LED));               // Inverte status LED
  144.     }
  145.   }
  146.   if (digitalRead(LED) == HIGH)
  147.     stLED = 1;
  148.   else
  149.     stLED = 0;
  150. }
  151. //--------------------( VOID receivedCallback RETORNA O ID E A MENSSAGEM DO NÓ ENVIADA PARA O ROOT )
  152. void receivedCallback( const uint32_t &from, const String &msg ) {
  153.  Serial.print("from  "); Serial.print(from);Serial.print("  msg  "); Serial.println(msg);
  154.   extraiDados(from, msg);
  155.  
  156. }
  157. //--------------------------------------------------------------
  158. void extraiDados(uint32_t from, String msg)               // Extrai dados da msg e verifica se existe no na tabela
  159. {
  160.   nodID = String(from, HEX);                              // Transfor from em Strinf no formato HEX
  161.   nodID = separaDados(nodID);
  162.   for (uint16_t i = 0; i < 16; i++) {                     // Matriz de 0 a 15
  163.     if (nodID == nodMAC[i][0]) {                          // Verifica se ja registrou o MAC do no
  164.       existe = 1;                                         // Se tiver, indica
  165.       refresh(msg, i);                                    // Refresh nos parametros
  166.       break;                                              // Sai do for
  167.     }
  168.   }
  169.   if (existe == 0) {                                      // Se nao existe
  170.     for (uint16_t i = 0; i < 16; i++) {                   // Procura uma celula não ocupada = 0xFFFFFFFF
  171.       if (nodMAC[i][0] == "vago")                         // Se encontrou
  172.       {
  173.         selectMAC(from, msg, i);                          // Chama rotina pra transformar valor em HEX
  174.         existe = 1;                                       // Indica que existe
  175.         qtdeNos++;                                        // Invrementa numero de nos
  176.         break;                                            // Sai do for
  177.       }
  178.       if ( i >= 16)                                       // Se não tem posicao livre
  179.         Serial.println("Buffer cheio");                   // imprime
  180.     }
  181.   }
  182.   existe = 0;                                             // Desabilita existe pra permitir proxima pesquisa
  183. }
  184. //--------------------(   FUNÇÃO QUE REQUISITA O IP MESH DO ROOT   )
  185. IPAddress getlocalIP() {
  186.   return IPAddress(mesh.getStationIP());
  187. }
  188. //--------------------( VOID carregaPagina SERVE AS FOLHAS HTML JQUERY BOOTSTRAP E JAVASCRIPT PARA O CLIENT )
  189. void carregaPagina() {
  190.   server.on("/htm", HTTP_GET, [](AsyncWebServerRequest * request) {                 // SERVE O ARQUIVO index.htm
  191.     request->send(SPIFFS, "/index.htm", "text/html");
  192.   });
  193.   server.on("/javascript.js", HTTP_GET, [](AsyncWebServerRequest * request) {       // SERVE O ARQUIVO javascript.js
  194.     request->send(SPIFFS, "/javascript.js", "application/javascript.js");
  195.   });
  196.   server.on("/jquery-3.3.1.min.js", HTTP_GET, [](AsyncWebServerRequest * request) { // SERVE O ARQUIVO jquery-3.3.1.min.js
  197.     request->send(SPIFFS, "/jquery-3.3.1.min.js", "application/javascript.js");
  198.   });
  199.   server.on("/bootstrap.min.js", HTTP_GET, [](AsyncWebServerRequest * request) {    // SERVE O ARQUIVO bootstrap.min.js
  200.     request->send(SPIFFS, "/bootstrap.min.js", "application/javascript.js");
  201.   });
  202.   server.on("/bootstrap.min.css", HTTP_GET, [](AsyncWebServerRequest * request) {   // SERVE O ARQUIVO bootstrap.min.css
  203.     request->send(SPIFFS, "/bootstrap.min.css", "text/css");
  204.   });
  205.   server.on("/estilo.css", HTTP_GET, [](AsyncWebServerRequest * request) {          // SERVE O ARQUIVO bootstrap.min.css
  206.     request->send(SPIFFS, "/estilo.css", "text/css");
  207.   });
  208.   server.on("/teste", HTTP_GET, [](AsyncWebServerRequest * request) {               // SERVE O ARQUIVO teste
  209.     listaNodes();
  210.     payLoad = "";                                                                   // Limpa a mensagem da tela
  211.     for ( uint16_t i = 0; i <= qtdeNos; i++) {
  212.       for (int j = 0; j < 7; j++)
  213.       {
  214.         if (onlyMAC[i] == numero[j])
  215.         {
  216.           encontrou = 1;
  217.           jota = j;
  218.         }
  219.       }
  220.       if  (encontrou == 1)
  221.       {
  222.         payLoad += local[jota];
  223.         encontrou = 0;
  224.       }
  225.       else
  226.         payLoad += onlyMAC[i];
  227.       payLoad += "|";
  228.       payLoad += nodMAC[i][1];
  229.       payLoad += "|";
  230.       payLoad += nodMAC[i][2];
  231.       payLoad += "|0|";
  232.       payLoad += nodMAC[i][4];
  233.       payLoad += "|";
  234.       payLoad += nodMAC[i][5];
  235.       if (i < qtdeNos)
  236.         payLoad += "*";
  237.     }
  238.     request->send(200, "text / plain", payLoad);
  239.   });
  240.   server.on("/ligarLed", HTTP_GET, [](AsyncWebServerRequest * request) {            // SERVE O ARQUIVO ligarLed
  241.     if (request->hasArg("btnRoot")) {                 // No root
  242.       digitalWrite(LED, !digitalRead(LED));           // Inverte status do LED
  243.       montaPacote();
  244.       refresh(master, 0);                             // Refresh nos parametros
  245.     }
  246.     if (request->hasArg("btnNode1")) {                // Primeiro no
  247.       buscaNode( 1);
  248.     }
  249.     if (request->hasArg("btnNode2")) {                // Segundo no
  250.       buscaNode( 2);
  251.     }
  252.     if (request->hasArg("btnNode3")) {                // Terceiro no
  253.       buscaNode( 3);
  254.     }
  255.     if (request->hasArg("btnNode4")) {                // Quarto no
  256.       buscaNode( 4);
  257.     }
  258.     if (request->hasArg("btnNode5")) {                // Quinto no
  259.       buscaNode( 5);
  260.     }
  261.     if (request->hasArg("btnNode6")) {                // Sexto no
  262.       buscaNode( 6);
  263.     }
  264.     request->send(200, "text / plain", payLoad);
  265.   });
  266.   server.begin();
  267. }
  268. //--------------------------------------------------------------
  269. void buscaNode(uint16_t i)
  270. {
  271.   String msg;                                         // String para montar a msg
  272.   msg += myID;                                        // Adiciona o ID do root na msg
  273.   msg += " 1";                                        // Liga/Desliga o LED
  274.   uint32_t node = onlyMAC[i];                         // Seleciona o node da tabela selecionada pelo indece i
  275.   mesh.sendSingle(node, msg);                         // Envia msg para o no
  276. }
  277. //--------------------------------------------------------------
  278. void selectMAC( uint32_t from, String msg, uint8_t i) // Seleciona e salva valores recebidos de um novo no
  279. {
  280.   nodMAC[i][0] = nodID;
  281.   nodMAC[i][1] = msg.substring(1, 2);                 // Separa o valor do modelo do ESP
  282.   if (nodMAC[i][1] == "0")                            // Se for 0 é ESP3266
  283.     nodMAC[i][1] = "ESP8266";                         // Salva ESP8266
  284.   else                                                // Se for 1 é ESP32
  285.     nodMAC[i][1] =  "ESP32";                          // Salva ESP32
  286.   nodMAC[i][2] = msg.substring(3, 4);                 // Status do no'
  287.   nodMAC[i][4] = msg.substring(7, 8);                 // Separa o valor do status do LED
  288.   nodMAC[i][5] = msg.substring(9, 13);                // Separa o valor analog
  289.   nodMAC[i][5] = nodMAC[i][5].toInt();                // Remove o * do final se for mmeno que 4 digitos
  290.   onlyMAC[i] = from;                                  // Salva MAC integral
  291. }
  292. //--------------------------------------------------------------
  293. void refresh(String msg, uint8_t i)                   // Atualiza os valores de parametro de um no
  294. {
  295.   nodMAC[i][4] = msg.substring(7, 8);                 // Separa o valor do status do LED
  296.   nodMAC[i][5] = msg.substring(9, 13);                // Separa o valor analog
  297.   nodMAC[i][5] = nodMAC[i][5].toInt();                // Remove o * do final se for mmeno que 4 digitos
  298. }
RAW Paste Data