Bonjour,
au début, cette arduino est relié à des relais qui me permettent de faire fonctionner les télécommandes de mes volets.
J'utilise plusieurs styles de communication, le Bluetooth et des requêtes http. J'aime avoir plusieurs possibilités au cas où l'un des 2 tombes en panne.
Et comme j'ai beaucoup de temps à passer, pourquoi ne pas utiliser le MQTT.
J'essaye d'abord sur un ESP, Il se connecte en Wi-Fi et sur mon broker tranquillement, il fait ce que je lui demande.
Ensuite, je le modifie pour le faire passer en Ethernet pour l'arduino. Ça marche pas trop mal…
mais au bout de quelques minutes, Tout est allumé mais ni le port série ni les messages MQTT sont reçus.
Pourtant tout est connecté.
Il suffit simplement de déconnecter et rebrancher le câble USB ou l'alimentation électrique pour qu'il repart. Pas très pratique à la longue.
J'ai essayé :
- Déconnecter le port série
- Modifier la vitesse du port série
- Mettre différent délai
J'ai pensé que l'arduino manquait de puissance ou d'autre chose mais avant il fonctionne avec un serveur Web. Ensuite, Est-ce qu'il y a un problème avec le broker qui l'éjecte mais le port série aussi bloc.
Ou ça vient tout simplement d'un problème de mon code
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
byte mac[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
byte ip[] = {192, 168, 1, 38};
//EthernetServer serveur(80);
// réception/émission Bluetooth
#define SEND_BT_TX 1
#define RECEIVE_BT_RX 0
//SoftwareSerial HC06(RECEIVE_BT_RX, SEND_BT_TX);
// mqtt
const char *mqttServer = "***";
const int mqttPort = 1883;
const char *mqttUser = "***";
const char *mqttPassword = "***";
const char *topicOut = "arduino/volets/retourRelais/state";
const char *topicIn = "arduino/volets/envoiRelais/state";
int pinVolets[30] = {
/* M - S - D */
49, 20, 21, // g
22, 23, 24, // a
25, 26, 27, // b
28, 29, 30, // c
31, 32, 33, // d
34, 35, 36, // e
37, 45, 44, // f
43, 42, 41, // 1
40, 39, 38, // 2
46, 47, 48 // 3
};
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);
String relais, receptionBt, receptionMqtt;
boolean mqttEnvoi;
/********************************/
/* Reconnection au serveur MQTT */
/********************************/
void reconnection_mqtt() {
// Loop until we're reconnected
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (mqttClient.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
mqttClient.publish("outTopic", "hello world");
// ... and resubscribe
mqttClient.subscribe("inTopic");
}
else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// Réception MQTT
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message reçu : ");
Serial.println(topic);
for (int i = 0; i < length; i++) {
// Serial.print((char) payload[i]);
receptionMqtt += (char)payload[i];
}
Serial.println();
mqttEnvoi = false;
recuperation_relais(receptionMqtt);
receptionMqtt = "";
// Serial.write(payload, length);
}
void envoi_mqtt(const char *y, String x) {
// Conversion String-> char
char mqttEnvoi[x.length() + 1];
x.toCharArray(mqttEnvoi, x.length() + 1);
// Envoi MQTT
mqttClient.publish(y, mqttEnvoi);
}
/********************************************/
/* Récupération des relais via le Bluetooth */
/********************************************/
void reception_msg_bt() {
if (Serial.available() > 0) {
mqttEnvoi = true;
receptionBt = Serial.readString();
recuperation_relais(receptionBt);
}
}
void recuperation_relais(String x) {
for (int i = 0; i < x.length(); i++) {
int a = x.indexOf('-');
if (a != -1) {
relais = x.substring(0, a);
x.remove(0, a + 1);
if (mqttEnvoi) {
envoi_mqtt(topicOut, relais);
}
Serial.println(relais);
action_relais(relais);
}
else {
relais = x;
x.remove(0);
if (mqttEnvoi) {
envoi_mqtt(topicOut, relais);
}
Serial.println("relais: " + relais);
action_relais(relais);
}
}
}
void action_relais(String w) {
int relaisInt = w.toInt();
for (int i = 0; i < 30; i++) {
if (pinVolets[i] == relaisInt) {
digitalWrite(relaisInt, LOW);
delay(2000);
digitalWrite(relaisInt, HIGH);
delay(200);
Serial.println(" Relais actif :");
Serial.println(relaisInt);
}
}
}
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
delay(1000);
mqttClient.setServer(mqttServer, mqttPort);
mqttClient.connect("mega", mqttUser, mqttPassword);
mqttClient.subscribe(topicIn);
mqttClient.setCallback(callback);
for (int p = 0; p < 30; p++) {
pinMode(pinVolets[p], OUTPUT);
digitalWrite(pinVolets[p], HIGH);
}
}
void loop() {
if (!mqttClient.connected()) {
reconnection_mqtt();
}
mqttClient.loop();
reception_msg_bt();
mqttClient.subscribe("inTopic");
}
Ce n'est pas parfait loin de la, ça doit peut-être même faire grincer des dents pour certains.
J'ai fait quelques essais avec certaines fonctions pas toujours utiles mais ça m'apprend.
J'espère que j'ai pu être assez clair dans mes explications.
Merci beaucoup d'avance pour vos réponses futures.