Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Equivalencia das saidas Digitais entre NodeMCU e ESP8266 (na IDE do Arduino)
- NodeMCU - ESP8266
- D0 = 16;
- D1 = 5;
- D2 = 4;
- D3 = 0;
- D4 = 2;
- D5 = 14;
- D6 = 12;
- D7 = 13;
- D8 = 15;
- D9 = 3;
- D10 = 1;
- */
- #include <FS.h> //Esta precisa ser a primeira referência, ou nada dará certo e sua vida será arruinada. kkk
- #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
- #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
- #include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson
- #include <PubSubClient.h>
- #include <Servo.h>
- char strMacAddress[18];
- #define DEBUG //Se descomentar esta linha vai habilitar a 'impressão' na porta serial
- //Coloque os valores padrões aqui, porém na interface eles poderão ser substituídos.
- #define servidor_mqtt "m16.cloudmqtt.com" //URL do servidor MQTT
- #define servidor_mqtt_porta "17236" //Porta do servidor (a mesma deve ser informada na variável abaixo)
- #define servidor_mqtt_usuario "dudeznvi" //Usuário
- #define servidor_mqtt_senha "fhY4VcbP7Nx5" //Senha
- //#define mqtt_topico_pub "esp8266/pincmd" //Tópico para publicar o comando de inverter o pino do outro ESP8266
- char* mqtt_topico_pub = strMacAddress;//+"/alimentar";
- WiFiClient espClient; //Instância do WiFiClient
- PubSubClient client(espClient); //Passando a instância do WiFiClient para a instância do PubSubClient
- //bool statusAnt = 0; //Variável que armazenará o status anterior do pino
- bool precisaSalvar = false; //Flag para salvar os dados
- Servo servo;
- //Função para imprimir na porta serial
- void imprimirSerial(bool linha, String mensagem){
- #ifdef DEBUG
- if(linha){
- Serial.println(mensagem);
- }else{
- Serial.print(mensagem);
- }
- #endif
- }
- //Função que reconecta ao servidor MQTT
- void reconectar() {
- //Repete até conectar
- while (!client.connected()) {
- imprimirSerial(false, "Tentando conectar ao servidor MQTT...");
- //Tentativa de conectar. Se o MQTT precisa de autenticação, será chamada a função com autenticação, caso contrário, chama a sem autenticação.
- bool conectado = strlen(servidor_mqtt_usuario) > 0 ?
- client.connect("ESP8266Client", servidor_mqtt_usuario, servidor_mqtt_senha) :
- client.connect("ESP8266Client");
- if(conectado) {
- imprimirSerial(true, "Conectado!");
- } else {
- imprimirSerial(false, "Falhou ao tentar conectar. Codigo: ");
- imprimirSerial(false, String(client.state()).c_str());
- imprimirSerial(true, " tentando novamente em 5 segundos");
- //Aguarda 5 segundos para tentar novamente
- delay(5000);
- }
- }
- }
- void desconectar(){
- imprimirSerial(true, "Fechando a conexao com o servidor MQTT...");
- client.disconnect();
- }
- //Função que envia os dados de umidade e temperatura.
- void recebeComando() {
- if (!client.connected()) {
- imprimirSerial(true, "MQTT desconectado! Tentando reconectar...");
- reconectar();
- }
- client.loop();
- //Publicando no MQTT
- imprimirSerial(true, "Fazendo a subscribe...");
- client.subscribe(mqtt_topico_pub);
- //Serial.println()
- }
- //Função inicial (será executado SOMENTE quando ligar o ESP)
- void setup() {
- #ifdef DEBUG
- Serial.begin(115200);
- #endif
- imprimirSerial(true, "...");
- byte mac[6];
- WiFi.macAddress(mac);
- MacAddress2Str(mac);
- WiFiManagerParameter paramMacAddress("macAddress", "MAC Address", strMacAddress, 18);
- servo.attach(5);
- servo.write(0);
- //Inicialização do WiFiManager. Uma vez iniciado não é necessário mantê-lo em memória.
- WiFiManager wifiManager;
- wifiManager.addParameter(¶mMacAddress);
- wifiManager.startConfigPortal("AlimentaCao");
- //Se chegou até aqui é porque conectou na WiFi!
- imprimirSerial(true, "Conectado!! :)");
- imprimirSerial(false, "IP: ");
- imprimirSerial(true, WiFi.localIP().toString());
- //Informando ao client do PubSub a url do servidor e a porta.
- int portaInt = atoi(servidor_mqtt_porta);
- client.setServer(servidor_mqtt, portaInt);
- client.setCallback(recebePacote);
- }
- //Função de repetição (será executado INFINITAMENTE até o ESP ser desligado)
- long lastMsg = 0;
- void loop() {
- long now = millis();
- if (now - lastMsg > 500) {
- lastMsg = now;
- recebeComando();
- }
- }
- void *MacAddress2Str(byte *_mac)
- {
- sprintf(strMacAddress, "%02x:%02x:%02x:%02x:%02x:%02x",
- _mac[0], _mac[1], _mac[2], _mac[3], _mac[4], _mac[5]);
- }
- void recebePacote(char* topic, byte* payload, unsigned int length)
- {
- String msg;
- //obtem a string do payload recebido
- for(int i = 0; i < length; i++)
- {
- char c = (char)payload[i];
- msg += c;
- }
- Serial.println("Subscribe recebido: "+msg);
- distribuiRacao(msg.toInt());
- }
- void distribuiRacao(int tempo){
- servo.write(90);
- delay(tempo);
- servo.write(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement