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?
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.
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.
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.
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.
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?
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
Tu peux essayer la procédure via ce petit interface de démo:
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.
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.
En gros, on sépare (split) la commande du paramètre que l'on met dans une liste ou tableau
dont l'élément index 1 est la commande et l'élément index 2 le paramètre de cette commande.
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.");
}
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.
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
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.
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:
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),
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