bravo, c'est bien de participer.
quelques commentaires qui se veulent constructifs.
Sur la forme:
Corrigez votre post ci dessus et rajoutez lescode tags autour du code:
[code]
[color=blue]// le code ici[/color]
[/code]
.
ça doit ressembler à cela:
// le code ici
c'est mieux quand on poste sur le forum sinon des trucs bizarre peuvent apparaître
par exemple ce codex = f(8);
si je ne le mets pas dans les tags devient x = f(8); <-- Non je ne veux pas de smiley à lunettes!
faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit intenté correctement
Sur le fond:
choisissez le type des variables de manière appropriées. Par exemple la pin pour le bouton ou pour la LED sont des petites valeurs qui sont < 255 donc représentables sur un seul octet. pas la peine donc de déclarer un int
pour les stocker. En plus elles ne vont jamais changer, ce sont des constantes. Autant le dire au compilateur comme cela il va faire des optimisations (en fait le compilateur n'allouera même pas la mémoire, il mettra directement la valeur dans les fonctions où la variable est utilisée, gain de place mémoire et c'est plus rapide).
const byte button = 6; //broche où on liera la valeur renvoyée par le capteur
const byte led = 7; //broche où est reliée la cathode de la LED
la gestion de l'état:
dans la boucle - qui tourne en permanence vous faites
etat = digitalRead(button);
if (etat) {
gere_switch();
}
Donc lorsque vous appelez la fonction gere_switch()
la variable état doit être "vraie" (HIGH).
Quand on arrive dans gere_switch()
void gere_switch() {
while (etat)
{
etat = digitalRead(button);
}
là donc vous attendez que l'on relâche le bouton. le pb c'est que les boutons "rebondissent", il vont osciller pendant quelques milliseconds entre HIGH et LOW. Donc vous n'attendez pas vraiment qu'on relâche le bouton, vous risquez de sortir tout de suite de ce while, sur simple oscillation --> On en reparle ensuite.
Là vous incrémentez le compteur... Pourquoi prendre un compteur et faire une opération mathématique "coûteuse" (ajouter 1, regarder si le nombre est pair) alors que ce que vous voulez c'est une "bascule", un truc qui est une fois vrai, une fois faux.
Donc au lieu de int compteur = 0; //variable permettant de savoir si on éteint ou allume la LED
on peut simplement prendre une variable de type booléen qui va être vraie ou fausse.
bool ledON = false; // variable donnant l'état de la LED
et donc au lieu de tester si compteur est pair on va écrire:
digitalWrite(led, ledON ? LOW : HIGH ); // operateur ternaire http://www.commentcamarche.net/contents/186-langage-c-les-structures-conditionnelles, si on était ON on passe LOW, sinon on passe HIGH
ledON = !ledON; // on inverse la valeur
Une autre façon de faire une bascule c'est avec un truc du genre:
byte bascule = 0;
...
bascule = 1-bascule; // quand bascule valait 1, ça passe à zéro (1-1) et quand bascule valait 0 on passe à 1 (1-0)
ensuite vous retournez donc dans la boucle et là vous attendez 100 ms. c'est ce qui vous "sauve" des oscillations car le bouton en 100ms a fini d'osciller et s'est stabilisé. si vous tenez encore au bout d'un dizième de seconde votre bouton cependant vous allez retourner dans gere_switch() et au moment ou vous lâchez, vous allez éteindre la LED.. Pas sûr que ce soit ce que vous vouliez... tout dépend des oscillations.
Une manière propre de tester les oscillations est d'enregistrer l'heure (millis()) de changement d'état de la lampe et de ne pas accepter de changement d'état pendant les 15 milliseconds qui suivent pas exemple. (il faut donc une variable temps et une qui mémorise l'état précédent du bouton)
Serial.begin(9600);
comme vous n'utilisez pas le port série, cette ligne n'est pas nécessaire.
voilà j'espère que ça vous donne quelques idées pour améliorer votre pratique. Continuez à contribuer!