erreur code arduino.

bonjour, je voudrai votre aide. Je suis sur un projet arduino avec nextion. j'ai compilé plusieurs fichiers de projets différents et pris ce qui m'intéressais dans le mien. Cependant j'ai 2 problème.
Avant que j'intègre mon module rtc dans mon code lorsque j'appuyai sur un bouton de mon ecran nextion mon arduino le capté toute de suite et ouvré ou fermé des relais. Maintenant plus rien.

et deuxièmement, le code que j'ai utilisé est un exemple de projet avec module rtcds3231 et un ecran nextion. cependant dans le code il affiche, heure, minute, seconde, jour, jours de la semaine et année. Moi je veux uniquement heure et minute mais apparament ma modification de code a un probleme.

si une âme charitable veux bien m'éclairer, je le remercie par avance.

mon nextion et branché sur les pin tx3 et rx3 et mon module sur sda et scl.

je vous met le code arduino de mon projet.

Je met le fichier ino car le site me dit qu’il depasse 9000 caractères.

a_l_aide.inobis.ino (17 KB)

Personne pour m'aider?

ne soyez pas si pressé... donnez vous 1 ou 2 jours avant de relancer... entre temps décrivez vos branchements, alimentation, ce que vous avez testé pour débugger etc...

ce truc là est sensé faire quoi (et ça n'attend pas 100ms mais 1s entière et vous n'êtes même pas sûr d'avoir tout reçu - faut pas utiliser la classe String, ça amène toujours des soucis)

  STRrecu = Serial3.readString();      //  recevoir une chaine de characters (le programme attend 100ms que la chaine ce finisse à partir de la reception du 1er character)

Avant que j'intègre mon module rtc dans mon code lorsque j'appuyai sur un bouton de mon ecran nextion mon arduino le capté toute de suite et ouvré ou fermé des relais. Maintenant plus rien.

Sincèrement dans ton code je vois bien 12 callbacks associées à des boutons permettant de modifier l'heure et la date du DS3231, mais aucune callback permettant de piloter une sortie.
Par contre je vois bien une lecture du port série Serial3 et une interprétation des mots reçus lumiereon, lumiereoff, etc. avec les actions correspondantes.

???

il affiche, heure, minute, seconde, jour, jours de la semaine et année. Moi je veux uniquement heure et minute

Ne suffit-il pas de supprimer les lignes 382 à 432 ?

@+

bonjour messieurs et désolé pour mon impatience :slight_smile: . je vous met une photo de mon projet ca sera plus simple pour comprendre. j’ai crée mon interface graphique de mon nextion. en haut de l’ecran il y a les icones qui commande un relais. En haut a droite la température et humidité de la maison prise avec un dht11. Je dois encore comprendre comment connecter ma sonde ph et ma sonde température de l’eau DS18B20.

l’exemple que j’ai trouver pour l’heure prend en compte tout les informations, heures, minutes, seconde, jour de semaine…. moi dans mon exemple je n’ai besoin que de l’heure et minute. Mais je ne sais pas comment faire maigrir mon code sans créer d’erreur. il y a en effect 12 bouton dans l’exemple du rtc, moi je n’utilise que b1,b2,b4,b5…t0,t1. ce sont les unique chose que j’utilise.

il ne faut pas tenir compte des commentaire car je l’ai tellement modifié qu’il n’y a plus rien de bon. Je vais déjà commencer par ça. ensuite vous me dites que d’utiliser string pour communiquer avec mon nextion mais j’ai trouver que ca comme exemple.

alors parlons maintenant des branchements. l’arduino est connecté sur un port usb et mon nextion sur un autre port usb. mon dht11 et sur le pin 2 et mon module rtc sur sda 20 et scl 21. Mon nextion et quand a lui sur TX3 14 et RX315.

Je vais deja faire maigrir mon code avec les boutons, remettre les commentaires.

J’ai lu sur ce forum quil parlait de la resolution des sondes temperature dht11 ou bien la DS18B20 de passer tout ce petit monde en 9 bit.

Salut Bricodoudou,

tu les prends où ces librairies?
Si je comprend bien, tu veux régler l'heure avec ces boutons?

votre photo

b3f99601ea02b0774806819513ad445a52729722.jpg

désolé je ne peux pas trop vous aider sur nextion car bien que j’ai lu la doc je n’en ai pas car ils ne font leur outil que sur Windows et je suis Linux ou Mac

Ensuite pourquoi lire l'heure à chaque callback?

Tu la lis une fois dans le void loop() en affectant les valeurs à des variables globale.

/*Les includes*/

/*
 * Declare a button object [page id:1,component id:11, component name: "b1"]. 
 */
...

// Les variables globales
byte heures;
byte minutes;
byte secondes;
byte jours;
byte mois;
byte annees;

void setup(){
...
}

void loop(){
    readDS3231time(&secondes, &minutes, &heures, &dayOfWeek, &dayOfMonth, &mois, &annees);
}

void b1PopCallback(void *ptr)
{  
    if (heures == 23){heures=-1;}
    setDS3231time(secondes, minutes, heures+1, dayOfWeek, dayOfMonth, mois, annees);
}

bonjour, oui les boutons servent a régler l’heure. les bibliothèques je l’est ai prise des exemples que j’ai trouvé.

bon finalement j’ai modifié mon interface et j’utilise du coup tout les bouton, mais mon probleme de réactivité lorsque j’appuie sur mon nextion lui il est toujours la.

par contre maintenant j’ai mis la lecture de la sonde temperature maison et humidité sur la fonction millis toutes les 60 secondes. c’est déjà bien, enfin de pense :confused: .

Excuse moi weetoz mais je ne comprend pas ce que je dois modifier dans mon programme. Peux tu regarder le nouveau et modifier le fichier comme ca je comparerai avec le mien et regarderai les changement.

je remet une photo de la page d’acceuil, modification heure et fichier arduino néttoyé.

nouveau_depart.ino (15 KB)

hbachetti je comprend mais je ne vois pas ce qu'il faudrait faire.

Je pars simplement de cette phrase :

Avant que j’intègre mon module rtc dans mon code lorsque j’appuyai sur un bouton de mon ecran nextion mon arduino le capté toute de suite et ouvré ou fermé des relais. Maintenant plus rien.

Dans ton code je ne vois rien qui permette d’actionner un quelconque relais à l’aide d’un bouton sur l’écran.
Par contre je vois toute une série d’actions déclenchées par l’interprétation de commandes reçues sur Serial3.

et deuxièmement, le code que j’ai utilisé est un exemple de projet avec module rtcds3231 et un ecran nextion. cependant dans le code il affiche, heure, minute, seconde, jour, jours de la semaine et année. Moi je veux uniquement heure et minute mais apparament ma modification de code a un probleme.

Si tu veux simplement afficher heure et minutes, supprime les lignes 375 à 394.
Tu peux supprimer également le NexText t2 et sa référence dans la liste nex_listen_list.

Si tu ne veux pas afficher la date, supprime les lignes 396 à 425.
Tu peux supprimer également le NexText t4 et sa référence dans la liste nex_listen_list.

@+

L'idée de lire tes mesures de façon cyclique toutes les secondes est très bonne, il faut en tirer encore parti.

Vu que les secondes ne n'intéresse pas tu peux appeler ta fonction readDS3231... toute les minutes.

Il faut comprendre le principe de scrutation, la fonction Loop tourne en boucle et va exécuter consécutivement les instructions les unes à la suite des autres.
Ce n'est pas multitâches, par conséquent quand le MCU lit l'heure du DS3231, il ne peut traiter les actions liées à la réception des ports séries.

J'ai un projet similaire en cours, voici comment je me suis organisé.
Je défini l’intervalle pour chaque tâches, puis je créés des fonctions appelé conditionnellement. Mon void loop:

void loop()
{
  prg_Cycle();   //Ma fonction de gestion d'appel de fonction
  nexPoll();       //scrutation des com du Nextion
}
//C'est tout !

Maintenant ma fonction prg_Cycle:

void prg_Cycle(){

  static unsigned long preMillis1s = 0;
  unsigned long currentMillis = millis();

  /* Réalise un log  toutes les secondes */
  if (currentMillis - preMillis1s >= DELAY_BETWEEN_ONE_SEC ) {
  preMillis1s = currentMillis;
  oneSec_Cycle();

     static unsigned long preMillis10s = 0;
     if (currentMillis - preMillis10s >= DELAY_BETWEEN_TEN_SEC ) {/* Réalise un log  toutes les 10 secondes */
 preMillis10s = currentMillis;
 tenSec_Cycle();

 static unsigned long preMillis1m = 0;
 if (currentMillis - preMillis1m >= DELAY_BETWEEN_ONE_MIN ) {/* Réalise un log  toutes les minutes */
 preMillis1m = currentMillis;
 oneMin_Cycle();
 }
 static unsigned long preMillis15m = 0;
 if (currentMillis - preMillis15m >= DELAY_BETWEEN_QUINZE_MIN ) {/* Réalise un log  toutes les 15 minutes */
 preMillis15m = currentMillis;
 quinzeMin_Cycle();
 }
 static unsigned long preMillis1hr = 0;
 if (currentMillis - preMillis1hr >= DELAY_BETWEEN_ONE_HOUR ) {/* Réalise un log  toutes les heures */
  preMillis1hr = currentMillis;
  oneHr_Cycle();
 }
  }
  }

}

Le principe est simple, à chaque fois qu'une condition est vrai, la fonction associé est exécuté.
Afin d'optimiser le fonctionnement, les if sont imbriqués, ce qui évite de tester des conditions inutilement.
Et voici les fonctions:

void oneSec_Cycle(){
 

                sendToNextion(&tout, &le,&bordel);
}
void tenSec_Cycle(){
 Serial.println("10_SecCycleOK");
 getDht(&DhtVal, &VTAir, &VHAir);
 Serial.print(F("Temperature actuel: ")); Serial.print(DhtVal.temp); Serial.println(F(" °C"));
 Serial.print(F("Temperature max: ")); Serial.print(VTAir.max); Serial.println(F(" °C"));
 Serial.print(F("Temperature min: ")); Serial.print(VTAir.min); Serial.println(F(" °C"));
 Serial.print(F("Humidité actuel: ")); Serial.print(DhtVal.hum); Serial.println(F(" %H"));
 Serial.print(F("Humidité max: ")); Serial.print(VHAir.max); Serial.println(F(" %H"));
 Serial.print(F("Humidité min: ")); Serial.print(VHAir.min); Serial.println(F(" %H"));
}

void oneMin_Cycle(){
 getTimeActual(&HoroDate);    //On récupère la date et l'heure, puis on l'affiche
  
          Serial.print(F("Date : "));
  Serial.print(HoroDate.days);
  Serial.print(F("/"));
  Serial.print(HoroDate.months);
  Serial.print(F("/"));
  Serial.print(HoroDate.year + 2000);
  Serial.print(F("  Heure : "));
  Serial.print(HoroDate.hours);
  Serial.print(F(":"));
  Serial.print(HoroDate.minutes);
  Serial.print(F(":"));
  Serial.println(HoroDate.seconds);
}
void quinzeMin_Cycle(){

 sendToSD(&Ceci, &cela);

}
void oneHr_Cycle(){
 On verra...
}

Avec ça, je n'ai pas de problème de réactivité de l'ensemble.

hbachetti : merci beaucoup mais du coup je garde les autres information sauf les secondes. du coup j'ai effacé les lignes contenant les secondes.

weetoz: tu pourrais pas me mettre en lien ton fichier ino de ton projet, pour voir comment tu as déclare les variable……
Est ce que tu utilise la librairie string pour communiquer avec ton arduino?

Ça y est messieurs!!!!! J'ai trouvé mon erreur. Le problème venait de moi et mon logiciel nextion editor.
L'arduino recevait bien par exemple "co2on" mais pas que puisse que j'avais également cocher une option qui envoi également le nom du bouton. Donc l'arduino recevait "bt CO2/co2on" au lieu de "co2on" donc normal qui ne savais pas quoi faire.

Mais je vais quand même voir pour mettre la résolution de l'heure pour être lu toutes les 1 minutes.

On peut aussi changé les bits des sondes, passer de 12 a 9 pour gagner encore plus de temps mais ça je sais pas comment faire.

En tout cas merci beaucoup.

OK. Je comprends mieux. Serial3 est utilisé par le NEXTION pour ses envois d'événements d'appuis sur les boutons.
Je pensais qu'il s'agissait d'une console.

On progresse tous les jours, mais je n'aurai sans doute pas l'occasion de tester cet écran. Windows ... beurk.

J-M-L:
désolé je ne peux pas trop vous aider sur nextion car bien que j'ai lu la doc je n'en ai pas car ils ne font leur outil que sur Windows et je suis Linux ou Mac

Je suis dans le même cas, mais encore plus radical, sans Mac.

Bonne continuation.

hbachetti:
Je suis dans le même cas, mais encore plus radical, sans Mac.

Pour coder ou les partie serveur c'est cool mais la productivité sous linux est trop mauvaise pour les besoins du quotidien et il me suffit d'ouvrir le Terminal sous le mac pour me retrouver dans un vrai Unix :slight_smile: et j'ai une partition Linux. (de toutes façons il faut un ordi, alors autant qu'il soit bien pensé :slight_smile: et si ce monde s'effondrait je pourrais toujours mettre windows dessus :disappointed_relieved: :fearful: )

la productivité sous linux est trop mauvaise pour les besoins du quotidien

Pas d'accord du tout, surtout pour un développeur embarqué comme je le suis. Mais c'est un sujet à polémique, donc sans intérêt.
Pas de trolls SVP.

@+

hbachetti:
Mais c'est un sujet à polémique, donc sans intérêt.

Oui - chacun ses choix.

weetoz: tu pourrais pas me mettre en lien ton fichier ino de ton projet, pour voir comment tu as déclare les variable……
Est ce que tu utilise la librairie string pour communiquer avec ton arduino?

Mon code n'est pas dans un seul fichier .ino, (d'ailleurs il y a pas de fichier.ino, mais un main.cpp).
Ensuite mes variables sont dans des structures.
J'utilise le type string du Framework Arduino, tout comme toi. (pour les essais seulement, après je préfère les "const char*"
ou les les tableaux de char).

En tout cas, je suis content que tu ai trouvé tout seul ton problème de com.

Pour la suite des choses, je te recommande les tutos d'Eskimon qui sont plus qu'excellent.

Tu dois apprendre (si ce n'est pas déjà fait) à utiliser les boucles et les fonctions afin de bien structurer ton programme. Ensuite, et c'est très important, à comprendre comment on utilise les chaînes de caractères. par exemple, le Nextion envoie à chaque fin de communication 0XFF 0XFF 0XFF. Tout comme il faut lui renvoyer cette même chaîne lorsque l'on lui envoie une commande, dans ton code une fonction fait ça:

void endNextionCommand()
{
  Serial3.write(0xff);
  Serial3.write(0xff);
  Serial3.write(0xff);
}

Je pense faire une vidéo qui expliquera comment je m'organise pour mon projet, je te mettrais le lien ici quand ce sera fait. Avant j'ai encore du boulot. Je suppose que ce sera pour le week end prochain.

Pour info, je n'utilise pas l'ide Arduino pour ce projet mais platformio.

@+
[Edit] Quand je parle de platformIO, je veux parler du couple platformio + Eclipse [/Edit]