Advertisement
rogerin

Untitled

Dec 12th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.26 KB | None | 0 0
  1.  
  2. #include <ESP8266WiFi.h> // Importa a Biblioteca ESP8266WiFi
  3. #include <PubSubClient.h> // Importa a Biblioteca PubSubClient
  4.  
  5. //defines:
  6. //defines de id mqtt e tópicos para publicação e subscribe
  7. #define TOPICO_SUBSCRIBE "published"     //tópico MQTT de escuta
  8. #define TOPICO_PUBLISH   "MQTTFilipeFlopRecebe"    //tópico MQTT de envio de informações para Broker
  9.                                                    //IMPORTANTE: recomendamos fortemente alterar os nomes
  10.                                                    //            desses tópicos. Caso contrário, há grandes
  11.                                                    //            chances de você controlar e monitorar o NodeMCU
  12.                                                    //            de outra pessoa.
  13. #define ID_MQTT  "HomeAut2"     //id mqtt (para identificação de sessão)
  14.                                //IMPORTANTE: este deve ser único no broker (ou seja,
  15.                                //            se um client MQTT tentar entrar com o mesmo
  16.                                //            id de outro já conectado ao broker, o broker
  17.                                //            irá fechar a conexão de um deles).
  18.                                
  19.  
  20. //defines - mapeamento de pinos do NodeMCU
  21. #define D0    16
  22. #define D1    5
  23. #define D2    4
  24. #define D3    0
  25. #define D4    2
  26. #define D5    14
  27. #define D6    12
  28. #define D7    13
  29. #define D8    15
  30. #define D9    3
  31. #define D10   1
  32.  
  33.  
  34. // WIFI
  35. const char* SSID= "brisa-188097";
  36. const char* PASSWORD = "8ultm3rl";
  37. //const char* PASSWORD = "z11d8ks4";
  38.    
  39. // MQTT
  40. const char* BROKER_MQTT = "192.168.1.11"; //URL do broker MQTT que se deseja utilizar
  41. int BROKER_PORT = 1885; // Porta do Broker MQTT
  42.  
  43.  
  44. //Variáveis e objetos globais
  45. WiFiClient espClient; // Cria o objeto espClient
  46. PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
  47. char EstadoSaida = '0';  //variável que armazena o estado atual da saída
  48.  
  49. //Prototypes
  50. void initSerial();
  51. void initWiFi();
  52. void initMQTT();
  53. void reconectWiFi();
  54. void mqtt_callback(char* topic, byte* payload, unsigned int length);
  55. void VerificaConexoesWiFIEMQTT(void);
  56. void InitOutput(void);
  57.  
  58. /*
  59.  *  Implementações das funções
  60.  */
  61. void setup()
  62. {
  63.     //inicializações:
  64.     InitOutput();
  65.     initSerial();
  66.     initWiFi();
  67.     initMQTT();
  68. }
  69.  
  70. //Função: inicializa comunicação serial com baudrate 115200 (para fins de monitorar no terminal serial
  71. //        o que está acontecendo.
  72. //Parâmetros: nenhum
  73. //Retorno: nenhum
  74. void initSerial()
  75. {
  76.     Serial.begin(115200);
  77. }
  78.  
  79. //Função: inicializa e conecta-se na rede WI-FI desejada
  80. //Parâmetros: nenhum
  81. //Retorno: nenhum
  82. void initWiFi()
  83. {
  84.     delay(10);
  85.     Serial.println("------Conexao WI-FI------");
  86.     Serial.print("Conectando-se na rede: ");
  87.     Serial.println(SSID);
  88.     Serial.println("Aguarde");
  89.      
  90.     reconectWiFi();
  91. }
  92.  
  93. //Função: inicializa parâmetros de conexão MQTT(endereço do
  94. //        broker, porta e seta função de callback)
  95. //Parâmetros: nenhum
  96. //Retorno: nenhum
  97. void initMQTT()
  98. {
  99.     MQTT.setServer(BROKER_MQTT, BROKER_PORT);   //informa qual broker e porta deve ser conectado
  100.     MQTT.setCallback(mqtt_callback);            //atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
  101. }
  102.  
  103. //Função: função de callback
  104. //        esta função é chamada toda vez que uma informação de
  105. //        um dos tópicos subescritos chega)
  106. //Parâmetros: nenhum
  107. //Retorno: nenhum
  108. void mqtt_callback(char* topic, byte* payload, unsigned int length)
  109. {
  110.     String msg;
  111.  
  112.     //obtem a string do payload recebido
  113.     for(int i = 0; i < length; i++)
  114.     {
  115.        char c = (char)payload[i];
  116.        msg += c;
  117.     }
  118.    
  119.     //toma ação dependendo da string recebida:
  120.     //verifica se deve colocar nivel alto de tensão na saída D0:
  121.     //IMPORTANTE: o Led já contido na placa é acionado com lógica invertida (ou seja,
  122.     //enviar HIGH para o output faz o Led apagar / enviar LOW faz o Led acender)
  123.     if (msg.equals("L"))
  124.     {
  125.         digitalWrite(D0, LOW);
  126.         EstadoSaida = '1';
  127.     }
  128.  
  129.     //verifica se deve colocar nivel alto de tensão na saída D0:
  130.     if (msg.equals("D"))
  131.     {
  132.         digitalWrite(D0, HIGH);
  133.         EstadoSaida = '0';
  134.     }
  135.      
  136. }
  137.  
  138. //Função: reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
  139. //        em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito.
  140. //Parâmetros: nenhum
  141. //Retorno: nenhum
  142. void reconnectMQTT()
  143. {
  144.     while (!MQTT.connected())
  145.     {
  146.         Serial.print("* Tentando se conectar ao Broker MQTT: ");
  147.         Serial.println(BROKER_MQTT);
  148.         if (MQTT.connect(ID_MQTT))
  149.         {
  150.             Serial.println("Conectado com sucesso ao broker MQTT!");
  151.             MQTT.subscribe(TOPICO_SUBSCRIBE);
  152.         }
  153.         else
  154.         {
  155.             Serial.println("Falha ao reconectar no broker.");
  156.             Serial.println("Havera nova tentatica de conexao em 2s");
  157.             delay(2000);
  158.         }
  159.     }
  160. }
  161.  
  162. //Função: reconecta-se ao WiFi
  163. //Parâmetros: nenhum
  164. //Retorno: nenhum
  165. void reconectWiFi()
  166. {
  167.     //se já está conectado a rede WI-FI, nada é feito.
  168.     //Caso contrário, são efetuadas tentativas de conexão
  169.     if (WiFi.status() == WL_CONNECTED)
  170.         return;
  171.          
  172.     WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
  173.      
  174.     while (WiFi.status() != WL_CONNECTED)
  175.     {
  176.         delay(100);
  177.         Serial.print(".");
  178.     }
  179.    
  180.     Serial.println();
  181.     Serial.print("Conectado com sucesso na rede ");
  182.     Serial.print(SSID);
  183.     Serial.println("IP obtido: ");
  184.     Serial.println(WiFi.localIP());
  185. }
  186.  
  187. //Função: verifica o estado das conexões WiFI e ao broker MQTT.
  188. //        Em caso de desconexão (qualquer uma das duas), a conexão
  189. //        é refeita.
  190. //Parâmetros: nenhum
  191. //Retorno: nenhum
  192. void VerificaConexoesWiFIEMQTT(void)
  193. {
  194.     if (!MQTT.connected())
  195.         reconnectMQTT(); //se não há conexão com o Broker, a conexão é refeita
  196.      
  197.      reconectWiFi(); //se não há conexão com o WiFI, a conexão é refeita
  198. }
  199.  
  200. //Função: envia ao Broker o estado atual do output
  201. //Parâmetros: nenhum
  202. //Retorno: nenhum
  203. void EnviaEstadoOutputMQTT(void)
  204. {
  205.     if (EstadoSaida == '0')
  206.       MQTT.publish(TOPICO_PUBLISH, "D");
  207.  
  208.     if (EstadoSaida == '1')
  209.       MQTT.publish(TOPICO_PUBLISH, "L");
  210.  
  211.     Serial.println("- Estado da saida D0 enviado ao broker!");
  212.     delay(1000);
  213. }
  214.  
  215. //Função: inicializa o output em nível lógico baixo
  216. //Parâmetros: nenhum
  217. //Retorno: nenhum
  218. void InitOutput(void)
  219. {
  220.     //IMPORTANTE: o Led já contido na placa é acionado com lógica invertida (ou seja,
  221.     //enviar HIGH para o output faz o Led apagar / enviar LOW faz o Led acender)
  222.     pinMode(D0, OUTPUT);
  223.     digitalWrite(D0, HIGH);          
  224. }
  225.  
  226.  
  227. //programa principal
  228. void loop()
  229. {  
  230.     //garante funcionamento das conexões WiFi e ao broker MQTT
  231.     VerificaConexoesWiFIEMQTT();
  232.  
  233.     //envia o status de todos os outputs para o Broker no protocolo esperado
  234.     EnviaEstadoOutputMQTT();
  235.  
  236.     //keep-alive da comunicação com broker MQTT
  237.     MQTT.loop();
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement