ESP32 et APP Inventor

Bonsoir,
J'utilise cette fois WifiServer pour "dialoguer" avec une app créée avec APP Inventor2.
Pas de problème dans le sens "descendant", c'est à dire de l'app vers l'ESP.
Dans l'autre sens, j'utilise client.println() pour renvoyer un état que je met dans une zone texte.
Jusque là, tout va bien.
Le problème c'est que je voudrais envoyer une 2ème variable et la mettre dans une 2ème zone texte.
Sauf que App Inventor ne connait pas le nom des variables que j'envoi.
Le 2ème envoi est mis, à la ligne, dans la 1ère zone texte.
Comment faire?

Jean-Michel

Bonsoir loco28

Je n'ai jamais fait de liaison Wifi avec MAI, mais que du Bluetooth, mais je veux bien regarder ton fichier aia et essayer de t'aider.
Zippe le et mets le en ligne et mets moi les lignes de code qui envoient les textes.

Cordialement
jpbbricole

Bonsoir et désolé de ma réponse tardive, j'ai galéré sur des trucs pourtant évident.

Mes deux fichiers sont prêts mais comment je fais pour le fichier .aia?
Il est stocké à distance et je ne vois pas comment le récupérer. J'ai essayé les "importer", "exporter", sans succès.

Jean-Michel

Bonsoir loco28

Depuis MAI,


c'est Export selected...

Dans l'ordinateur, je suis sur PC, le fichier aia se trouvera dans le répertoire Téléchargements.
Tu zippes le fichier aia, tu copies le zip dans le presse-papier et tu le colles dans la réponse du forum.

A+
Cordialement
jpbbricole

Bonsoir,
Merci pour l'info. J'avais fait cette manip mais rien n'était apparut dans le téléchargement.
Là cela à fonctionné.
Ci-dessous le fichier zip
Pilotage_distant.zip (2.1 KB)
et le code esp (complet). Les lignes qui envoient des infos vers l'APP sont à la fin.

[Pilotage_distant.zip|attachment](upload://yfUBQBspt4KIW3PQVdJfp9u24js.zip) (2.1 KB)

La partie allumage led et retour de son état fonctionne bien.

Le capteur de température renvoi les variables temp et hum.
Pour l'instant, avec les lignes client.println, temp apparait dans la même case que etat, et hum n'apparait pas.
Accessoirement je viens de voir un autre problème: l'envoi de temp et hum ne se fait que si je manipule les boutons ON ou OFF.
Il doit manquer une ligne pour le rafraichissement?

Jean-Michel

Bonjour loco28

Je crois que le code n'a pas bien passé :woozy_face:
Il te suffit de le copier et coler entre les balises:
image

A+
Cordialement
jpbbricole

Bonjour loco28

Pour pouvoir afficher plusieurs valeurs dans plusieurs champs de MAI, il faut pouvoir les discerner, je fais ainsi, pour exemple tes 3 valeurs ETAT, TEMP et HUM, pour les mettre dans leurs champ respectif, il faut envoyer:
ETAT=texteEtat
TEMP=23
HUM=55
C'est à dire, le nom du champ = valeur
Depuis l'ESP

	Serial.println("ETAT=" + etat);
	Serial.println("TEMP=" + String(temp));
	Serial.println("HUM=" + String(hum));

Ceci arrive dans:
image
la commande est séparée du paramètre dans:

et les commandes sont exécutées dans:
image

Tu peux essayer la procédure via ce petit interface de démo:
image
image

que tu peux supprimer, une fois testé.

L'usage de cette "mécanique" commande=paramètre permet d'augmenter les possibilités d'affichage de valeurs dans MAI, ceci peut aussi être utilisé dans l'autre sens, MAI > Arduino et ou ESP.

Le fichier MAI:
Pilotage_distant_B.zip (3.7 KB)

A+
Cordialement
jpbbricole

Merci.
Je pensais bien à une solution de ce genre mais je ne voyais pas comment faire (je débute en MAI)
J'ai bien compris la partie "exécution" mais pour la partie "tri" il faut que je regarde plus en détail pour tout comprendre.

Jean-Michel

Regardes ici le help du Text Blocks.

En gros, on sépare (split) la commande du paramètre que l'on met dans une liste ou tableau
image
dont l'élément index 1 est la commande et l'élément index 2 le paramètre de cette commande.

A+
Cordialement
jpbbricole

Bonsoir,
Merci pour tes réponses. Cela m'a appris beaucoup de choses.
Il doit rester un problème, probablement du au "client.println" car c'est OK sur le moniteur série mais pas dans l'app.
ON et OFF s'inscrivent comme avant et TEMP se met en 2ème ligne dans la case etat
Ci-dessous mon code, cette fois correctement inséré.

Jean-Michel

// Pilotage à distance

#include <WiFi.h>
#include "DHTesp.h"
 
const char* ssid = "reseau";
const char* password = "mdp1234";

// Setting Static IP.
        IPAddress local_IP(192, 168, 1, 150);
        IPAddress gateway(192, 168, 1, 1);
        IPAddress subnet(255, 255, 255, 0); 

WiFiServer server(80);

#define LED12  12
String etat = "";

DHTesp dht;
int dhtPin = 13;
String temp = "";
String hum = "";
unsigned long currentTime;
unsigned long previousTime;
unsigned long interval = 30000; //30s
int wait30 = 30000; // time to reconnect when connection is lost.

void setup() {
  dht.setup(dhtPin, DHTesp::DHT11);
  Serial.begin(115200);
  pinMode(LED12, OUTPUT);
// Setting Static IP.
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("Error in configuration.");
  }
// Connect WiFi net.
  Serial.println();
  Serial.print("Connecting with ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected with WiFi.");
 
  // Start Web Server.
  server.begin();
  Serial.println("Web Server started.");
 
  Serial.print("This is IP to connect to the WebServer: ");
  Serial.print("http://");
  Serial.println(WiFi.localIP());
}
 
