#include #include #include //----Configuração Serial---- #define SERIAL_SPEED 115200 //----Configuração do WiFi---- #define WIFI_SSID "ADAWiFi" #define WIFI_PASSWD "12345678" #define MAX_WIFI_INIT_RETRY 10 #define WIFI_RETRY_DELAY 500 //----Configuração do MQTT---- #define MQTT_CLIENT_ID "ADA" #define MQTT_SERVER "broker.do.seu.mqtt" //Já usamos este: https://www.cloudmqtt.com/ #define MQTT_UNAME "usuariomqtt" #define MQTT_PASSW "senhamqtt" #define MQTT_BROKER_PORT 18002 //A porta depende de seu broker! #define MQTT_TOPIC_1 "esp/topic1" #define MQTT_TOPIC_2 "esp/topic2" WiFiClient wifi_client; PubSubClient mqtt_client(wifi_client, MQTT_SERVER, MQTT_BROKER_PORT); bool mqtt_status; //A função de callback do MQTT é chamada em cada mensagem recebida através do MQTT //num tópico em que se está subscrito void mqtt_callback(const MQTT::Publish& pub){ Serial.println("Do tópico " + pub.topic() + ", foi recebida a mensagem: " + pub.payload_string() + "...\n"); mqtt_client.publish(MQTT_TOPIC_2, "Publicando no topico!"); } int MQTT_init(){ Serial.println("Inicializando comunicação MQTT........."); //Colocando uma função de "callback" quando uma mensagem chega no tópico em que se está subscrito mqtt_client.set_callback(mqtt_callback); //Máximo de tentativas para se conectar ao broker mqtt_client.set_max_retries(255); //Conectando ao broker do MQTT if (mqtt_client.connect( MQTT::Connect(MQTT_CLIENT_ID).set_keepalive(20000).set_auth(String(MQTT_UNAME), String(MQTT_PASSW)) )) { Serial.println("Sucesso ao conectar ao Broker.........."); //Tenta se subscrever a um tópico específico if (mqtt_client.subscribe(MQTT_TOPIC_1)) { Serial.println("Subscrição ao tópico do MQTT [" + String(MQTT_TOPIC_1) + "] bem sucedida........."); } else { Serial.println("Não foi possível se subscrever ao tópico [" + String(MQTT_TOPIC_1) + "]........."); mqtt_client.disconnect(); return false; } } else { Serial.println("Erro ao se conectar ao Broker.........."); } return mqtt_client.connected(); } //Função de inicialização do WiFi int WiFi_init(const char* wifi_ssid, const char* wifi_passwd){ int retries = 0; Serial.print("Conectando ao WiFi "); Serial.print(wifi_ssid); Serial.println(".........."); //Colocando o WiFi no modo station (ele se conecta aos WiFis) WiFi.mode(WIFI_STA); //Começa a se conectar no WiFi WiFi.begin(wifi_ssid, wifi_passwd); //Checa o estado da conexão. Se for WL_CONNECTED, então está conectado while ((WiFi.status() != WL_CONNECTED) && (retries < MAX_WIFI_INIT_RETRY)) { retries++; delay(WIFI_RETRY_DELAY); Serial.println("#"); } //Retorna o estado da conexão return WiFi.status(); } void setup() { //Configurando o monitor serial Serial.begin(SERIAL_SPEED); delay(100); //A variável mqtt_status é pré-definida para ser falsa mqtt_status = false; //Tenta se conectar ao WiFi até que realmente esteja conectado while(WiFi.status() != WL_CONNECTED){ Serial.println("Nova tentativa de se conectar ao WiFi:"); delay(500); if (WiFi_init(WIFI_SSID, WIFI_PASSWD) != WL_CONNECTED) { Serial.println("Erro ao se conectar ao WiFi...."); } else { //Se conectado, irá mostrar o IP da conexão Serial.print("Conexão WiFi ok com o IP "); Serial.print(String(WiFi.localIP()[0]) + "." + String(WiFi.localIP()[1]) + "." + String(WiFi.localIP()[2]) + "." + String(WiFi.localIP()[3])); Serial.println("...."); //A partir daqui, podemos nos conectar ao broker do MQTT //mas sempre devemos checar se ainda há conexão com o WiFi while(WiFi.status() == WL_CONNECTED && mqtt_status == false){ //Inicialização da conexão ao broker do MQTT Serial.println("Nova tentativa de se conectar ao broker do MQTT:"); mqtt_status = MQTT_init(); //"mqtt_status = true" significa sucesso if (!mqtt_status) Serial.println("Erro na conexão MQTT...."); else Serial.println("Conexão MQTT ok...."); } } delay(2000); } } void loop() { //Aqui você faz seu código }