Skip to content

Integração com MQTT

Estevam edited this page Jun 1, 2024 · 1 revision

Configuração do Broker MQTT

  1. Escolha do Broker MQTT:
  • Selecione um broker MQTT adequado para seu projeto. Exemplos incluem Mosquitto , HiveMQ , e EMQX .
  1. Instalação do Broker MQTT:
  • Mosquitto:
sudo apt update
sudo apt install mosquitto mosquitto-clients
  • EMQX:
# Para instalar EMQX via Docker:
docker run -d --name emqx -p 1883:1883 -p 8083:8083 emqx/emqx
  1. Configuração do Broker:
  • Modifique o arquivo de configuração do broker para definir os parâmetros necessários, como porta, autenticação e autorização.
  • Exemplo para Mosquitto:
listener 1883
allow_anonymous true
  1. Iniciando o Broker:
  • Mosquitto:
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
  • EMQX:
docker start emqx
  1. Verificação da Configuração:
  • Use um cliente MQTT para verificar se o broker está funcionando corretamente.
mosquitto_pub -h localhost -t test/topic -m "Hello MQTT"
mosquitto_sub -h localhost -t test/topic

Tópicos MQTT

Lista de tópicos utilizados no projeto e suas descrições:

  • 2bqsvw6678/temperatura2505
  • Descrição: Publicação da temperatura lida pelo sensor DHT11.
  • Tipo: Publicação.
  • 2bqsvw6678/humidade2505
  • Descrição: Publicação da umidade lida pelo sensor DHT11.
  • Tipo: Publicação.
  • 2bqsvw6678/nivelAgua2505
  • Descrição: Publicação do nível de água na cafeteira.
  • Tipo: Publicação.
  • 2bqsvw6678/
  • Descrição: Tópico base para controle da cafeteira (ligar/desligar).
  • Tipo: Assinatura.

Publicação e Assinatura

Publicação de Mensagens

Para publicar mensagens nos tópicos MQTT, o código no microcontrolador deve usar a função client.publish(). Aqui está um exemplo de como isso é feito no código:

// Publica os valores de temperatura e umidade
void dht_sensor_getdata() {
  float hm = dht.readHumidity();
  float temp = dht.readTemperature();

  // Converte os valores para String
  String tempString = String(temp, 2);
  String humString = String(hm, 2);

  // Publica os valores no broker MQTT
  client.publish("2bqsvw6678/temperatura2505", tempString.c_str());
  client.publish("2bqsvw6678/humidade2505", humString.c_str());
}

// Publica o valor do nível de água
void water_sensor_getdata() {
  // Subtrai a última leitura da soma
  total = total - readings[readIndex];
  
  // Lê a nova leitura do sensor de água
  readings[readIndex] = analogRead(waterSensorPin);
  
  // Adiciona a nova leitura à soma
  total = total + readings[readIndex];
  
  // Atualiza o índice da leitura
  readIndex = readIndex + 1;
  
  // Se estamos no final do array, volta ao início
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  
  // Calcula a média
  average = total / numReadings;

  // Converte o valor para String
  String waterString = String(average);

  // Publica o valor no broker MQTT
  client.publish("2bqsvw6678/nivelAgua2505", waterString.c_str());
}

Assinatura de Mensagens

Para assinar mensagens em um tópico MQTT, o código no microcontrolador deve usar a função client.subscribe() e definir um callback para processar as mensagens recebidas. Aqui está um exemplo de como isso é feito no código:

// Conecta ao broker MQTT e assina o tópico
bool connectMQTT() {
  byte tentativa = 0;
  while (!client.connected() && tentativa < 5) {
    if (client.connect("arduinoClient", mqtt_username, mqtt_password)) {
      Serial.println("Conexão bem-sucedida ao broker MQTT!");
      client.subscribe("2bqsvw6678/");
      return true;
    } else {
      Serial.print("Falha ao conectar: ");
      Serial.println(client.state());
      Serial.print("Tentativa: ");
      Serial.println(tentativa);
      delay(2000);
      tentativa++;
    }
  }
  Serial.println("Não foi possível conectar ao broker MQTT");
  return false;
}

// Callback para processar mensagens recebidas
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Mensagem recebida no tópico: ");
  Serial.println(topic);

  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }

  Serial.print("Mensagem: ");
  Serial.println(message);

  if (message.equals("ligar")) {
    toggleRelay(false);
  } else if (message.equals("desligar")) {
    toggleRelay(true);
  }
}

// Alterna o estado do relé e publica o novo estado
void toggleRelay(bool state) {
  relayState = state;
  digitalWrite(relayPin, state ? HIGH : LOW);
  client.publish("2bqsvw6678/", state ? "ligado" : "desligado");
}

Clone this wiki locally