void loop() {
 
//lecture capteur Temp et Hum si > interval
currentTime = millis();
if(currentTime-previousTime>=interval){
  previousTime=millis();
  flag:TempAndHumidity DHT = dht.getTempAndHumidity();
      if (dht.getStatus() != 0) {
      goto flag;
      }
      Serial.print("Temperature ");
      Serial.println(DHT.temperature);
      Serial.print("Humidity ");
      Serial.println(DHT.humidity); 
      temp = String(DHT.temperature);
      hum = String(DHT.humidity);
      Serial.println("TEMP=" + String(temp));
      Serial.println("HUM=" + String(hum));
}

// If disconnected, try to reconnect every 30 seconds.
  if ((WiFi.status() != WL_CONNECTED) && (millis() > wait30)) {
    Serial.println("Trying to reconnect WiFi...");
    WiFi.disconnect();
    WiFi.begin(ssid, password);
    wait30 = millis() + 30000;
  } 
  // Check if a client has connected..
  WiFiClient client = server.available();
  if (!client) {
    return;
  } 
  Serial.print("New client: ");
  Serial.println(client.remoteIP());
  /////////////////////////////////////////////////////
 // Lecture des commandes depuis l'APP
  String req = client.readStringUntil('\r');
  Serial.println(req);
       if (req.indexOf("on12") != -1) {digitalWrite(LED12, HIGH); etat = "ON";}
       if (req.indexOf("off12") != -1){digitalWrite(LED12, LOW); etat = "OFF";}
       if (req.indexOf("intero") != -1){}
//////////////////////////////////////////////
  // Páge WEB. ////////////////////////////
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("ETAT=" + etat);
  Serial.println("ETAT=" + etat);  
  client.println("TEMP=" + String(temp));
  client.println("HUM=" + String(hum));
  client.flush();
  client.stop();
  Serial.println("Client disconnected.");
}

Bonsoir loco28

Fais moi une copie d'écran du défaut.

Je n'ai, malheureusement, pas d'expérience dans ce genre de communications, je m'étais cantonné au Bluetooth :woozy_face:. Mais je vais étudier ça.

A+
Bonne soirée
jpbbricole

