Go Down

Topic: besoin d'aide pour un menu, (Read 2571 times) previous topic - next topic

lesept

Peux-tu ajouter au début de chaque fonction un Serial.println qui affiche le nom de la fonction ? Et commente les autres Serial.

L'idéal serait d'afficher aussi la valeur de millis. Tu fais par exemple, pour bouton ()
Code: [Select]
Serial.print ("Bouton") ;
Serial.printl ("\t") ;
Serial.println (millis ()) ;
\t c'est une tabulation...

Ensuite tu lances le programme et tu essayes le menu. Tu regardes ce qu'il affiche dans la console lorsque tu entres dans le menu et tu copies le contenu de la console dans un message.

J'ai besoin d'en savoir plus sur le déroulement du code et ce n'est pas facile en aveugle...
Merci
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

je c pas si c sa que tu veux mes j ai du appuyer 10/15 fois avent de voir le menu et que les print apparaisse

Code: [Select]


j ai lancer le menu

Bouton up 38217
afficherMenu = true
clear du lcd
Menu afficher

navigue dans le menu

Bouton left 249249
afficherMenu = true
clear du lcd
Menu afficher


retour vers accueil

Bouton home 312677
sonde 1 = 2093
sonde 2 = 2050


je relance le menu avec select

Bouton select 414571

C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

Code: [Select]
Bouton up 6264
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 14559
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 18715
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 33227
Bouton home 37383
Bouton select 41548
Bouton select 43633
Bouton home 62286
Bouton select 72698
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

Et que se passe-t-il entre chaque affichage de millis ? Tu tapes sur les boutons comme un malade ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#64
Apr 25, 2019, 09:33 pm Last Edit: Apr 25, 2019, 09:37 pm by Dams501
dans le premier oui

dans le deuxième beaucoup moin je dirait 1 fois toute les 5 a 10 seconde mais plusieurs pression avent l affichage de chaque
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Dams501

#65
Apr 25, 2019, 10:20 pm Last Edit: Apr 25, 2019, 10:21 pm by Dams501
j ai trouver cela vient du delay je les désactiver et sa marche c fluide

Code: [Select]
 ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0x44, 1);
  //delay(1000);  //  <-- une seule attente pour deux mesures !!!
  ds1.reset();
  ds1.select(addr1);
  ds1.write(0xBE);
  ds2.reset();
  ds2.select(addr2);
  ds2.write(0xBE);




Code: [Select]
Menu afficher
Bouton up 28527
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 29036
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 29543
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 30409
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 30851
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 31357
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 32007
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 32583
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 33233
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 33812
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 129495
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 130425
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 131076
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 131726
afficherMenu = true
clear du lcd
Menu afficher
Bouton up 132303
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 132880
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 133389
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 133829
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 134263
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 134773
Bouton select 135635
Bouton select 136854
Bouton home 138640
Bouton up 141029
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 141608
afficherMenu = true
clear du lcd
Menu afficher
Bouton left 141978
afficherMenu = true
clear du lcd
Menu afficher
Bouton select 142844
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

Et les mesures de température sont bonnes ?
Sinon, tu peux remplacer le delay par ce qu'on avait fait avant : lecture des boutons en attendant
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#67
Apr 25, 2019, 10:51 pm Last Edit: Apr 25, 2019, 10:52 pm by Dams501
sans le delay ouep tout est bon température et menu
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#69
Apr 25, 2019, 11:03 pm Last Edit: Apr 25, 2019, 11:34 pm by Dams501
en tout un grand merci j ai un code tout propre pour continuer mon projet et je suis remotiver a 300% j'aurai du venir ici depuis le début


passons a la suite

voila le ptit bout de code qui regul ma température et qui marche mais je doute bien qu il y a mieux et plus propre tu l écrirai comment toi  ?

Code: [Select]
void regulTemperatureADC() {

  temperatureControleMax = Tmax * 100;
  tc_100();
  //Serial.print("Regul : sonde test 1 = ");
  //Serial.println(temp1);
  //Serial.print("Regul : sonde test 2 = ");
  //Serial.println(temp2);
  //Serial.print("Regul : temperature max = ");
  //Serial.println(temperatureControleMax);

  if (temp2 > temperatureControleMax) {
    temperatureLimite = false;
    if (!temperatureLimite) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
  }
    //Serial.println("ventil on");
  } else {
    temperatureLimite = true;
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    //Serial.println("ventil off");
  }
}



edit : j ai modifier le code je t pas mis le bon
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

Je pense que tu n'as pas besoin d'appeler la fonction tc_100 ici. La température varie certainement bien plus lentement que le déroulement du programme.

Si tu mets un Serial.println (millis ()) ; au début de la loop, tu verras qu'elle tourne plusieurs fois par seconde, ou en tout cas bien plus vite que le changement de température. Donc, cette fonction est appelée assez souvent comme ça, tu peux utiliser les valeurs de températures contenues dans les variables globales temp1 et temp2 pour ta régulation sans avoir besoin de les mesurer ici.

Le seul moment où les températures ne sont pas mises à jour c'est lorsque tu es dans les menus, mais là tu n'as pas besoin de faire la régulation.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

