Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2798 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  183  184  185  ..  264  265  266  267  268  269
Auteur Sujet :

[arduino] Topic Unique blabla @ Arduino

n°264487
crepator4
Deus ex machina
Posté le 10-07-2019 à 21:31:05  profilanswer
 

Reprise du message précédent :
Tiens j'ai acheté recemment le meme "convertisseur" :D (5 jours a venir sur ebayfr)

 

(Et je l'ai pas encore essayé , message parfaitement utile donc :o )

Message cité 1 fois
Message édité par crepator4 le 10-07-2019 à 21:34:08

---------------
...survivre à ses Medecins...
mood
Publicité
Posté le 10-07-2019 à 21:31:05  profilanswer
 

n°264498
Turkleton
I don't quite understand you
Posté le 10-07-2019 à 22:59:34  profilanswer
 

rat de combat a écrit :

Tu as fait attention aux indications "high side" (5V) / "low side" (3.3V)? Tu as bien branché les deux tensions sur le module?

Yep, tout est bien branché en respectant les high/low.
 
J'ai testé au multimètre, j'ai tout le temps 3.3V en sortie du module côté low, alors que c'est censé blinker. J'ai pas pensé à vérifier si ça blinke bien côté UNO, mais ça n'a pas de raison de pas le faire.
 
 

crepator4 a écrit :

Tiens j'ai acheté recemment le meme "convertisseur" :D (5 jours a venir sur ebayfr)
 
(Et je l'ai pas encore essayé , message parfaitement utile donc :o )

:D

Message cité 2 fois
Message édité par Turkleton le 10-07-2019 à 23:00:03

---------------
If you think it could look good, then I guess it should
n°264512
crepator4
Deus ex machina
Posté le 10-07-2019 à 23:23:56  profilanswer
 

y'a des exemples avec des sérigraphies se rapprochant par contre :o  
https://learn.sparkfun.com/tutorial [...] -guide/all


---------------
...survivre à ses Medecins...
n°264586
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 12:42:55  profilanswer
 

Turkleton a écrit :

J'ai pas pensé à vérifier si ça blinke bien côté UNO, mais ça n'a pas de raison de pas le faire.

Tu devrais quand même vérifier. Ensuite tu peux utiliser un autre convertisseur (il y en a 4 sur chaque module) pour voir si ça serait pas le module chinois qui est cassé.
edit: Si tu forces le pin à la masse (avec un fil) tu as bien 0V de l'autre côté? (Débrancher l'Arduino avant ou mettre la broche sur entrée!) Tu es sûr que ta broche Arduino est en mode sortie?


Message édité par rat de combat le 11-07-2019 à 12:44:20
n°264588
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 13:11:57  profilanswer
 

MilesTEG1 a écrit :

j'ai mis aussi un argument pour la couleur du texte.  
Je souhaiterais mettre un autre argument mais facultatif... (pour la couleur de fond, par défaut transparente).
 
edit : autre question concernant les fonctions.
Cette fonctionne actuellement avec une chaine de caractère en paramètre.
Comment faire pour l'utiliser aussi pour un nombre entier ? Ou un Float ?
Pour écrire un entier il faut utiliser myGLCD.printNumI ()
et pour écrire un float, il faut myGLCD.printNumF ()

C'est du C++, je ne maîtrise pas, désolé. Il faut regarder un bon cours en ligne.

n°264590
Natopsi
☄️Just end it already!☄️
Posté le 11-07-2019 à 13:24:47  profilanswer
 

En C++: void toto(int obligatoire, int facultatif = -1) {}
 
Et pour le polymorphisme, tu passe un void * que tu caste plus loin dans le bon type:
 
 

Code :
  1. void print(void * value, int type = 0)
  2. {
  3. if(type==0)
  4. {
  5.     myGLCD.printNumI(*static_cast<int*>(value))
  6. }else if(type==1)
  7. {
  8. myGLCD.printNumF(*static_cast<float*>(value))
  9. }
  10. }
  11. int i = 0;
  12. float f = 3.14;
  13. print(&i,0)
  14. print(&f,1)

Message cité 3 fois
Message édité par Natopsi le 11-07-2019 à 13:25:06

---------------
ACH/VDSHFRCoin◈1435mm⚡
n°264595
Turkleton
I don't quite understand you
Posté le 11-07-2019 à 13:49:15  profilanswer
 

Turkleton a écrit :

J'ai pas pensé à vérifier si ça blinke bien côté UNO, mais ça n'a pas de raison de pas le faire.


Bon ben c'est moi qui suis plus trop habitué à programmer des Arduino…
 
Ce bout de code fonctionne très bien sur NodeMCU mais pas sur UNO :

Code :
  1. digitalWrite(sortieComm, !digitalRead(sortieComm));


---------------
If you think it could look good, then I guess it should
n°264597
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 14:05:05  profilanswer
 

Je ne vois pas d'erreur dans ce code. Tu as pensé à mettre la broche en sortie? C'est quelle broche?

Message cité 1 fois
Message édité par rat de combat le 11-07-2019 à 14:06:28
n°264598
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 14:07:38  profilanswer
 

Natopsi a écrit :

En C++: void toto(int obligatoire, int facultatif = -1) {}
 
Et pour le polymorphisme, tu passe un void * que tu caste plus loin dans le bon type:

Il n'y a pas moyen de faire choisir au compilateur la bonne version directement? :??:

n°264602
Natopsi
☄️Just end it already!☄️
Posté le 11-07-2019 à 14:36:33  profilanswer
 

En utilisant les template et des alias pour les fonctions avec le même nom mais des types différents oui ça peut passer, mais ça deviens un poil chaud.


---------------
ACH/VDSHFRCoin◈1435mm⚡
mood
Publicité
Posté le 11-07-2019 à 14:36:33  profilanswer
 

n°264636
Turkleton
I don't quite understand you
Posté le 11-07-2019 à 18:03:06  profilanswer
 

rat de combat a écrit :

Je ne vois pas d'erreur dans ce code. Tu as pensé à mettre la broche en sortie? C'est quelle broche?


Mouais, c'est bizarre, par acquis de conscience j'ai changé la pin de sortie (passé de la 7 à la 5), et là ça fonctionne… J'ai pourtant rien de déclaré d'autre que la LED_BUILTIN, qui est normalement la 13.
 
Je vais pas investiguer plus, c'est bon maintenant :D


---------------
If you think it could look good, then I guess it should
n°264639
MilesTEG1
Posté le 11-07-2019 à 18:37:54  profilanswer
 

Natopsi a écrit :

En C++: void toto(int obligatoire, int facultatif = -1) {}
 
Et pour le polymorphisme, tu passe un void * que tu caste plus loin dans le bon type:
 
 

Code :
  1. void print(void * value, int type = 0)
  2. {
  3. if(type==0)
  4. {
  5.     myGLCD.printNumI(*static_cast<int*>(value))
  6. }else if(type==1)
  7. {
  8. myGLCD.printNumF(*static_cast<float*>(value))
  9. }
  10. }
  11. int i = 0;
  12. float f = 3.14;
  13. print(&i,0)
  14. print(&f,1)



Oh super merci  :jap:  
Je vais essayer ça  :)  
Le code que tu m’as donné utilise des pointeurs n’est-ce pas ?
Ça ne fonctionnerait pas sans ça ?
(Je ne maîtrise pas du tout les pointeurs mais alors pas du tout...)
Je n’ai jamais réussi à trouver un cours en ligne simple pour comprendre l’utilité et l’usage...


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264644
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 19:07:50  profilanswer
 