Ci-joint 2 photos et une copie d'écran:
Sur l'une des photos tu vois l'interface au début (il n'y a rien à droite de ETAT)
Sur l'autre, c'est après avoir appuyé sur ON (la led en arrière plan est allumée)
ON s'est normalement affiché à droite de ETAT et TEMP est venu en-dessous.
Ne fait pas attention au bouton "Appel T° et Hum", c'est pour avoir TEMP et HUM quand je n'appui pas sur ON ou OFF (problème de rafraichissement à étudier).
La copie d'écran donne Température et Humidité "sorties du capteur".
ETAT=ON, TEMP=21.40 et HUM=48.00 sont les strings que clientln envoi vers l'app.



Jean-Michel

Bonsoir loco28

Essaies de mettre un delay(200), par exemple, entre ces 3 client.printl, quitte à diminuer ces 200.
Demain, dans la journée, j'essayerai "en vrai".

Bonne soirée
jpbbricole

Bonsoir,

Pas de changement avec le delay de 200.

A tout hazard, je t'envoi la nouvelle version des mon .aia
J'ai peut-être oublié quelque chose ou fait une erreur

Pilotage_distant (2).zip (3.7 KB)

A+
Jean-Michel

Bonjour loco28

Je me suis un peu, fourvoyé avec cette méthode, ça ne marche pas en HTML. J'en ai une autre qui marche mieux mais il faut que je la test encore, c'est pour dans la soirée :wink:

A+
Cordialement
jpbbricole

Bonjour,

Pour info, j'ai remplacé la ligne "client.println("ETAT= "+etat)" par "client.println("TEMP= "+etat)".
ON et OFF se sont inscrit dans le label "temp" avec "TEMP" en dessous.
J'ai supprimé la ligne "client.println("TEMP = "+"temp)" et la c'est le "HUM" qui s'est inscrit sous ON ou OFF dans le label "temp"
Cela veut dire, à mon avis, que le traitement (tri) de la chaine en entrée fonctionne bien mais cela bloque sur la chaine suivante.

A+
Jean-Michel

Bonsoir loco28

J'ai "corrigé le tir" :wink:

Mon système ETAT=ON n'était pas bon dans le cas d'une page Web, j'ai opté pour la solution de chaîner les valeurs à transmettre, séparées par un | ainsi dans l'orde etat|temp|hum on aurait:
ON|23.54|75.08|
C'est décodé ici:
image

et exécuté ici:

La fin du programme Arduino:

	//////////////////////////////////////////////
	// Páge WEB. ////////////////////////////
	String webReponse = etat + "|" + temp + "|" + hum + "|";
	Serial.println(webReponse);

	client.println("HTTP/1.1 200 OK");
	client.println("Content-Type: text/html");
	client.println("");
	client.println(webReponse);

	client.flush();
	client.stop();
	Serial.println("Client disconnected.");

Le programme MAI:
Pilotage_distant_B.zip (3.3 KB)

PS: Je n'ai pas la même adresse IP que toi, il se peut que j'oublie de la changer alors attention :wink:

Bonne soirée
jpbbricole

Merci, je vais décrypter tout ça.

Effectivement, je dois corriger l’adresse IP que « j’impose » à l’esp, 192.168.1.150

C’est suite au besoin de me connecter depuis un autre réseau qui ne fonctionnait pas : l’assistance ORANGE indique qu’il faut prendre les IP dans la tranche 100-150 en prenant la première libre en partant du haut (150 pour moi). De même le port de redirection doit être pris au dessus de 49000. Je ne sais pas si tout est nécessaire car j’ai aussi lu un problème de « loopback » qui fait que si on veut tester l’adresse distante (xx.xxx.xx.xx :port) à côté de sa box, il faut se déconnecter de son réseau wifi ! Mais en final cela a fonctionné (page web sur l’esp, utilisation de WebDerver),

Bonne soirée

Jean-Michel

Bonjour,

Je viens de tester, c'est tout bon.
Ce système de "tri" permet même d'étendre à plus de commandes et de capteurs.
En changeant l'URL, j'ai pu faire le test "à distance".
Je vais rajouter une partie "saisie et enregistrement de l'URL".
Du côté de l'ESP, il me reste à trouver pour faire un rafraichissement pour que les données T et H puissent être transmises sans attendre une requête venant de l'APP.
Merci encore pour ton aide

Jean-Michel
.

Bonjour loco28

Avec plaisir!
Tu m'a fait découvrir MAI et le Wweb, je m'étais conté du Bluetooth :wink:

Une toute belle journée et bonne continuation.
jpbbricole