MQTT – Conectando seu arduino à nuvem – O PROTÓTIPO

Fala galera!!!
Bom hoje vou fazer mais um post sobre o MQTT.
Segunda feira eu estava dando uma olhada no site do Robocore (não é propaganda, não estou ganhando nada com isso) e me deparei com um transformador 5v que entrava 110/220 e saia exatamente a voltagem que eu precisava para ligar o arduino de um modo que eu não precise abrir um carregador de celular pra pegar o circuito e além disso o meu projeto iria ficar bem menor em relação à espaço, então eu fui lá e comprei.

Ai eu pensei: E se eu fizesse uma plaquinha bem simples onde eu pudesse entrar a energia elétrica e sair , conectar o meu arduino e o um relê de um modo que fique pequeno e prático…

Pois bem, foi isso que eu fiz. Nesse site mesmo comprei 2 conectores, uma placa PCB ilhada ( ou seja os furos não têm interligações) , e obviamente o transformador.

Com isso em mãos eu fiz um esquema bem simples mas que funcionou muito bem pra mim:

  1. Coloquei 1 conector em cada extremidade e em posições opostas para evitar ao máximo contato entre os fios
  2. conectei o primeiro conector com um fio de  1,5mm, porque era o que eu tinha aqui no momento porém pode ser fios de 0,5 ja que não pretendemos ligar nada de uma amperagem muito alta, até porque se for uma amperagem muito alta capaz até do relê não aguentar o tranco antes de dar alguma merda.
  3. coloquei o relê e o ESP fora da placa só porque não coube, essa placa era muito pequena e eu tive que escolher em fixar os componentes mais importantes para a placa funcionar
  4. Coloquei 3 leds para indicar o estado do ESP onde:
    Vermelho é sem conexão com a internet
    Amarelo é sem conexão com o servidor do mosquitto
    Verde é tudo ok! , sendo que eles se apagam quando encontra a internet e o mosquitto, ficando apenas sempre a verde conectada.

    Agora uma informação bem importante!

Sei que parece a sua mãe ou qualquer outra pessoa mais velha falando isso, mas por favor TOMEM MUITO cuidado nos processos daqui pra frente, se você não manja muito de conexão de eletricidade, veja com alguem que entenda e que possa te ajudar! Um choque de 110v é bem perigoso, chato e dolorido, então vamos evitar problemas maiores e sempre coloque uma extensão ou um filtro de linha que tenha algum dipo de disjuntor ou um fuzível que evite que qualquer fio mal colocado possa botar em risco a instalação elétrica da sua casa por curto! tipo essa imagem abaixo de quando estava começando a fazer o protótipo!

Eu também coloquei dentro de uma caixa de acrílico que eu tinha aqui somente para organização mesmo e fiz uns furos para que ela pudesse fechar , ficando mais ou menos assim

Se vocês lembram do código da parte 3 , fiz umas pequenas modificações para que os leds funcionem da maneira que eu queria.

Coloquei os leds nos pinos D6,D7,D8 e mantive o relê no D5

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

const char* ssid = "SSID";
const char* password = "SENHA";
const char* mqtt_server = "MQTTSERVER";
const char* login_mqtt = "login_mqt";
const char* senha_mqtt = "senhaMQTT";
long lastMsg = 0;
const int device = D5;  //DEVICE NO CASO DE SOMENTE SER UMA LAMPADA 
const int amarelo = D6;
const int verde = D7;
const int vermelho = D8;

/*
* @ Modelo da chamada do publish ou post:
* /ambiente/MAC-ADDRESS/GET <- Fica emitindo a informação do estado do pino
* /ambiente/MAC-ADDRESS/SET <- Recebe um novo estado para o pino
*/

String publishService = "";
char servicePublish[65] ;
// ^^ Variaveis que irão receber a string de publish, ou seja que irão ficar publicando o resultado na web ^^

String  postService = "";
char servicePost[65] ;
// ^^ Variaveis que irão enviar um valor para o ESP fazendo as alterações no estado de acordo com o valor enviado

WiFiClient espClient;
PubSubClient client(espClient);


void configura_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connectando em: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(vermelho, HIGH);
    digitalWrite(verde, HIGH);
    delay(500);
    digitalWrite(verde, LOW);
    Serial.print(".");
  }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("IP: ");
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.macAddress());
  String MACADDR = (WiFi.macAddress());
  digitalWrite(verde, HIGH);
  MACADDR.replace(":","");
  //Configurando o link de publish
  publishService +=   "/arduino/";
  publishService +=   MACADDR.c_str();
  publishService +=   "/GET";
  publishService.toCharArray(servicePublish, 65);
  
  //Configurando o link de post
  postService +=   "/arduni/";
  postService +=   MACADDR.c_str();
  postService +=   "/SET";
  postService.toCharArray(servicePost, 65);  
}

void checar_wifi(){
  if(WiFi.status() != WL_CONNECTED){
    Serial.println("Conexão perdida");
    configura_wifi(); 
  }else{
    digitalWrite(vermelho, LOW);
  }
}


char * estadoSensor(int device){
  char msg[75] ;
  int ledState = digitalRead(device);
   sprintf(msg, "%d", ledState);
    Serial.println(msg);
    return (msg);
}



void callback(char* topic, byte* payload, unsigned int length) {
 

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    Serial.println("PAYLOAD");
    Serial.println(payload[0]);
    digitalWrite(device, HIGH);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is acive low on the ESP-01)
  } else {
    digitalWrite(device, LOW);  // Turn the LED off by making the voltage HIGH
  }

       // client.publish(topic,payload,length);


}

void conectaMQTT(){
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  String clientId = "CASAINTELIGENTE-RASPIBR-";
  clientId += String(random(0xffff), HEX);
   if (client.connect(clientId.c_str(), login_mqtt, senha_mqtt)) {
    digitalWrite(amarelo, LOW);
      Serial.println("conectado ao MQTT");
      char * sensorData = estadoSensor(device);
      client.publish(servicePublish,sensorData);
      
      client.subscribe(servicePost);
    } else {
      Serial.print("erro ao conectar ao MQTT, erro=");
      Serial.print(client.state());
      Serial.println(" tentando novamente em 5 segundos");
     digitalWrite(amarelo, HIGH);
      delay(5000);
    }
  
}




void setup() {
pinMode(device, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
pinMode(amarelo, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
digitalWrite(amarelo, HIGH);
pinMode(vermelho, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
digitalWrite(vermelho, HIGH);
pinMode(verde, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
digitalWrite(verde, HIGH);
 digitalWrite(device, LOW); 
Serial.begin(115200);
configura_wifi();  
conectaMQTT();
}

void loop() {  
  
  checar_wifi();
  if (!client.connected()) {
    digitalWrite(amarelo, HIGH);
    conectaMQTT();
  }
  client.loop();
  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;  
     char * sensorData = estadoSensor(device);
     client.publish(servicePublish,sensorData);
  } 
}

E agora segue o vídeo mais explicativo ainda sobre o projeto

Espero que tenham gostado e qualquer dúvida ou sugestão podem mandar pra mim aqui nos comentários que eu terei o prazer em responder!

Valeuu!!!