MilesTEG1 a écrit :

(Je ne maîtrise pas du tout les pointeurs mais alors pas du tout...)

Alors c'est le moment de s'y mettre. Les pointeurs sont une partie importante du language C. Je suis sûr qu'on peut trouver un bon cours en ligne ou alors un bon livre.

n°264645
jimbofarra​r
Poreux de la cafetière
Posté le 11-07-2019 à 19:12:19  profilanswer
 

MilesTEG1 a écrit :


Oh super merci  :jap:  
Je vais essayer ça  :)  
Le code que tu m’as donné utilise des pointeurs n’est-ce pas ?
Ça ne fonctionnerait pas sans ça ?
(Je ne maîtrise pas du tout les pointeurs mais alors pas du tout...)
Je n’ai jamais réussi à trouver un cours en ligne simple pour comprendre l’utilité et l’usage...


https://openclassrooms.com/fr/cours [...] -pointeurs


---------------
Bien des Shubs et des Zouls furent calcinés dans les profondeurs de l'énorme Sloar, en vérité, je vous le dis !
n°264647
rat de com​bat
attention rongeur méchant!
Posté le 11-07-2019 à 19:32:16  profilanswer
 

Très bien le lien :jap: , bonne explication et en français.

n°264651
MilesTEG1
Posté le 11-07-2019 à 19:52:59  profilanswer
 


Thanks  :jap:  
J’ai du zapper cette partie car j’ai apparemment lu et valider des chapitres avant et après  :whistle:  
 
Merci je vais lire ça attentivement  :jap:


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264665
MilesTEG1
Posté le 11-07-2019 à 21:52:09  profilanswer
 

Tuto/Cours en court de lecture.
Par contre pourquoi il ne faut pas utiliser des variables globales ?

Citation :

De plus, vous ne pouvez pas utiliser de variables globales car, comme on l'a vu, cette pratique est fortement déconseillée.


 
 
J’en utilise beaucoup pour mon programme...


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264666
jimbofarra​r
Poreux de la cafetière
Posté le 11-07-2019 à 22:04:10  profilanswer
 

MilesTEG1 a écrit :

Tuto/Cours en court de lecture.
Par contre pourquoi il ne faut pas utiliser des variables globales ?

Citation :

De plus, vous ne pouvez pas utiliser de variables globales car, comme on l'a vu, cette pratique est fortement déconseillée.


 
 
