#include "HX711.h"
#include <PubSubClient.h>
#include <WiFi.h>
// HX711 circuit wiring and calibration factor
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 4;
const int CALIBRATION_FACTOR = 420;
/* Configura os tópicos do MQTT */
#define TOPIC_PUBLISH "topic_weigth"
#define TOPIC_PUBLISH_MEDIA "topic_weigth_avarage"
#define PUBLISH_DELAY 2000 // Atraso da publicação (2 segundos)
#define ID_MQTT "esp32_mqtt" // id mqtt (para identificação de sessão)
const char *SSID = "Wokwi-GUEST"; // SSID / nome da rede WI-FI que deseja se conectar
const char *PASSWORD = ""; // Senha da rede WI-FI que deseja se conectar
const char *BROKER_MQTT = "broker.hivemq.com";
int BROKER_PORT = 1883; // Porta do Broker MQTT
unsigned long publishUpdate;
// variaveis para publicar os valores medidos e calcula a media
static char strWeight[10] = {0};
int avarage = 0;
int count = 0;
HX711 scale; // instancia do sensor
WiFiClient espClient; // Cria o objeto espClient
PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
void initWiFi(void);
void initMQTT(void);
void callbackMQTT(char *topic, byte *payload, unsigned int length);
void reconnectMQTT(void);
void reconnectWiFi(void);
void checkWiFIAndMQTT(void);
//prototipo da função de simulação do dinamometro
int getWeight(void);
/* Inicializa e conecta-se na rede WI-FI desejada */
void initWiFi(void)
{
delay(10);
Serial.println("------Conexao WI-FI------");
Serial.print("Conectando-se na rede: ");
Serial.println(SSID);
Serial.println("Aguarde");
reconnectWiFi();
}
/* Inicializa os parâmetros de conexão MQTT(endereço do broker, porta e seta
função de callback) */
void initMQTT(void)
{
MQTT.setServer(BROKER_MQTT, BROKER_PORT); // Informa qual broker e porta deve ser conectado
MQTT.setCallback(callbackMQTT); // Atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
}
/* Função de callback esta função é chamada toda vez que uma informação
de um dos tópicos subescritos chega */
void callbackMQTT(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;
}
}
/* Reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito. */
void reconnectMQTT(void)
{
while (!MQTT.connected()) {
Serial.print("* Tentando se conectar ao Broker MQTT: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado com sucesso ao broker MQTT!");
} else {
Serial.println("Falha ao reconectar no broker.");
Serial.println("Nova tentativa de conexao em 2 segundos.");
delay(2000);
}
}
}
/* Verifica o estado das conexões WiFI e ao broker MQTT.
Em caso de desconexão (qualquer uma das duas), a conexão é refeita. */
void checkWiFIAndMQTT(void)
{
if (!MQTT.connected())
reconnectMQTT(); // se não há conexão com o Broker, a conexão é refeita
reconnectWiFi(); // se não há conexão com o WiFI, a conexão é refeita
}
void reconnectWiFi(void)
{
// se já está conectado a rede WI-FI, nada é feito.
// Caso contrário, são efetuadas tentativas de conexão
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso na rede ");
Serial.print(SSID);
Serial.println("IP obtido: ");
Serial.println(WiFi.localIP());
}
int getWeight(void)
{
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(CALIBRATION_FACTOR);
if (scale.is_ready()) {
Serial.println("Solte o dinamometro para calibração...");
delay(5000);
scale.tare();
Serial.println("Calibração completa...");
Serial.print("Aperte o dinamometro...");
delay(5000);
long reading = scale.get_units(10);
Serial.print("Resultado: ");
Serial.println(reading);
return reading;
}
else {
Serial.println("HX711 not found.");
}
}
void setup() {
Serial.begin(115200);
//Inicia a conexão wIFI e com o MQTT
initWiFi();
initMQTT();
}
void loop() {
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
// Verifica o funcionamento das conexões WiFi e ao broker MQTT
checkWiFIAndMQTT();
if(count < 5){
//realiza 5 publicações com o peso medido, salvando o valor para calculo da media
int weight = getWeight();
avarage = avarage + weight;
sprintf(strWeight, "%d", weight);
MQTT.publish(TOPIC_PUBLISH, strWeight);
count ++;
} else {
//calcula e publica a media das ultimas 5 medições feitas
avarage = (int)avarage/5;
sprintf(strWeight, "%d", avarage);
MQTT.publish(TOPIC_PUBLISH_MEDIA, strWeight);
avarage = 0;
count = 0;
}
// Keep-alive da comunicação com broker MQTT
MQTT.loop();
}
delay(1000);
}