Code: [Select]
void regulTemperatureADC() {

  temperatureControleMax = Tmax * 100;
  if (temp2 > temperatureControleMax) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
    //Serial.println("ventil on");
  } else {
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    //Serial.println("ventil off");
  }
}

Voire même, pourquoi pas ?

Code: [Select]
void regulTemperatureADC() {
  temperatureControleMax = Tmax * 100;
  digitalWrite(ventilo1, (temp2 > temperatureControleMax));
  digitalWrite(ventilo2, (temp2 > temperatureControleMax));
  Serial.println ("ventilation" + (temp2 > temperatureControleMax)? "on" :"off") ;
}

À tester...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

#72
Apr 26, 2019, 12:02 am Last Edit: Apr 26, 2019, 12:23 am by Dams501
d accord je v le retirer par quand je suis dans le menu mais température continu a être mis a jour car mes ventilo s enclenche si je met ma main sur la sonde

j ai opter pour

Code: [Select]
void regulTemperatureADC() {
 temperatureControleMax = Tmax * 100;
 digitalWrite(ventilo1, (temp2 > temperatureControleMax));
 digitalWrite(ventilo2, (temp2 > temperatureControleMax));
 Serial.println ("ventilation" + (temp2 > temperatureControleMax)? "on" :"off") ;
}


simple et efficace sa marche parfaitement


sinon la je voudrait que met température de régulation reste en mémoire en cas de coupure de courant ou autre es-que cela suffirait ?

je voudrait aussi pouvoir afficher l heure et allumer ou éteindre l éclairage a des heur précise

https://www.amazon.fr/iHaospace-DS3231-AT24C32-Precision-Arduino/dp/B07CG7YTPN/ref=sr_1_6?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=RTC+DS1307&qid=1556177160&refinements=p_76%3A437878031&rnid=437877031&rps=1&s=gateway&sr=8-6

si oui ta un modèle précis a me conseiller

et sinon comment je pourrait faire ?
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

lesept

Salut !
Après réflexion, je me suis dit que cette version simple risque de poser problème autour de la transition : si tu passes la limite temperatureControleMax (disons qu'elle vaut 30.0°C), la précision du capteur risque de donner des valeurs qui oscillent autour de ces 30.0 (genre 29.95 puis 30.05) et ça va lancer et arrêter la ventil plus que nécessaire.

Il faut ajouter de l'hystérésis :

Code: [Select]
void regulTemperatureADC() {
  temperatureControleMax = Tmax * 100;
  int hysteresis = 25; // marge de +/- 0.25 degrés
  if (temp2 > temperatureControleMax + hysteresis) {
    digitalWrite(ventilo1, HIGH);
    digitalWrite(ventilo2, HIGH);
    Serial.println("ventilation on");
  } else if (temp2 < temperatureControleMax - hysteresis) {
    digitalWrite(ventilo1, LOW);
    digitalWrite(ventilo2, LOW);
    Serial.println("ventilation off");
  }
}

serait plus pertinent (mais moins joli :) ). Tu peux ensuite jouer sur la marge. Ici la ventilation se déclenche au-dessus de 30.25°C et s'arrête en dessous de 29.75°C.

La température de régulation (Tmax) est réglée par les menus ? Pour la conserver il faut la mettre en EEPROM. S'il y a coupure de courant, il faut pouvoir la lire au démarrage.

Je n'ai jamais joué avec ça, ça va être une première, tu seras le testeur...

  • Dans l'entête :
Ajoute #include <EEPROM.h> au début du code
Définis une constante magique qui servira à savoir si on écrit pour la première fois ou non dans l'EEPROM
Code: [Select]
cont unsigned long MAGIC = 123456789;

  • Dans le setup :
On lit le début de l'EEPROM pour voir si la constante MAGIC s'y trouve : si oui, c'est qu'on a déjà écrit dans l'EEPROM donc on peut lire la valeur de Tmax qui y est déjà sauvegardée. Si non, on écrit MAGIC et Tmax pour plus tard.
Code: [Select]
unsigned long magic;
EEPROM.get(0,magic);
if (magic == MAGIC) {
  EEPROM.get(4,Tmax);
} else {
  EEPROM.put(0,MAGIC);
  EEPROM.put(4,Tmax);
}


  • Dans la loop :
Chaque fois que Tmax est changé, on réécrit sa valeur dans l'EEPROM :
Code: [Select]
EEPROM.update(4,Tmax);Je te laisse chercher où mettre cette ligne.

Pour l'heure, en effet il te faut une RTC, et le modèle DS3231 est parfait. Une autre solution serait d'aller chercher l'heure sur internet mais il te faut un Wifi et un processeur qui est capable de discuter en Wifi (arduino + shield ou ESP8266 ou ESP32).
La DS3231 se trouve en Chine (Aliexpress) pour moins cher que ça, mais il faut compter un mois d'attente pour la livraison. C'est toi qui vois...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Dams501

je v opté pour le DS3231 alors. je avancer sur met différente regul en attendent de le recevoir

sinon impeccable    int hysteresis 

et pour EEPROM impeccable toute mais variable sont sauvegarder

je v commencer a voir pour l'heur car j ai aucune idée de comment sa marche si ta des conseil ou des bon tuto je suit preneur
C'est a force d'enfiler les poules que l'on finit par casser des œufs !

Go Up