J’en utilise beaucoup pour mon programme...


Tu as des explications ici : https://algocool.fr/variables-globales/


---------------
Bien des Shubs et des Zouls furent calcinés dans les profondeurs de l'énorme Sloar, en vérité, je vous le dis !
n°264668
MilesTEG1
Posté le 11-07-2019 à 22:33:11  profilanswer
 


Hi ! Très instructif  :jap:  
Merci
Me faudrait grouper mes variables dans des structures alors... purée ça va être long de revoir tout ça... mais intéressant.
Merci  :jap:


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264669
Turkleton
I don't quite understand you
Posté le 11-07-2019 à 22:36:49  profilanswer
 

Franchement, prends le pli d'utiliser les structures, tu verras combien ça aide.


---------------
If you think it could look good, then I guess it should
n°264673
docmaboul
Posté le 12-07-2019 à 05:25:15  profilanswer
 
n°264698
rat de com​bat
attention rongeur méchant!
Posté le 12-07-2019 à 11:50:35  profilanswer
 

MilesTEG1 a écrit :

Me faudrait grouper mes variables dans des structures alors...

Non. La solution c'est d'utiliser des variables locales comme tout le monde. Les variables globales sont là pour les rares cas où c'est indispensable (->interruptions) ou vraiment utile (genre une info à laquelle toutes les fonctions d'un module doivent avoir accès). Après on peut regrouper les variables globales dans une structure, mais le plus important c'est de minimiser leur nombre.

n°264727
MilesTEG1
Posté le 12-07-2019 à 14:22:49  profilanswer
 

rat de combat a écrit :

Non. La solution c'est d'utiliser des variables locales comme tout le monde. Les variables globales sont là pour les rares cas où c'est indispensable (->interruptions) ou vraiment utile (genre une info à laquelle toutes les fonctions d'un module doivent avoir accès). Après on peut regrouper les variables globales dans une structure, mais le plus important c'est de minimiser leur nombre.


Disons que si je fais des variables locales, toutes les fonctions qui sont appelées par d'autres fonctions pour récupérer les données, et les traiter ne vont plus fonctionner car elles utilises certaines variables globales et les modifient en vue de les afficher...
 
Placer ces variables dans une structure devrait simplifier certaines choses... mais faut que ça reste publique.
Bon va déjà  falloir que je modifie mon code pour ça...


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264729
rat de com​bat
attention rongeur méchant!
Posté le 12-07-2019 à 14:37:57  profilanswer
 

Tu sais que tu peux passer des infos à des fonctions en tant que paramètres? Normalement c'est comme ça qu'on fait. :o
Après libre à toi de mettre des variables globales partout, mais ce n'est pas propre et ne participe pas à rendre le code plus lisible.

 

Prenons un exemple, qu'est-ce qui est mieux?

Code :
  1. int argument1, argument2, resultat;
  2. int affichage;
  3. void calcul(void)
  4. {
  5.     resultat=argument1+argument2;
  6. }
  7. int main(void)
  8. {
  9.     argument1=41;
  10.     argument2=43;
  11.     calcul();
  12.     affichage=resultat;
  13.     printf("%d", affichage);
  14.     return 0;
  15. }


ou

Code :
  1. int calcul(const int arg1, const int arg2)
  2. {
  3.     return arg1+arg2;
  4. }
  5. int main(void)
  6. {
  7.     int affichage=calcul(41,43);
  8.     printf("%d", affichage);
  9.     return 0;
  10. }
 

C'est juste un exemple basique, imagine toi la même chose avec plusieurs appels à calcul et pas une/trois fonction/variables mais des dizaines. Ca devient très vite un énorme bordel avec le risque de perdre bien du temps à cause d'erreurs à la con. :o
Et puis les variables globales prennent de la place tout le temps, les variables locales uniquement tant qu'elles existent.

Message cité 1 fois
Message édité par rat de combat le 12-07-2019 à 14:39:27
n°264735
MilesTEG1
Posté le 12-07-2019 à 15:03:31  profilanswer
 

Natopsi a écrit :

En C++: void toto(int obligatoire, int facultatif = -1) {}

 

Et pour le polymorphisme, tu passe un void * que tu caste plus loin dans le bon type:

 


Code :
  1. void print(void * value, int type = 0)
  2. {
  3. if(type==0)
  4. {
  5.     myGLCD.printNumI(*static_cast<int*>(value))
  6. }else if(type==1)
  7. {
  8. myGLCD.printNumF(*static_cast<float*>(value))
  9. }
  10. }
  11. int i = 0;
  12. float f = 3.14;
  13. print(&i,0)
  14. print(&f,1)


 

