j ai un projet domotique en cours
je viens d' y ajouter une sonde DHT22
les valeurs son bien afficher temperature et hygrometrie
je voudrais ajouter des boutons
trois pour etre precis
un pour Marche (allume le relais chauffage jusqu'a la temperature de 20 c)
un pour Auto( allume le relais de chauffage en fonction de l heure et de la temperature si <20 c)
un pour Arret (allume le relais et maintien la temperature a 17 c)
pour le moment j ai essayer avec:
Ta page web s'affiche correctement j'imagine, mais tes boutons ne réagissent pas ? (enfin ton arduino serveur ne réagit pas aux commandes web ?)
As-tu regardé ce que ton arduino reçoit quand un client se connecte ?
pour les liens d'action je mettrai href ="12.34.56.78:port/?Auto"
avec 12.34.56.78 l'adress ip de ta carte (adresse externe) et port, le n° du port que tu lui as attribué
Bonjour si quand j utlisé juste les fonction marche et arret
cad sur marche relais LOW donc active
et sur Marche relais HIGH donc au repos
tous c'est corsé lorque j ai voulu mettre des contitions d'heure ou de consigne temperature
plus rien
j ai trouvé des exemples avec deux lib differentes pour le DHT22
DHT.h et dht.h et ne sais pas comment les telecharger
à priori je traiterai à part les ordres que tu envoies par internet et les actions sur le relai (en fonction de la consigne, de l'heure, de la température et du mode de chauffage)
par exemple j'utiliserai 2 variables : auto et une consigne. ensuite quand tu lis les ordres recu par le web tu fais :
si ordre web = arret : tu actualises la consigne à 17 °C (tu ne touches pas aux relais ici), auto = false
si ordre web = marche : tu actualises la consigne à 20 °C (tu ne touches pas aux relais ici), auto = false
si ordre web = auto : auto = true (consigne = 20 ? a toi de voir, pas touche aux relais ici)
dans ton loop (ou une fonction qui lit la température de ta pièce en continu, disons toutes les 30s) tu gères les relais en fonction du mode et de la consigne
si auto : actionne le relai en fonction de la temp, de la consigne et de l'heure (
sinon : actionne le relai en fonction de la consigne (si T < consigne, relaiOn sinon relaiOff)
Dans tes tests tu as par expemple if heure < 17 && heure < 23 ... Un des signes est manifestement dans le mauvais sens ... Il y a plusieurs cas comme ça
Ensuite admettons que tu commandes "marche" ... Ton truc se met en marche si t<20 ... Donc ça va chauffer et la température va augmenter ... Mais il s'arrête quand le chauffage et où dans ton programme ??? (La variable marche n'est actualisée que quand tu reçois un ordre web ... Sinon le programme n'entre pas dans le if et marche=temp<20 n'est pas testé)
Comme je te l'ai dit dans ma réponse d'avant ... Tu dois gérer une régulation ailleurs que là où tu interprètes les ordres web sinon ça ne marchera pas.
Tu confonds aussi le mode (marche arrêt auto) avec la régulation ... Sépare tes variables
J'utiliserai une variable mode qui prends 3 valeurs (0 pour arret, 1 pour marche, 2 pour auto). Tu actualises cette variable avec les readstring quand tu envoies une commande web. AILLEURS dans ton programme tu gères la régulation ...
Lire la température ...
Si mode =O (arret)
Si T < 15 allumer= true
Sinon allumer = false
Si mode =1 (marche)
Si T< 20 allumer = truc
Sinon allumer =false
Si mode = 2 (auto)
.... À toi de faire
Si allumer=true digitalWrite(relai,HIGH)
Sinon. DigitalWrite(relai,LOW)
Dans tes tests tu as par expemple if heure < 17 && heure < 23 ... Un des signes est manifestement dans le mauvais sens ... Il y a plusieurs cas comme ça
Ensuite admettons que tu commandes "marche" ... Ton truc se met en marche si t<20 ... Donc ça va chauffer et la température va augmenter ... Mais il s'arrête quand le chauffage et où dans ton programme ??? (La variable marche n'est actualisée que quand tu reçois un ordre web ... Sinon le programme n'entre pas dans le if et marche=temp<20 n'est pas testé)
oui effectivement c'est if heure > 17 && heure <23 j avais vue apres avoir posté
quand tu parle d'une variable mode je comprends pas ( t as un exemple?) et tu dis
avec les readstring quand tu envoies une commande web.
... À ton avis ? Indice : autant que ce que tu utilises déjà ... Sauf que tu actualiseras la variable mode a 0 1 ou 2
Je ne vais pas t'écrire le programme ... Je t'ai mis le principe de la régulation ... A mettre dans le loop et à effectuer toutes les 30 s ou plus suivant ton chauffage
je te demande pas de m' ecrire le programme
pour la regul j ai compris
ce que j 'ai du mal a comprendre c'est cette fameuse variable mode et pour le moment je n utilise qu'une fois readstring en fin de prog , je debute en prog et bien avant de poste je fais enormement de recherche sauf que je n "arrive pas toujours a trouver ce dont j ' ai besoin , si je sollicite c'est je suis bloqué
tous le monde ne maitrise pas forcement le C ou le html.
ok je te mets une partie du code à intégrer dans ton programme complet ...
avec les commentaires tu devrais comprendre ma logique ... car comme tu le faisais dans ton programme (a priori car je n'ai qu'un petit bout ...) tu allumais le relais seulement dans read_web ... or tu n'entres dans cette fonction que si tu envoies un ordre web
unsigned long next_regulation; // gere le chauffage ttes les 30s
byte mode; // mode du chauffage (à pour arret, 1 marche, 2 auto
void setup() {
// put your setup code here, to run once:
}
void read_web() {
// le debut semble ok ... à la fin modifie avec ceci
///////////////////// ce n'est pas ici qu'il faut gérer physiquement le chauffage /////////////
if(readString.indexOf("?Marche")>0) mode = 1; // mode 1 = Maintien a 20
else if (readString.indexOf("?Arret")> 0) mode = 0; // mode 0 = arret = maintien A 15°
else if (readString.indexOf("?Auto")> 0) mode = 2; // mode 2 = auto
readString="";
}}
void loop() {
// put your main code here, to run repeatedly:
boolean allumer; //true si il faut allumer le chauffage, false sinon
//regarde si il y a un client
read_web();
//lit un température
// je ne me souviens plus, mais tu l'as dans ton programme
//gestion du chauffage chauffage
//ici on allume ou éteint le chauffage en fonction du mode demandé
if (millis() > next_regulation) { //c'est l'heure de réguler
next_regulation += 30000; //prochaine régulation dans 30s (a toi de voir suivant ton chauffage)
//allumera ou pas le chauffage en fonction du mode, de la température et de l'heure
if (mode == 0) { //mode arret (on allume si t < 15, éteint si > 15.5 (hystérésis pour éviter les bascules trop fréquentes
if (DHT.temperature < 15) allumer = true;
else if (DHT.temperature > 15.5) allumer = false;
} else if (mode == 1) { //mode allumage forcé
if (DHT.temperature < 20) allumer = true;
else if (DHT.temperature > 20.5) allumer = false;
} else if (mode == 2) { //mode auto, en fonction de la température et de l'heure
// ici on chauffe à 19° entre 17h et 23h
// et à 15 en dehors de cette plage horaire
if (heure >= 17 && heure <= 23) {
if (DHT.temperature < 20) allumer = true;
else if (DHT.temperature > 20.5) allumer = false;
} else {
if (DHT.temperature < 15) allumer = true;
else if (DHT.temperature > 15.5) allumer = false;
}
}
//action sur le relai du chauffage
if (allumer) digitalWrite(OPTO,LOW); //logique inversée (allumage du chauffage)
else digitalWrite(OPTO,LOW); //exctintion du chauffage
} //fin de la régulation
//suite du programme
}
Ok Merci c'est beaucoup plus clair comme cela .
je vais modifier le programme
et modifier l affiche du mode de chauffage et son etat sur la page Web.
te confirmerais le fonctionnement.
if (millis() > next_regulation) { //c'est l'heure de réguler
next_regulation += 30000;
error: expected unqualified-id before 'if'
Erreur lors de la compilation.
if (mode == 0) { //mode arret (on allume si t < 15, éteint si > 15.5 (hystérésis pour éviter les bascules trop fréquentes
if (DHT.temperature < 15) allumer = true;
else if (DHT.temperature > 15.5) allumer = false;
} else if (mode == 1) { //mode allumage forcé
if (DHT.temperature < 20) allumer = true;
else if (DHT.temperature > 20.5) allumer = false;
} else if (mode == 2) { //mode auto, en fonction de la température et de l'heure
// ici on chauffe à 19° entre 17h et 23h
// et à 15 en dehors de cette plage horaire
if (heure >= 17 && heure <= 23) {
if (DHT.temperature < 20) allumer = true;
else if (DHT.temperature > 20.5) allumer = false;
} else {
if (DHT.temperature < 15) allumer = true;
else if (DHT.temperature > 15.5) allumer = false;
}
}
domo_12_12.ino:831:5: error: expected unqualified-id before 'if'
domo_12_12.ino:834:7: error: expected unqualified-id before 'else'
domo_12_12.ino:837:7: error: expected unqualified-id before 'else'
Erreur lors de la compilation.
//**************** declaration Regulation chauffage ***********
unsigned long next_regulation; // gere le chauffage ttes les 30s
byte mode; // mode du chauffage (à pour arret, 1 marche, 2 auto)
boolean allumer; //true si il faut allumer le chauffage, false sinon
ne peut pas metrre tout le programe il fait 1034 lignes
//Definition dee modes de chauffage //
if(readString.indexOf("?Marche")>0) mode = 1; // mode 1 = Maintien a 20
else if (readString.indexOf("?Arret")> 0) mode = 0; // mode 0 = arret = maintien A 15°
else if (readString.indexOf("?Auto")> 0) mode = 2; // mode 2 = auto
readString="";