Aide Besoin de conseils pour programation Arduino

J

jpbbricole

Compagnon
Salut Mandrak
As-tu quand même dormi?

Je n'arrive pas a assimilé l'interaction de
Il faudrait plutôt dire, pour une meilleure comprhension,
oledMoteurONOFF(ledStateDM) avec void oledMoteurONOFF(int MoteurEtat)

void oledMoteurONOFF(int MoteurEtat) est une routine (ou sous programme ou commande ou ...) dans laquelle on va décider quel texte à afficher (variable globale moteur_OnOff) en fonction du paramètre MoteurEtat.

oledMoteurONOFF(ledStateDM) est l'appel de cette routine en lui transmettant le paramètre ledStatDM. Qui par conséquent va décider du texte (moteur_OnOff) à afficher.

Maintenant, on peut se poser la question pourquoi se compliquer l'existance et faire une routine pour décider du texte à afficher en fonction d'une variable (ledStatDM) alors que l'on pourrais le faire directement dans void loop
Avec cette façon, si tu dois, à un autre endroit de ton programme, modifier le texte à afficher tu devra répéter if(ledStat.....
Avec cette routine, seulement oledMoteurONOFF(LOW) par exemple.
et void loop() donne

int ledStateDM = LOW; //l’état de la led a été initialisé a bas (ou 0 )
pinMode(bouton_DemPin, INPUT_PULLUP); // l’état du bouton est a haut (ou 1) car Pullup
Maintenant, avec la nouvelle variable moteur_OnOff, tu dois l'initialiser au départ afin que l'affichage soit tout de suite juste.
Ajoute:
oledMoteurONOFF(ledStateDM)

C'est dur, mais on va y arriver!

Cordialement
jpbbricole
 
Dernière édition:
M

Mandrak

Apprenti
Re
As-tu quand même dormi?
Oui mais apparemment j'ai causé... Ma femme ma demander ce matin, c'est quoi cette histoire de String, oled, ect..., il a fallut fournir des explications:lol:

void oledMoteurONOFF(int MoteurEtat) est une routine (ou sous programme ou commande ou ...)
De ce que j'ai pus lire, voir, sur la toile, je l'appellerait un Fonction.
Son mécanisme:
void OledMoteurONoFF est une fonction qui contient ou utilise la variable int MoteurEtat, cette même variable est mis a l’état LOW dans la déclaration du if.
Selon l'etat de MoteurEtat, moteur_On_OFF affichera le texte "MOTEUR ON ou MOTEUR OFF" dans
u8g.drawStr(33,58, moteur_OnOFF);
Jusque la ca devrait être bon.
oledMoteurONOFF(ledStateDM):mad: (comme tu dit "C'est dur, mais on va y arriver!")
Donc ledStateDM en changeant d'état, change l’état de oledMoteurONOFF ainsi que l’état de intMoteurEtat qui passe de 0 a 1 donc il affiche ce qu'il y a après le else.

Avec cette façon, si tu dois, à un autre endroit de ton programme, modifier le texte à afficher tu devra répéter if(ledStat.....
Tres juste, pour le moment je cherche la route avant de prendre le raccourci, mais je sais maintenant que le raccourci existe.

l'affichage soit tout de suite juste.
Pour avoir fais l'essai en réel, a la mise sous tension de l'arduino rien ne s'affiche hormis l'horloge,
il faut que j’appuie sur le bouton pour avoir l'affichage.
L'affichage correspond bien a l’état voulu et change de texte a chaque appuis.
Je vais chercher a ce que le texte s'affiche a la mise sous tension de l'arduino.

Je reviens sur le String
Au premier essai j'avais écrit ce code:
String moteur_OnOff; // dans l’entête de la page
et
u8g.drawStr(33,58,moteur_OnOff); //dans void draw()
A la compilation j'ai eu une erreur (voir le printscreen en pj)
J'ai contourné le problème avec ceci:
u8g.setPrintPos(33,58);
u8g.print(moteur_OnOff);

Je ferais une nouvelle vidéo plus tard.


@+Cordialement Voir la pièce jointe Printscreen).txt
 
Dernière édition:
J

jpbbricole

Compagnon
Salut Mandrake
il a fallut fournir des explications...
S'il faut changer de type de variables pour éviter, la nuit, de parler de string, nos programmes vont nettement moins bien marcher:tumbsupe:

ça avance gentiment
rien ne s'affiche hormis l'horloge
as-tu vu la ligne:
Maintenant, avec la nouvelle variable moteur_OnOff, tu dois l'initialiser au départ afin que l'affichage soit tout de suite juste.
Ajoute:
oledMoteurONOFF(ledStateDM)
Dans void setup()

Pour le reste, je prépare la critique!

A touit de suite
jpbbricole
 
J

jpbbricole

Compagnon
De ce que j'ai pus lire, voir, sur la toile, je l'appellerait un Fonction.
Pour moi, une fonction doit retourner une valeur ce qui n'est pas le cas d'une void xxx qui veut dire vide, qui, pour moi, est une commande (j'ai fait beaucoup de VisualBasic, ceci expliquant celà).
une fonction est écrite comme celà
int nomDeLaFonction([valeurAtransmettreAlaFonction])
ou
string nomDeLaFonction([valeurAtransmettreAlaFonction])
ou
byte ... etc en résumé celà commence par le type de variable que retournera la fonction.
ainsi
int fonctionQuiRetourneLaMoitie(int valeurTransmise)
{
int demiValeur = valeurTransmise/2;
return demiValeur;
}

qui se terminent avec un return valeurAretourner (qui doit être du type de la fonction, bien sûr)
et qui s'emploie comme celà

int resultatCalcul;
int x = 12;
resultatCalcul = fonctionQuiRetourneLaMoitie(x)
//Donc resultatCalcul = 6 (cqfd)

A noter que les valeurAtransmettreAlaFonction sont optionnels et il peut en avoir plusieurs, séparés par une virgule et ne sont pas forcément du même type que la fonction. Ainsi ont peut très bien avoir une fonction de type int à qui on transmet une string ou tout autre type de variable.

oledMoteurONOFF(ledStateDM):mad: (comme tu dit "C'est dur, mais on va y arriver!")
Donc ledStateDM en changeant d'état, change l’état de oledMoteurONOFF ainsi que l’état de intMoteurEtat qui passe de 0 a 1 donc il affiche ce qu'il y a après le else.
Pour être claire la commande void oledMoteurONOFF(int MoteurEtat) est COMPLETEMENT indépendante et n'a aucune liaison avec ledStateDM, de même qu'il n'y a aucun liaison entre la variable ledStateDM et le paramètre MoteurEtat de la void oledMoteurONOFF. La variable ledStateDM est modifiée uniquement dans la void loop et c'est par la commande oledMoteurONOFF(ledStateDM) et par l'intermédiaire du paramètre transmis, que ladite commande va mettre à jour la variable moteur_OnOff.
une fonction comme void oledMoteurONOFF(int MoteurEtat) peut très bien fonctionner sans la variable ledStateDM. Ainsi on peut l'employer comme ceci:

oledMoteurONOFF(LOW);
ou
oledMoteurONOFF(0);
ou
int x = 12-12;
oledMoteurONOFF(x);

Les 3 donnent le même résultat.

Voilà, j'ai soif et je tape tout celà pendant que mon imprimante 3D accouche de mon dernier chef d'oeuvre!

Si tu as encore des questions....

jpbbricole
 
Dernière édition:
M

Mandrak

Apprenti
Pour être claire la commande void oledMoteurONOFF(int MoteurEtat) est COMPLETEMENT indépendante et n'a aucune liaison avec ledStateDM, de même qu'il n'y a aucun liaison entre la variable ledStateDM et le paramètre MoteurEtat de la void oledMoteurONOFF. La variable ledStateDM est modifiée uniquement dans la void loop et c'est par la commande oledMoteurONOFF(ledStateDM) et par l'intermédiaire du paramètre transmis, que ladite commande va mettre à jour la variable moteur_OnOff.
une fonction comme void oledMoteurONOFF(int MoteurEtat) peut très bien fonctionner sans la variable ledStateDM. Ainsi on peut l'employer

Ok je cerne mieux le fonctionnement, avec de la pratique ca viendra, mais la route est longue...:oops:.

Si tu as encore des questions....
Oui mais on verra plus tard, je vais mettre en application ce que tu vient de m'apprendre, histoire de me familiarisé..

mon imprimante 3D accouche de mon dernier chef d'oeuvre!
Pourra on voir ??

La petite dernière:

Merci encore
Bonne soirée
@+Cordialement
 
J

jpbbricole

Compagnon
Salut Mandrak
Super résultat
upload_2016-9-22_18-43-50.png

a enfin opéré!

Oui mais on verra plus tard, je vais mettre en application...
Excellente résolution.
Pourra on voir ??
J'ai acheté une petite CNC chinoise et suis entrain de l'améliorer, ajout d'affichage LCD, homing X et Y par viseur laser, homing Z avec une sonde.
Tout les déplacements pour réglages se feront par des touches sensor (6 directions). Tu vois, c'est surtout pour le fun!. le tout, tu pouvais t'en douter, avec des Arduino (2). Je fais aussi un porte crayon ou tout autre engin de traçage. Actuellement je n'ai pas grand chose de montrable, mais bientôt j'ouvrirai certainement une nouvelle discussion pour ça.

Bonne soirée et à bientôt
jpbbricole
 
M

Mandrak

Apprenti
Bonsoir a tous

@ jpbbricole
A noter que les valeurAtransmettreAlaFonction sont optionnels et il peut en avoir plusieurs, séparés par une virgule et ne sont pas forcément du même type que la fonction. Ainsi ont peut très bien avoir une fonction de type int à qui on transmet une string ou tout autre type de variable.
Tes explications n'auront pas été vaines, et mon permis de comprendre le mécanisme entre les variables et les fonctions, et ainsi de pouvoir joué avec eux. (voir vidéo).
Pour afficher "Veilleuse, Code,Phare", j'ai utilisé une variable existante dans le programme (Post#20)
compteurPas=0; et avec une chaine conditionnelle "if et else" affiché ou Pas ce que je désirais.
il doit y avoir plus simple comme code, avec un tableau "char", mais chaque chose en sont temps, tu ma permis de gagné une bataille contre le C++, mais la guerre n'es pas encore gagné.
Prochaine étape affichage d'une image Bmp.

J'ai acheté une petite CNC chinoise et suis entrain de l'améliorer, ajout d'affichage LCD, homing X et Y par viseur laser, homing Z avec une sonde.....
:shock: T'es incroyable, rien ne t’arrête.

bientôt j'ouvrirai certainement une nouvelle discussion pour ça.
Fait le moi savoir quand tu le fera.:wink:

Je te remercie infiniment de toute l'aide que tu ma apporté jusques ici.




Bonne soirée
@+Cordialement
 
V

vibram

Compagnon
impressionant tous ces progrès !
J'ai vraiment hate de voir ca sur la machine !
J'ai roulé avec la tiger du pere cet aprem, javais oublié ce bonheur du 3 cylindres
Tu ne fais pas un indicateur de rapport engagé ?
De mémoire sur ma bandit, il venait récupéré une valeur électrique dans le moteur et en déduisait le rapport
 
M

Mandrak

Apprenti
Bonsoir vibram

impressionant tous ces progrès !
Merci, ca rentre mais il faut poussé fort...:mrgreen:

javais oublié ce bonheur du 3 cylindres
Une moto très agréable a conduire, souple et rageur a la fois, son point faible a mon gout, le poids, son point fort, la musique qui sort de son échappement.:wink:

Tu ne fais pas un indicateur de rapport engagé ?
Je l'avais envisager, mais sur ma moto test, ca ne sera pas fiable, j'explique
Sur la 500Cb comme beaucoup d'autres moto l'info de l'engagement de la vitesse ce fait via deux contact sur le sélecteur de vitesse (monté, descente), le problème est que quand tu engage mal une vitesse et quel saute tu la réengage, du coup tu incrément ton dispositif d'affichage sans pour autant que le bon rapport affiché soit engager.
une des sportive que je connaisse a qui l'on peut y installer ce dispositif es la 1000Gsxr (de K1 a K8)
car elle a au bout de son barillet de sélection un contact pour chaque vitesse (gestion de l'injection oblige), il est don beaucoup sur d'avoir une info fiable.
Les moto actuelle on sont équipé a 80%, argument commercial.....
Un autre problème se pose, il me faudrait un deuxièmes minipro, celui-ci va commencer a manqué de pin.

Bonne soirée
@+Cordialement
 
J

jpbbricole

Compagnon
Salut Mandrak
Superbe résultat, je suis ravi d'y avoir participé!
Tes explications n'auront pas été vaines, et mon permis de comprendre le mécanisme entre les variables et les fonctions
Tu as employé le bon terme, comme quoi un esprit "mécanique" est fort utile, même en C!

avec un tableau "char"
Déjà des termes de pro?

J'ai vraiment hate de voir ca sur la machine !
Au vu de ce que l'on peut voire au post #71, ce ne peut quêtre superbe!

A bientôt, au prochain épisode.
jpbbricole
 
B

bipbip30

Compagnon
a table, allez mandrak on lâche l'arduino et on file manger :jesors23:

en tout le résultat fait très pro, tu es un magicien
 
M

Mandrak

Apprenti
Bonsoir a tous

en tout le résultat fait très pro, tu es un magicien
Merci, mais si jetais magicien je n'aurais pas besoin d'aide pour programmé l'arduino.:wink:

Ou on se dépêche de manger et on file vers l'Arduino
Il y a un peu de ca...:mrgreen:

Déjà des termes de pro?
Que les termes alors..

Je viens de passer je ne sais pas combien d'heures a intégré une image Bmp sur l’écran du Oled,
j'y suis arriver, la bataille fut rude.
Pour ceux qu'il veulent essayer voici un lien très utile si vous utilisé un Oled avec un driver SH1106.

J'aurais une question:
Avec un "string", peut on affiché le contenu d'un "static unsigned char", qui contient des " 0x20, 0x00, 0x10, 0x00, 0x40, 0xf8, 0x08, ect..." ?
Je voudrai changer d'image (Bmp) au changement d'état d'un bouton, comme pour cet exemple
void loop()
{
boutonDM.update();
if ( boutonDM.fell() )
{
ledStateDM = !ledStateDM;
digitalWrite(led_DemPin,ledStateDM);

oledMoteurONOFF(ledStateDM)
}
}

les deux états en photo.
oled.jpg


Bonne nuit
@+Cordialement
 
J

jpbbricole

Compagnon
Salut Mandrak

Alors, là tu fonces la tête dans le guidon!
Pourrais-tu publier le code qui a affiché ces 2 icônes?

Cordialement
jpbbricole
 
M

Mandrak

Apprenti
Bonjour jpbbricole

Je les publierait ce soir quand je rentre.
Merci.
Bonne journée
@+ Cordialement.
 
J

jpbbricole

Compagnon
>Salut Mandrak
une solution:

void oledMoteurONOFF(int MoteurEtat)
{
if (MoteurEtat==LOW); //en fonction de la variable transmise (pas sur de moi, tu me dira) oui
{
u8g.drawXBM( 70, 20, veilOff_width, veilOff_height,ampouleVeilOff);
}
else
{
u8g.drawXBM( 70, 20, veilOn_width, veilOn_height,ampouleVeilOn);
}
}

Tu peux, éventuellement, supprimer la variable moteur_OnOff.

Bonne soirée
jpbbricole
 
M

Mandrak

Apprenti
Re
une solution:
Heuuu... t'en a pas une autre...:lol:

J'avais essayer ce code (comme celui de ta réponse), ca compile mais rien ne s'affiche, avec ou sans moteur_OnOff, d'ou ma question avec "string" si je ne place pas u8g.drawXBM(70, 20, veilOff_width, veilOff_height,ampouleVeilOff); dans void draw je n'ai aucun affichage.

Alors, là tu fonces la tête dans le guidon!
Tu me donne l'impression que je me suis attaqué a du lourd!!:smt017

Bonne soirée
@+
 
J

jpbbricole

Compagnon
Tu me donne l'impression que je me suis attaqué a du lourd!!
Oh non, surtout pas, je voulais dire par là que tu est un fonceur qui en veut et qui veut le mieux pour son programme.

Heuuu... t'en a pas une autre...
Oui, tu croyais que j'allais lacher le morceau comme ça!

si je ne place pas u8g.drawXBM(70, 20, veilOff_width, veilOff_height,ampouleVeilOff); dans void draw je n'ai aucun affichage.
Il me semble que la variable ledStateDM est globale?
Puisque celà ne s'affiche que dans void draw(), essaie d'y placer la condition

if (ledStateDM==LOW);
{
u8g.drawXBM( 70, 20, veilOff_width, veilOff_height,ampouleVeilOff);
}
else
{
u8g.drawXBM( 70, 20, veilOn_width, veilOn_height,ampouleVeilOn);
}


d'ou ma question avec "string"
Non c'est pas possible, u8g.drawStr manipule une string qui est une succession de codes ASCII alors que u8g.drawXBM, une suite d'octets qui contiennent des pixels allumés ou pas, donc incompatibles (Cette théorie est le fruit de mon imagination mais je crois que celà tiens debout!).

Bonne nuit
jpbbricole
 
M

Mandrak

Apprenti
je voulais dire par là que tu est un fonceur qui en veut et qui veut le mieux pour son programme.
Tant qu'a faire les choses, autan les faire bien, même si c'est compliqué, sinon on tire aucune satisfaction.

Oui, tu croyais que j'allais lâcher le morceau comme ça!
Au lire de tes connaissance en la matière, j’imagine que tu a plusieurs cordes a ton arc...:wink:

Il me semble que la variable ledStateDM est globale?
Oui bien vu, je n'avais pas pensé a utilisé celle la, je me suis entêté avec la commande "void oledMoteurONOFF" et forcement tourné en rond.
D'ailleurs dit on bien variable globale quand elle est en tête de page, et variable local quand elle est entre crocher d'un void ou int par exemple ??

u8g.drawStr manipule une string qui est une succession de codes ASCII
Vu.

Il ne me reste plus qu'a étendre cette animation au reste du programme, demain il fera jour...
Une vidéo suivra.
Merci encore.
Bonne nuit
@+Cordialement
 
M

Mandrak

Apprenti
Bonsoir a tous

Je iiaffe d'impatience
Voila, voila...:lol:
Génial, tous fonctionne, il me reste même de la place sur l’écran, j'ai bien encore une ou deux idée pour remplir cette espace vide, je vais m’intéresser de plus près aux capteurs et aux entrées analogique, reste a savoir si le minipro va avoir la capacité d'engloutir tout ca.
Les symboles Bmp sont sympa mais consomme pas mal de mémoire dynamique, j'en suis a 21%, la compilation commence a être longue.

Il y a t'il quelqu'un qui es une bonne adresse pour acheter un écran Oled plus grand que celui que j'ai (1.3"), a un prix défiant toute concurrence bien sur.

Jpbbricole
Je ne le dirait jamais assez, merci mille fois.
Tu en ai ou avec ta petite:smileJap:.

Bonne soirée
@+Cordialement

 
M

Mandrak

Apprenti
Bonsoir a tous

jpbbricole

Pourrait tu me renseigner, voir me conseiller.
J'aurais voulu passer a la couleur (l'écran) d'une taille entre 3.5" et 4.0",
avec une bonne résolution et qu'il n'utilise pas trop de pin de l'Arduino Mega,
qu'il soit facile a utilisé au niveau de la programmation pas trop cher, et pas tactile.
Je sais c'est beaucoup demander, mais comme ca tout est dit.
J'en es vue de toute sorte mais, je ne sais pas quoi prendre.
Merci pour tes éventuelles éclaircissement.

Bonne soirée
@+Cordialement
 
V

vibram

Compagnon
J'ai un peu regardé,
Pourquoi tu ne prends pas du TFT et tu ne programmes rien en tactile ?
Car le OLED a l'air peu répandu dans ces tailles la...
 
J

jpbbricole

Compagnon
Salut Mandrak
J'aurais voulu passer a la couleur (l'écran) d'une taille entre 3.5" et 4.0",
avec une bonne résolution et qu'il n'utilise pas trop de pin de l'Arduino Mega,
qu'il soit facile a utilisé au niveau de la programmation pas trop cher, et pas tactile.
Alors là, c'est le Saint Graal que tu cherches. Le dernier que j'ai vu le chercher était Indiana Jones!:7dance:
qu'il n'utilise pas trop de pin de l'Arduino Mega
Il faut t'orienter du côté de l'interface i2C, ce qui est déjà le cas de ton affichage actuel.
Mais je dois dire franchement, qu'il n'y a pas grand chose de valable.

Bonne journée
jpbbricole
 
M

Mandrak

Apprenti
Bonsoir a tous

vibram
et tu ne programmes rien en tactile ?
:shock:, peut tu m'en dire plus.
A par les Lcd HD44780 et maintenant le Oled je n'y connais pas grand chose.

Car le OLED a l'air peu répandu dans ces tailles la...
Oui tu a raison, ceux que j'ai trouvé coute un bras, voir les deux.:hang:

jpbbricole
Alors là, c'est le Saint Graal que tu cherches
Ha bon! :sad:, et sans chercher le Graal, il y a pas un compromis acceptable ?

Bonne soirée
@+Cordialement
 
V

vibram

Compagnon
Il y a pas mal d écran TFT i2c dans les tailles que tu veux.
Le TFT c'est tactile à la base (enfin de ce que j'ai lu, j'en ai jamais utilisé).
Alors pourquoi ne pas essayer un écran TFT mais tu ne programmes rien en ce qui concerne le côté tactile (ce qui est donc plus simple)
 

Sujets similaires

V
Réponses
3
Affichages
1 033
vibram
V
F
Réponses
6
Affichages
25 663
fraiddy
F
G
Réponses
88
Affichages
11 704
gaston83
G
G
Réponses
31
Affichages
45 019
gaston83
G
G
Réponses
123
Affichages
19 200
gaston83
G
G
Réponses
0
Affichages
600
gaston83
G
zygo4619
Réponses
34
Affichages
35 447
zygo4619
zygo4619
Moi33
Réponses
3
Affichages
47 985
speedjf37
S
V
Réponses
62
Affichages
5 353
vibram
V
Mcar
Réponses
65
Affichages
11 673
Mcar
R
Réponses
55
Affichages
52 753
jacounet
jacounet
U
Réponses
85
Affichages
7 233
Hubert86
H
2
Réponses
27
Affichages
1 212
jean-jacques
J
Haut