Ok, j'ai commencé à lire le cours/tuto sur les pointeurs. C'est pas simple, mais je commence à saisir les grandes lignes.
Alors voilà ce que je viens de faire, dites moi si ça peut fonctionner (je n'ai pas encore tenté la compilation ni l'exécution).

 
Code :
  1. void Centrer_Nombre_dans_Zone ( void *_nbr_ptr, int Y, int X1, int X2, int COULEUR, int _type = 0 ) {
  2.     // Fonction pour afficher du texte centré horizontalement dans une zone définie par X1 et X2
  3.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  4.     int X = -1;
  5.     String _texte = *static_cast<String *> ( _nbr_ptr );
  6.     if ( X2 > X1 ) {
  7.         X = X1 + ( X2 - X1 + 1 - _texte.length() * myGLCD.getFontXsize() ) / 2;
  8.     }
  9.     else {
  10.         X = X2 + ( X1 - X2 - myGLCD.getFontXsize() ) / 2;
  11.     }
  12.     if ( X <= 0 ) {
  13.         Serial.print ( F ( "-- Erreur dans le fonction Centrer_Nombre_Int_dans_Zone : la valeur calculée de X est négative ou nulle, elle vaut :" ) );
  14.         Serial.println ( X );
  15.         Serial.print ( F ( "Le texte qui génère cette erreur est : " ) );
  16.         Serial.println ( _texte );
  17.     }
  18.     else {
  19.         myGLCD.setColor ( COULEUR );
  20.         switch ( _type ) {
  21.             case 0:     // Le nombre est un entier
  22.                 myGLCD.printNumI ( *static_cast<int *> ( _nbr_ptr ), X, Y );
  23.                 break;
  24.             case 1:     // Le nombre est un float
  25.                 myGLCD.printNumF ( *static_cast<float *> ( _nbr_ptr ), 1, X, Y, ',' );
  26.                 break;
  27.             default:    // Le type n'est pas correct, erreur !
  28.                 Serial.print ( F ( "-- Erreur de type dans Centrer_Nombre_dans_Zone(). Le type sélectionné est : " ) );
  29.                 Serial.println ( _type );
  30.                 break;
  31.         }
  32.     }
  33. }
 

AVec un appel à la fonction ainsi :

Code :
  1. Centrer_Nombre_dans_Zone ( &variable_a_afficher, Y, X1, X2, COULEUR, 0 );    // Pour un entier
  2. Centrer_Nombre_dans_Zone ( &variable_a_afficher, Y, X1, X2, COULEUR, 1 );    // Pour un float
 

_________________

 
rat de combat a écrit :

Tu sais que tu peux passer des infos à des fonctions en tant que paramètres? Normalement c'est comme ça qu'on fait. :o
Après libre à toi de mettre des variables globales partout, mais ce n'est pas propre et ne participe pas à rendre le code plus lisible.

 

Prenons un exemple, qu'est-ce qui est mieux?

Code :
  1. int argument1, argument2, resultat;
  2. int affichage;
  3. void calcul(void)
  4. {
  5.     resultat=argument1+argument2;
  6. }
  7. int main(void)
  8. {
  9.     argument1=41;
  10.     argument2=43;
  11.     calcul();
  12.     affichage=resultat;
  13.     printf("%d", affichage);
  14.     return 0;
  15. }


ou

Code :
  1. int calcul(const int arg1, const int arg2)
  2. {
  3.     return arg1+arg2;
  4. }
  5. int main(void)
  6. {
  7.     int affichage=calcul(41,43);
  8.     printf("%d", affichage);
  9.     return 0;
  10. }
 

C'est juste un exemple basique, imagine toi la même chose avec plusieurs appels à calcul et pas une/trois fonction/variables mais des dizaines. Ca devient très vite un énorme bordel avec le risque de perdre bien du temps à cause d'erreurs à la con. :o
Et puis les variables globales prennent de la place tout le temps, les variables locales uniquement tant qu'elles existent.


Je comprends bien ton argumentation et ce que tu expliques, et je suis d'accord.
Mais en arduino, il y a une fonction setup() et une autre loop() qui n'ont aucun lien mais qui sont exécutées dans cet ordre. Donc ce que j'initialise dans setup n'est pas visible dans loop. Et la particularité de loop c'est qu'elle se fait en boucle jsuqu'à l'extinction de l'arduino.
Donc si je définie et déclare les variables locales elles sont réinitialisées à chaque boucle. Donc je ne peux plus vérifier s'il y a des changements de valeurs...
Faut que je mette mon code anonymisé sur github pour que vous vous rendiez-compte de ce que j'ai fait ;)

 

edit : modification de la ligne 5.


Message édité par MilesTEG1 le 12-07-2019 à 18:21:52

---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264737
rat de com​bat
attention rongeur méchant!
Posté le 12-07-2019 à 15:13:15  profilanswer
 

Ce que tu décris, à savoir initialisation dans setup() qui doit être visible dans loop() c'est un des cas où on peut/doit utiliser des variables globales. Il faut juste faire attention à ne pas en coller partout sans refléchir. :o  
 
Concernant les changements de valeurs tu peux travailler avec le mot-clé static qui fait en sorte que la variable locale garde sa valeur même si la fonction / le bloc dans lequel elle a été déclarée n'existe plus. Et oui...

Code :
  1. void loop(void)
  2. {
  3.     static int ancienne_valeur=0; //static!!
  4.     int nouvelle_valeur=lire();
  5.     if(nouvelle_valeur!=ancienne_valeur)
  6.     {
  7.         ancienne_valeur=nouvelle_valeur;
  8.         faire_quelque_chose();
  9.     }
  10. }

n°264738
MilesTEG1
Posté le 12-07-2019 à 15:19:53  profilanswer
 

rat de combat a écrit :

Ce que tu décris, à savoir initialisation dans setup() qui doit être visible dans loop() c'est un des cas où on peut/doit utiliser des variables globales. Il faut juste faire attention à ne pas en coller partout sans refléchir. :o  
 
Concernant les changements de valeurs tu peux travailler avec le mot-clé static qui fait en sorte que la variable locale garde sa valeur même si la fonction / le bloc dans lequel elle a été déclarée n'existe plus. Et oui...

Code :
  1. void loop(void)
  2. {
  3.     static int ancienne_valeur=0; //static!!
  4.     int nouvelle_valeur=lire();
  5.     if(nouvelle_valeur!=ancienne_valeur)
  6.     {
  7.         ancienne_valeur=nouvelle_valeur;
  8.         faire_quelque_chose();
  9.     }
  10. }



J’ai effectivement vu ce qu’était une variable déclarée en static lorsque j’ai recherché ce qu’était le static_cast...


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264787
MilesTEG1
Posté le 12-07-2019 à 18:23:23  profilanswer
 

j'ai modifié la ligne 5 de ma fonction car ça ne compilait pas.
Avec ce qui suit ça compile :

Code :
  1. String _texte = *static_cast<String *> ( _nbr_ptr );
 

Bon je n'ai pas encore lancé le code, pas eu le temps de rebrancher mon arduino.

 

Mais je sens que je vais devoir plutôt faire deux fonctions distinctes :D


Message édité par MilesTEG1 le 12-07-2019 à 18:23:59

---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264832
MilesTEG1
Posté le 12-07-2019 à 23:04:49  profilanswer
 

Sinon, voilà mes variables globales dans des structures.

Code :
  1. // Définition des structures de données
  2. typedef struct Exterieur Exterieur;
  3. struct Exterieur {      // Structure qui regroupe toutes les variables de la station météo
  4.     float temp_num;
  5.     float temp_num_prec;    // La valeur précédente pour la comparaison
  6.     int humidite;
  7.     int humidite_prec;      // La valeur précédente pour la comparaison
  8.     String temp_tendance;   // La variable text récupérée du flux Internet
  9.     String temp_texte;      // La variable text récupérée du flux Internet
  10.     String humidite_texte;  // La variable text récupérée du flux Internet
  11. };
  12. typedef struct Salon Salon;
  13. struct Salon {      // Structure qui regroupe toutes les variables de la station météo
  14.     float temp_num;
  15.     float temp_num_prec;    // La valeur précédente pour la comparaison
  16.     int CO2;
  17.     int CO2_prec;           // La valeur précédente pour la comparaison
  18.     int pression;
  19.     int pression_prec;      // La valeur précédente pour la comparaison
  20.     int humidite;
  21.     int humidite_prec;      // La valeur précédente pour la comparaison
  22.     String temp_tendance;
  23.     String temp_texte;          // La variable text récupérée du flux Internet
  24.     String CO2_texte;           // La variable text récupérée du flux Internet
  25.     String pression_texte;      // La variable text récupérée du flux Internet
  26.     String pression_tendance;   // La variable text récupérée du flux Internet
  27.     String humidite_texte;      // La variable text récupérée du flux Internet
  28. };
  29. typedef struct Chambre Chambre;
  30. struct Chambre {      // Structure qui regroupe toutes les variables de la station météo
  31.     float temp_num;
  32.     float temp_num_prec;    // La valeur précédente pour la comparaison
  33.     int CO2;
  34.     int CO2_prec;           // La valeur précédente pour la comparaison
  35.     int humidite;
  36.     int humidite_prec;      // La valeur précédente pour la comparaison
  37.     String temp_tendance;
  38.     String temp_texte;      // La variable text récupérée du flux Internet
  39.     String CO2_texte;       // La variable text récupérée du flux Internet
  40.     String humidite_texte;  // La variable text récupérée du flux Internet
  41. };
  42. typedef struct Station_Meteo Station_Meteo;
  43. struct Station_Meteo {      // Structure qui regroupe toutes les variables de la station météo
  44.     Exterieur exterieur;
  45.     Salon salon;
  46.     Chambre chambre;
  47. };
  48. Station_Meteo _ma_Station;


 
Objectif : utiliser _ma_station.salon.xxx    _ma_station.chambre.xxx    _ma_station.exterieur.xxx    
 
Il y a moyen de simplifier un peu ou bien c'est bon comme j'ai fait ?
Il faut que j'initialise avec des valeurs particulières pour la suite, je le fais directement après : Station_Meteo _ma_Station;
?
 


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264845
docmaboul
Posté le 13-07-2019 à 07:39:01  profilanswer
 

c'est pas un conseil d'ami le coup du void*. Pour un débutant avec les pointeurs, c'est l'assurance d'écrire des bugs.
 
Une approche plus sûre mais à peine plus fastidieuse serait de faire plusieurs fonctions:

Code :
  1. bool Centrer_Nombre_dans_Zone_init( String _texte, int Y, int X1, int X2, int & X) {
  2.     // Fonction pour afficher du texte centré horizontalement dans une zone définie par X1 et X2
  3.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  4.     if ( X2 > X1 ) {
  5.         X = X1 + ( X2 - X1 + 1 - _texte.length() * myGLCD.getFontXsize() ) / 2;
  6.     }
  7.     else {
  8.         X = X2 + ( X1 - X2 - myGLCD.getFontXsize() ) / 2;
  9.     }
  10.     if ( X <= 0 ) {
  11.         Serial.print ( F ( "-- Erreur dans le fonction Centrer_Nombre_Int_dans_Zone : la valeur calculée de X est négative ou nulle, elle vaut :" ) );
  12.         Serial.println ( X );
  13.         Serial.print ( F ( "Le texte qui génère cette erreur est : " ) );
  14.         Serial.println ( _texte );
  15.         return false;
  16.     }
  17.     return true;
  18. }
  19. void Centrer_Nombre_dans_Zone ( int value, int Y, int X1, int X2, int COULEUR) {
  20.     int X = -1;
  21.     String _texte = value;
  22.     if ( Centrer_Nombre_dans_Zone_init(_texte, Y, X1, X2, X) {
  23.         myGLCD.setColor ( COULEUR );
  24.         myGLCD.printNumI ( value, X, Y );
  25.     }
  26. }


 
J'ai sorti un bout de ton code dans Centrer_Nombre_dans_Zone_init afin d'éviter de dupliquer le code dans chaque fonction (c'est mal, ça duplique la maintenance, les bugs, la taille, etc.). Là, tu as juste à faire une deuxième Centrer_Nombre_dans_Zone sur le même modèle mais pour le type float.

Message cité 1 fois
Message édité par docmaboul le 13-07-2019 à 07:40:46
n°264861
MilesTEG1
Posté le 13-07-2019 à 11:07:39  profilanswer
 

docmaboul a écrit :

c'est pas un conseil d'ami le coup du void*. Pour un débutant avec les pointeurs, c'est l'assurance d'écrire des bugs.
 
Une approche plus sûre mais à peine plus fastidieuse serait de faire plusieurs fonctions:

Code :
  1. bool Centrer_Nombre_dans_Zone_init( String _texte, int Y, int X1, int X2, int & X) {
  2.     // Fonction pour afficher du texte centré horizontalement dans une zone définie par X1 et X2
  3.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  4.     if ( X2 > X1 ) {
  5.         X = X1 + ( X2 - X1 + 1 - _texte.length() * myGLCD.getFontXsize() ) / 2;
  6.     }
  7.     else {
  8.         X = X2 + ( X1 - X2 - myGLCD.getFontXsize() ) / 2;
  9.     }
  10.     if ( X <= 0 ) {
  11.         Serial.print ( F ( "-- Erreur dans le fonction Centrer_Nombre_Int_dans_Zone : la valeur calculée de X est négative ou nulle, elle vaut :" ) );
  12.         Serial.println ( X );
  13.         Serial.print ( F ( "Le texte qui génère cette erreur est : " ) );
  14.         Serial.println ( _texte );
  15.         return false;
  16.     }
  17.     return true;
  18. }
  19. void Centrer_Nombre_dans_Zone ( int value, int Y, int X1, int X2, int COULEUR) {
  20.     int X = -1;
  21.     String _texte = value;
  22.     if ( Centrer_Nombre_dans_Zone_init(_texte, Y, X1, X2, X) {
  23.         myGLCD.setColor ( COULEUR );
  24.         myGLCD.printNumI ( value, X, Y );
  25.     }
  26. }


 
J'ai sorti un bout de ton code dans Centrer_Nombre_dans_Zone_init afin d'éviter de dupliquer le code dans chaque fonction (c'est mal, ça duplique la maintenance, les bugs, la taille, etc.). Là, tu as juste à faire une deuxième Centrer_Nombre_dans_Zone sur le même modèle mais pour le type float.


Ohh ! Super :D merci :jap:
Je vais faire ainsi, et du coup je vais aussi modifier la fonction qui me centrait un texte directement avec ta méthode, ça fera moins de F ( "blablabla" ) à stocker en flash :)
Merci :jap:


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264884
MilesTEG1
Posté le 13-07-2019 à 14:18:46  profilanswer
 

@docmaboul : voilà les fonctions remaniées légèrement.
J'ai juste une difficulté à comprendre le paramètre int &X .
Il me semblait que &X faisait référence à l'adresse mémoire de X. Pourquoi ici l'utilisation de X dans la fonction de vérification entraine la modification de la valeur de X et non pas celle de son adresse mémoire ??
 

Code :
  1. bool Centrer_dans_Zone_Verif ( String _texte, int Y, int X1, int X2, int &X ) {
  2.     // Fonction pour afficher du texte centré horizontalement dans une zone définie par X1 et X2
  3.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  4.     if ( X2 > X1 ) {
  5.         X = X1 + ( X2 - X1 + 1 - _texte.length() * myGLCD.getFontXsize() ) / 2;
  6.     }
  7.     else {
  8.         X = X2 + ( X1 - X2 - myGLCD.getFontXsize() ) / 2;
  9.     }
  10.     if ( X <= 0 ) {
  11.         Serial.print ( F ( "-- Erreur dans le fonction Centrer_dans_Zone_Verif : la valeur calculée de X est négative ou nulle, elle vaut :" ) );
  12.         Serial.println ( X );
  13.         Serial.print ( F ( "Le texte qui génère cette erreur est : " ) );
  14.         Serial.print ( _texte );
  15.         return false;
  16.     }
  17.     return true;
  18. }
  19. void Centrer_Nombre_Int_dans_Zone ( int _nbr, int Y, int X1, int X2, int COULEUR ) {
  20.     // Fonction pour afficher un nombre int centré horizontalement dans une zone définie par X1 et X2
  21.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  22.     int X = -1;
  23.     String _texte = String ( _nbr, 1 );
  24.     if ( Centrer_dans_Zone_Verif ( _texte, Y, X1, X2, X ) ) {
  25.         myGLCD.setColor ( COULEUR );
  26.         myGLCD.printNumI ( _nbr, X, Y );
  27.     }
  28.     else {
  29.         Serial.println ( F ( "  -- envoyé depuis fonction Centrer_Nombre_Int_dans_Zone." ) );
  30.     }
  31. }
  32. void Centrer_Nombre_Float_dans_Zone ( float _nbr, int Y, int X1, int X2, int COULEUR ) {
  33.     // Fonction pour afficher un nombre float centré horizontalement dans une zone définie par X1 et X2
  34.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  35.     int X = -1;
  36.     String _texte = String ( _nbr, 1 );
  37.     if ( Centrer_dans_Zone_Verif ( _texte, Y, X1, X2, X ) ) {
  38.         myGLCD.setColor ( COULEUR );
  39.         myGLCD.printNumF ( _nbr, 1, X, Y, ',' );
  40.     }
  41.     else {
  42.         Serial.println ( F ( "  -- envoyé depuis fonction Centrer_Nombre_Float_dans_Zone." ) );
  43.     }
  44. }
  45. void Centrer_Texte_dans_Zone ( String _texte, int Y, int X1, int X2, int COULEUR ) {
  46.     // Fonction pour afficher du texte centré horizontalement dans une zone définie par X1 et X2
  47.     // On va faire en sorte que X1 soit toujours < X2 pour faciliter l'algorythme
  48.     int X = -1;
  49.     if ( Centrer_dans_Zone_Verif ( _texte, Y, X1, X2, X ) ) {
  50.         myGLCD.setColor ( COULEUR );
  51.         myGLCD.print ( _texte, X, Y );
  52.     }
  53.     else {
  54.         Serial.println ( F ( "  -- envoyé depuis fonction Centrer_Texte_dans_Zone." ) );
  55.     }
  56. }


 
 
edit : modification d'une erreur dans la fonction Centrer_Texte_dans_Zone (j'avais pas enlevé certains arguments qui ne sont pas à passer à la fonction myGLCD.print ()...

Message cité 1 fois
Message édité par MilesTEG1 le 13-07-2019 à 20:14:51

---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264890
Turkleton
I don't quite understand you
Posté le 13-07-2019 à 14:39:53  profilanswer
 

MilesTEG1 a écrit :

Il me semblait que &X faisait référence à l'adresse mémoire de X. Pourquoi ici l'utilisation de X dans la fonction de vérification entraine la modification de la valeur de X et non pas celle de son adresse mémoire ??

Relis mieux ta phrase, la réponse est dedans :D  
 


---------------
If you think it could look good, then I guess it should
n°264903
MilesTEG1
Posté le 13-07-2019 à 16:35:26  profilanswer
 

Turkleton a écrit :

Relis mieux ta phrase, la réponse est dedans :D  
 


 :whistle:  :pt1cable:  
Ouais, bon ok :D
 
Mais du coup, pourquoi dans les arguments c'est l'adresse de la variable qui est présente ?
J'ai vraiment du mal avec ça...  :o  Je n'aurais pas pu être développeur professionnel c'est clair  :o  :pt1cable:


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264904
rat de com​bat
attention rongeur méchant!
Posté le 13-07-2019 à 16:38:40  profilanswer
 

Attention avec
>bool Centrer_Nombre_dans_Zone_init( String _texte, int Y, int X1, int X2, int & X)
c'est du C++ ça, pas du C. Je suppose(!!) que ça veut dire X est un pointeur, en C il faudrait mettre une étoile.

n°264916
Natopsi
☄️Just end it already!☄️
Posté le 13-07-2019 à 17:48:26  profilanswer
 

C'est du passage par référence, ça permet justement d'avoir à éviter de se fatiguer à utiliser les opérateurs liés au pointeurs.
Vu que l'environnement Arduino utilise le C++ pourquoi ce priver?  :D


---------------
ACH/VDSHFRCoin◈1435mm⚡
n°264918
MilesTEG1
Posté le 13-07-2019 à 18:04:42  profilanswer
 

Natopsi a écrit :

C'est du passage par référence, ça permet justement d'avoir à éviter de se fatiguer à utiliser les opérateurs liés au pointeurs.
Vu que l'environnement Arduino utilise le C++ pourquoi ce priver?  :D


Haaaa, je viens de comprendre !!! Le passage par référence !!!

 

En gros ça :

Code :
  1. void fonction ( int &arg1) {
  2.     // blabla... On utilise arg2 tel quel
  3.     arg1 +=10;
  4. }
  5. void setup () {
  6.     int blabla = 1;
  7.     fonction ( blabla );
  8.     // blabla vaut maintenant 11
  9. }
 

est équivalent à :

Code :
  1. void fonction ( int *arg1) {
  2.     // blabla... On utilise arg2 tel quel
  3.     *arg1 +=10;
  4. }
  5. void setup () {
  6.     int blabla = 1;
  7.     fonction ( &blabla );
  8.     // blabla vaut maintenant 11
  9. }
 

C'est bien ça ?
Est-ce que je commencerais à comprendre un peu ?  :pt1cable:  :o  :whistle:


Message édité par MilesTEG1 le 13-07-2019 à 18:05:09

---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264923
docmaboul
Posté le 13-07-2019 à 18:48:15  profilanswer
 

c'est bien ça :)
 
ça évite d'avoir à manipuler des pointeurs pour quelque chose d'aussi trivial que de vouloir modifier une variable dans une fonction.

n°264933
MilesTEG1
Posté le 13-07-2019 à 19:51:47  profilanswer
 

Cool :D
 
Sinon, purée, j'ai passé mon après-midi à bricoler un fichier de config pour uncrustify sur macos pour que Sublime Text puisse me rendre un "plus joli code" :o :D un peu comme ce que me donne Cool Format de Notepad++ sous windows.
Car CoolFormat ne fonctionne pas correctement avec macOS et Sublime Text, malgré qu'il y ait un plugins... ça me supprime tout le code :o


---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
n°264935
docmaboul
Posté le 13-07-2019 à 19:58:45  profilanswer
 

Pourquoi ne pas utiliser vscode avec platformio ?

n°264939
MilesTEG1
Posté le 13-07-2019 à 20:06:49  profilanswer
 

Sinon question sur mes structures ( voir ce message ).
Est-il possible de mettre des valeurs pour chaque variable de la structure à la déclaration de la structure ?
Ou bien je suis obligé de le faire lorsque je la définie avec
Station_Meteo _ma_Station;
 
D'ailleurs, comme j'ai 3 structures imbriquées, est-ce que c'est bon ainsi ?

Code :
  1. Station_Meteo _ma_Station = { { -99.9, -99.9, 0, 0, "up", "", "" }, { -99.9, -99.9, 9999, 9999, 9999, 9999, 0, 0, "up", "", "", "", "up", "" }, { -99.9, -99.9, 9999, 9999, 0, 0, "up", "", "", "up" } };


 
edit : d'ailleurs, c'est chiant de faire comme ça, et de ne pas pouvoir inclure les valeurs par défaut lors des déclarations des strcut blabla...
 
edit 2 :
Essaie de compilation sans les strcutrures donc avec les variables séparées :

Le croquis utilise 59340 octets (23%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 558 octets (6%) de mémoire dynamique, ce qui laisse 7634 octets pour les variables locales. Le maximum est de 8192 octets.


 
puis avec les structures, et donc sans les variables séparées :  

Le croquis utilise 59342 octets (23%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 600 octets (7%) de mémoire dynamique, ce qui laisse 7592 octets pour les variables locales. Le maximum est de 8192 octets.


 
Les structures prennent 2 octets de plus dans les deux mémoires, ça va, c'est raisonnable :D


Message édité par MilesTEG1 le 13-07-2019 à 20:20:12

---------------
Mes ventes : [FeedBack] http://forum.hardware.fr/hfr/Achat [...] 4599_1.htm
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  183  184  185  ..  264  265  266  267  268  269

Aller à :
Ajouter une réponse
 

Sujets relatifs
* Réparations de vos appareils électroniques & electromenager * 
Plus de sujets relatifs à : [arduino] Topic Unique blabla @ Arduino


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR