problème ESP01S + Arduino (liaison série) pour Domotique (Jeedom)

Bonjour,

Tout d'abord, je dois préciser que je suis profane en programmation et en Arduino, je vois globalement mais dès qu'il faut rentrer dans le détail c'est plus dur.
J'ai passé pas mal de temps a régler mon problème avant de poster mon message, mais avec mon niveau de connaissance, je m'oriente vers vous

But/présentation du système:
Piloter des relais avec une Arduino par l'intermédiaire de commandes envoyées par Wifi à un ESP01S sous ESP Easy.
Ces relais pilotent mes volets roulants.
Ma domotique sous Jeedom pilote actuellement une carte Arduino par l'intermédiaire d'un plugin, cela fonctionne très bien.
Pour des problèmes de compatibilité, je dois trouver un moyen d'envoyer des commandes à mon Arduino depuis ma Domotique sans utiliser le système actuel (Jeeduino). Un plugin ESP Easy existe et me permet d'envoyer des infos séries à un ESP.

Apres passage en revue de beaucoup de solutions, je suis partis sur une module ESP01S (un esp8266 dédié a la com série on va dire).
Ce module a été flashé avec ESP Easy, c'est fonctionnel.
Je voudrai envoyer un numéro de relais à activer depuis ma domotique et que l'Arduino active le relais en conséquence. Si je peux mettre des noms au lieu de numéro, c'est encore mieux.

Coté Arduino, j'ai fait un montage de test avant d'installer tout ça sur le système existant. Pour l'instant je n'arrive pas à le faire fonctionner.
L'idée de ce montage est d'allumer des leds en fonction de ce que l'arduino reçoit.
Je tiens à préciser que l'ESP est connecté a l'Arduino avec des convertisseurs de tension.

Les problèmes:
Avec le programme que j'ai fait, je reçois constamment (enfin par vague) des données séries ==> est ce normal?
Problème du coté Arduino ou ESP? Je epnche pour l'Esp qui envoie régulièrement des infos non demandées...

Pour envoyer une info, j'utilise la commande suivante:
http://192.168.1.62/control?cmd=serialsend,77 ==> 77 peut être remplacé par autre chose

Voici le code de l'Arduino (réalisé a partir d'exemples glané sur internet):

int RVch1HUp = 13; //Relais volet Chambre 1 Haut Montée
int RVch1HDn = 12; //Relais volet Chambre 1 Haut Descente
int Infoserie = 0; //Variable ou sera écrit ce qui sera reçu part le port série

void setup() {
  // put your setup code here, to run once:
pinMode(RVch1HUp, OUTPUT); //configuration pin13 en sortie
pinMode(RVch1HDn, OUTPUT); //configuration pin12 en sortie
Serial.begin(9600); //démarrage communication série
}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()>0){ //on regarde si le buffer a des données
  Infoserie = Serial.read(); //on recopie les données dans la variable Infoserie
  delay(100);
  Serial.print("Info lue : ");
  Serial.println(Infoserie);
  //while (Serial.available()) Serial.read();
  if (Infoserie == 32 ){ //si test est vrai, activation de la sortie pour 1 seconde
    Serial.print("Action : ");
    Serial.println("OK1"); 
    digitalWrite(RVch1HUp, HIGH);
    delay(1000);
    digitalWrite(RVch1HUp, LOW);}
  else if (Infoserie == 77 ){
    Serial.print("Action : ");
    Serial.println("OK0");    
    digitalWrite(RVch1HDn, HIGH);
    delay(1000);
    digitalWrite(RVch1HDn, LOW);
  }
}
}

Voilà, si quelqu'un aurait des idées je suis preneur.

Rémi.

Re,

Donc après un peu de recherche, j'ai changé le type de variable pour du String (par contre pas déclaré au début sinon erreur de compilation... Donc déclaration dans la boucle void loop().

C'est bien mieux, je peux recevoir du texte qui sera plus fiaible.

Mon ESP envoie toujours pas mal de choses que je dois ignorer, si j'y arrive je suis bon, voici ce qu'il y a sur le moniteur série:

Info lue : 303971 : Info   : WD   : Uptime 5 ConnectFailures 7 FreeMem 25656 WiFiStatus 3 ESPeasy internal wifi status: Conn. IP Init

Info lue : 333971 : Info   : WD   : Uptime 6 ConnectFailures 7 FreeMem 25656 WiFiStatus 3 ESPeasy internal wifi status: Conn. IP Init

Info lue : 363971 : Info   : WD   : Uptime 6 ConnectFailures 7 FreeMem 25656 WiFiStatus 3 ESPeasy internal wifi status: Conn. IP Init

Info lue : 381062 : Info   : HTTP: serialsend,testreceptiontestreception


Info lue : 393971 : Info   : WD   : Uptime 7 ConnectFailures 7 FreeMem 24616 WiFiStatus 3 ESPeasy internal wifi status: Conn. IP Init

Info lue : 397471 : Info   : HTTP: serialsend,testreception2testreception2

On peut voir que ce qui m'interesse c'est ça:
Info lue : 381062 : Info : HTTP: serialsend,testreceptiontestreception
Info lue : 397471 : Info : HTTP: serialsend,testreception2testreception2

Dans cette chaine, le numéro après Info lue change à chaque fois, comment je pourrais faire un test qui isole ma commande, c'est à dire ce qui se trouve après sérialsend?

Bon bien j’ai trouvé, pas évident car je débute en programmation, c’est plus ou moins mes premières lignes de code hors tuto…
J’ai utilisé la fonction .startsWith(« chaine recherchée », position premier caractère dans la chaine):

int RVch1HUp = 13; //Relais volet Chambre 1 Haut Montée
int RVch1HDn = 12; //Relais volet Chambre 1 Haut Descente
//String Infoserie = 0; //Variable ou sera écrit ce qui sera reçu part le port série

void setup() {
  // put your setup code here, to run once:
pinMode(RVch1HUp, OUTPUT); //configuration pin13 en sortie
pinMode(RVch1HDn, OUTPUT); //configuration pin12 en sortie
Serial.begin(9600); //démarrage communication série
}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()>0){ //on regarde si le buffer a des données
  String Infoserie = Serial.readString(); //on recopie les données dans la variable Infoserie
  delay(100);
  int startofrealinfo = Infoserie.indexOf(','); //on recherche la position de la virgule dans la chaine de caractère
  Serial.print("Info lue : "); //affiche "Info lue :" dans le moniteur série
  Serial.println(Infoserie); //affiche la String reçue dans le moniteur série
  Serial.print("Position de la virgule : "); //affiche "Position de la virgule : " dans le moniteur série
  Serial.println(startofrealinfo);//Affiche la position de la virgule dans le moniteur série
  //while (Serial.available()) Serial.read(); //on lit les données dans le buffer quand non vide
  if (Infoserie.startsWith(",RVch1HUpRVch1HUp", startofrealinfo)){ //on test si la valeur après la position de la virgule correspond au test, si vrai, on allume la led pendant une seconde
    Serial.print("Action : ");
    Serial.println("OK1"); 
    digitalWrite(RVch1HUp, HIGH);
    delay(1000);
    digitalWrite(RVch1HUp, LOW);}
  else if (Infoserie.startsWith(",RVch1HDnRVch1HDn", startofrealinfo)){
    Serial.print("Action : ");
    Serial.println("OK0");    
    digitalWrite(RVch1HDn, HIGH);
    delay(1000);
    digitalWrite(RVch1HDn, LOW);
  }
}
}

C'est peut être pas très propre mais ça fonctionne.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.