Dispositivo de leitura de sinal serial e compartilhamento remoto de dados - Ajuda

Bom dia, conforme postei a um tempo atrás, eu estou desenvolvendo como TCC, um dispositivo que faz a leitura de um cabo db9 e manda esses dados para um broker MQTT. A leitura e conexão estão ocorrendo perfeitamente, mas o broker fica conectando e desconectando o tempo todo. 

Print monitor serial

Quem tiver interesse em me ajudar, me mande mensagem no pv que eu envio o script.

Muito obrigado!

obs: já tentei usar outros cloud brokers, mas o erro é o mesmo.

Exibições: 349

Responder esta

Respostas a este tópico

Olá.

   Sem mais informações fica dificil chutar alguma coisa.

   Verificaria:
   Cada conexão exige um nome de ClientID diferente, se vc estiver usando 2 dispositivos com o mesmo nome é isso. Se usa o nome que veio no exemplo em um broker publico, é isso.

   Veja onde está o comando de conexão, ele não deve estar no loop. Deve conectar só se não estiver conectado. A forma polida seria dar um delay depois da conexão e se desconectou antes de tentar novamente.

   Para testes uso esse: 

http://www.hivemq.com/demos/websocket-client/

   Pra mim é o que funciona melhor, na verdade não conheço muitos, se alguém tiver outras sugestão tb queria conhecer outros.

   Nessa pagina eu coloco:

"broker.hivemq.com", 8000 e pode deixar o clientId que vem.

   Na placa vc coloca:

"broker.hivemq.com", 1883 e inventa um clientid diferente. Pode ser o de cima acrescentando mais 3 letras. Só mudar 1 caracter pode ser pouco pq ele pode ter criado um com esse mesmo caracter para outra pessoa. 

  Esse tipo de servidor fica lotado de usuários, cada um tem que ter um clientid unico. Se vc não mexeu nele pode ter outra pessoa usando o mesmo.

   Caso parta para um servidor só seu (seja montando ele ou pagando) aíh fica mais fácil de escolher o clientid.

Olá, Eduardo. Obrigado por responder!

Eu testei com várias Client ID para ver se esse era o problema, mas infelizmente não é esse. 

Segue o script que estou utilizando:

// --- WIFI ---
#include<WiFi.h>
const char* ssid = "ssid";
const char* password = "senha";
WiFiClient ESPClient;


// --- MQTT ---
#include <PubSubClient.h>
const char* mqtt_Broker = "broker.hivemq.com";
const char* mqtt_ClientID = "DadosAutoclaveTeste";
PubSubClient client(ESPClient);
const char* topicoLeitura = "Autoclave/Teste001A";

//---Leitura de dados
#define RXD2 16
#define TXD2 17
char l;
String readString;
char stringToChar[100];

void iniciarSerial(){
Serial.begin(115200);
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
Serial2.println("serial2teste");
Serial.println("Serial Txd is on pin: " + String(TX));
Serial.println("Serial Rxd is on pin: " + String(RX));
Serial.println("teste monitor serial");
}

void setup() {
iniciarSerial();
conectarWifi();
client.setServer(mqtt_Broker, 1883);
}
void loop() {
if ((!client.connected()) && (WiFi.status() == WL_CONNECTED)) {
reconectarMQTT();}
fazerLeitura();
}

void conectarWifi() {
delay(10);
Serial.print("Conectando ao WiFi");
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("ESP Mac Address: ");
Serial.println(WiFi.macAddress());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
Serial.print("DNS: ");
Serial.println(WiFi.dnsIP());

}

void reconectarMQTT() {
delay(50);
while (!client.connected()) {
client.connect(mqtt_ClientID);
delay(50);
Serial.println("Conectando-se com o Broker");
client.connect(mqtt_ClientID);
Serial.println("Conectado");
Serial.print(client.connected());
}
}

void publicarLeitura() {

client.publish(topicoLeitura, String(stringToChar).c_str(), true);

}

void fazerLeitura(){
while (Serial2.available()) {
l = Serial2.read();
readString = readString + l;
}
if (readString.length() > 0) {
Serial.print(readString);
Serial2.print(readString);
readString.toCharArray(stringToChar, 100);
publicarLeitura();
//server.print(readString);
readString = "";
}
}

Tente tirar um dos conect em:

client.connect(mqtt_ClientID); //Primeiro, tira esse...
delay(50);
Serial.println("Conectando-se com o Broker");
client.connect(mqtt_ClientID); // Segundo

Feito, e infelizmente o erro continua.


void reconectarMQTT() {
while (!client.connected()) {
Serial.println("Conectando-se com o Broker");
client.connect(mqtt_ClientID);
Serial.println("Conectado");
Serial.print(client.connected());
}
}

Estou começando a acreditar que pode ser um problema no próprio es3 32. Você possui algum esp no qual possa testar? Se não ficar reconectando o tempo todo, significa que o problema esta no hardware

// --- WIFI ---
#include<WiFi.h>
const char* ssid = "WMED_2.4G";
const char* password = "Wmed2022";
WiFiClient ESPClient;


// --- MQTT ---
#include <PubSubClient.h>
const char* mqtt_Broker = "broker.hivemq.com";
const char* mqtt_ClientID = "DadosAutoclaveTeste";
PubSubClient client(ESPClient);
const char* topicoLeitura = "Autoclave/Teste001A";

//---Leitura de dados
#define RXD2 16
#define TXD2 17
char l;
String readString;
char stringToChar[100];

void iniciarSerial(){
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
Serial2.println("serial2teste");
Serial.println("Serial Txd is on pin: " + String(TX));
Serial.println("Serial Rxd is on pin: " + String(RX));
Serial.println("teste monitor serial");
}
void conectarWifi() {
delay(10);
Serial.print("Conectando ao WiFi");
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("ESP Mac Address: ");
Serial.println(WiFi.macAddress());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
Serial.print("DNS: ");
Serial.println(WiFi.dnsIP());

}
void reconectarMQTT() {
while (!client.connected()) {
Serial.println("Conectando-se com o Broker");
client.connect(mqtt_ClientID);
Serial.println("Conectado");

}
}


void setup() {
iniciarSerial();
conectarWifi();
client.setServer(mqtt_Broker, 1883);
}

void loop() {
if ((!client.connected()) && (WiFi.status() == WL_CONNECTED)) {
reconectarMQTT();
}
fazerLeitura();
}


void publicarLeitura() {
Serial.println(client.connected());
client.publish(topicoLeitura, String(readString).c_str(), true);
}

void fazerLeitura(){
while (Serial2.available()) {
l = Serial2.read();
readString = readString + l;
}
if (readString.length() > 0) {

Serial2.print(readString);
readString.toCharArray(stringToChar, 100);
publicarLeitura();
Serial.print(stringToChar);
//server.print(readString);
readString = "";
}
}

Pra poder testar o seu codigo vc precisa por ele anexado.

Se copiar e colar do jeito que está tudo pode acontecer, coisas como perder caracteres, trechos, formatação, etc.

O problema que o ESP mais dá é de alimentação.

Nem todas as portas USB conseguem suprir a corrente que ele precisa na hora que vai comunicar, os cabos finos também não dão conta. Use sempre portas traseiras e se possível USB 3.0 (não que ele seja 3.0, mas as 3.0 oferecem limites maiores de corrente), alem de cabos do tipo carregador. O cabo que vem quando vc compra normalmente é bom, curto e grosso. Esses comprados em camelô costumam não funcionar.

SCRIPT_PRONTO_SENDO_TESTADO.ino

No meu caso aconteceu o oposto, o cabo que veio com o ESP veio com mal contato kkk.

Acho que achei !

No Loop vc precisa colocar um client.loop();

void loop() {
if ((!client.connected()) && (WiFi.status() == WL_CONNECTED)) {
reconectarMQTT();
}
fazerLeitura();
client.loop(); //<= Isso.
}

Infelizmente o erro persiste

SCRIPT_PRONTO_SENDO_TESTADO.ino

Aqui rodou bem, deixei 2 minutos e não deu nenhuma reconexão.

Seu ultimo executável, só mudei os dados do wifi pros meus.

Será que seu wifi não está fraco ?

Cara, eu testei com outro cabo USB e funcionou KKK. Passei pelo menos dez horas tentando resolver e era o cabo KKKK.
Agora a única coisa que tenho que resolver é que eu não consegui enviar uma string para o broker, então converti a leitura do Serial para Char e esta mandando de um em um, preciso dar um jeito de ler todas as informações e depois publicar, porque se não ele vai publicando letra por letra. Alguma idéia além do delay?

Legal. De qq jeito antes do client.loop() aqui tb estava dando reconect.

   Se os dados são strings terminadas em chr(13)  (CR) vc pode procurar por ele.

   Vai acumulando os dados que chegam, quando vier chr(13) vc envia.

   Possivelmente vem chr(10) tb (LF), que vc precisa ignorar.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço