Une question bête

Toutes les discussions sur l'Arduino !

Modérateur : MOD

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » mer. 24 déc. 2014, 11:56

Alors le projet est simple (sur papier :siffle: ):

J'ai une séquence d'éclairage jour/nuit par bandeaux de leds. A certaines périodes de cette séquence, des lumières s'allument et s'éteignent (par exemple à 5h, le bureau de la gare s'allume, suivi 10' plus tard par le hall de gare et 1' à 5h15 les quais (passage du premier train 5h30) A 5h30, les pièces des maisons s'allument aléatoirement. A 6h, le bar et ses enseignes s'allument alors que le jour commence à se lever.
A 8h, le jour est complètement levé et les lumières de la ville d'éteignent.
.....comme cela toute la journée et on recommence le cycle à 5h00. Le plan de ces phases est fait.

Les boutons poussoirs servent à allumer et éteindre comme je le veux certains morceaux de la ville (halle marchandise et pont secteur lors de manœuvres de nuit.

J'ai trouvé des bouts de code qui font tout cela, le plus dur est de les assembler..mais surtout de faire MON programme à "moi tout seul perso". :mrgreen:

Je vous joindrai tous ces plans ultérieurement quand ils seront correct à mes yeux.

Merci de votre aide.

Avatar du membre
Francis8
Communicatif
Messages : 859
Enregistré le : jeu. 30 juil. 2009, 16:26
Echelle pratiquée : HO
Club : REV
Site Internet : http://www.association-rev.club
Localisation : Oise
Âge : 48
Contact :

Re: Une question bête

Message par Francis8 » mer. 24 déc. 2014, 12:09

Dans la même optique qu'Arduino, je te conseil de poser calmement les différentes étapes de ton système. Aussi simple ou compliqué soit-il.

ETAT 0 :
- LED off
- BP = OFF

passage ETAT0 vers ETAT1 : action sur BP=ON

ETAT 1 :
- LED ON
- BP = ON ou OFF (on se moque de son état, vu qu'on ne s'occupe que du changement d'état du bouton poussoir).

passage ETAT 1 vers ETAT 0 : action sur BP=ON

retour vers ETAT 0.

On a donc un système à deux états qui correspond aux deux états de la LED.
La transition entre ces deux états (du 0 vers le 1 et du 1 vers le 0) se fait uniquement via une détection de changement d'état du bouton poussoir.

Inutile de réagir à la nanoseconde dans ce cas, alors autant bien vérifier chaque étape en ajoutant un "delay();" dans la boucle principale (loop) de l'ordre de 500ms voir de 1000ms afin de voir à l'échelle humaine les transitions.

Perso, je réduit volontairement la vitesse de déroulement du programme afin de visualiser les transitions lors de la phase de conception. Une fois tout en ordre, je supprime (en faite je met en commentaire) la ligne du "delay(1000);".

Tout est question de bien identifier les étapes et transitions de ton système. Une fois ceci fait, tu peux rapidement et facilement adapter ton diagramme en langage C Arduino.

Je précise que c'est une façon de faire qui découle du cours sur les microcontrôleurs que je viens de suivre avec d'autres membres du forum ;-)

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » mer. 24 déc. 2014, 12:18

Merci pour ces infos. C'est ce qu'il faut que je m'habitue à faire en effet pour le programme.
Je suis aller faire un tour sur openclassroom mais je n'ai rien trouvé sur arduino.

Je m'y mettrai le 26 à rebosser dessus. Aujourd'hui et demain ont être un peu....occupés

Guillaume22
Papotier
Messages : 145
Enregistré le : dim. 29 sept. 2013, 09:20

Re: Une question bête

Message par Guillaume22 » mer. 24 déc. 2014, 12:40

Il a été enlevé apparement.
Son auteur tient un blog eskimon.fr

Avatar du membre
Arduino
Prolixe
Messages : 1700
Enregistré le : mer. 25 sept. 2013, 17:14

Re: Une question bête

Message par Arduino » mer. 24 déc. 2014, 17:11

sash28 a écrit :Alors le projet est simple (sur papier :siffle: ):

J'ai trouvé des bouts de code qui font tout cela, le plus dur est de les assembler..mais surtout de faire MON programme à "moi tout seul perso". :mrgreen:
A partir du moment où tu es capable d'écrire en langage courant les différentes actions qui doivent être réalisées par ton programme, alors oui cela devient simple.

Pour beaucoup d'entre nous, un programme à "nous tout seul perso" est simplement constitué de petits bouts de programmes copiés à droite et à gauche, assemblés les uns avec les autres. :wink:

Et peut-être que le père Noël t'apportera la solution, en tout cas ça vaut le coup de mettre tes souliers au pied du sapin (ou de la cheminée). :ange:

Joyeux Noël à tous :noel:

Avatar du membre
Arduino
Prolixe
Messages : 1700
Enregistré le : mer. 25 sept. 2013, 17:14

Re: Une question bête

Message par Arduino » sam. 27 déc. 2014, 12:02

sash28 a écrit :Merci pour ces infos. .........
Je m'y mettrai le 26 à rebosser dessus. Aujourd'hui et demain ont être un peu....occupés
Bonjour sash28, tu en es où de tes essais ?

J'ai un programme pour toi (et ceux que ça intéresse) pour allumer et éteindre une LED avec un seul bouton poussoir, comme tu l'avais demandé. Je t'avais dit que le Père Noël passerait .... :noel:

A votre disposition à tous pour vous donner la solution (ou plutôt UNE solution).

A moins que vous ne préfériez la trouver par vous-même. :geek:

migaliothy
Bavard
Messages : 50
Enregistré le : dim. 04 févr. 2007, 17:48
Âge : 61

Re: Une question bête

Message par migaliothy » dim. 28 déc. 2014, 18:37

Bonjour,
Pourquoi ne pas essayer avec un bouton poussoir à accrochage. On en trouve de différentes tailles et à des prix intéressants. Pour allumer une led, cela me parait une base de départ.
CORDIALEMENT

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Une question bête

Message par jlb » dim. 28 déc. 2014, 18:53

Sans doute parce que sash28 est en train de mettre en œuvre les différents éléments dont il a besoin pour les éclairages de son réseau. Et c'est bien plus compliqué que d'allumer une simple LED puisqu'il veut des automatismes avec des cycles jour nuit plus une commande manuelle.

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » lun. 29 déc. 2014, 11:13

J'en suis au point mort à tout foutre dans un mur!
je bug complètement. J'ai vachement de mal avec la logique Arduino. Beaucoup plus qu'avec le Visual Basic! Ou alors j'ai vieilli et je deviens vraiment très con.
Je n'y arrive pas. Je ne comprend pas. Pourtant j'ai tenté pas mal de choses mais il y a encore beaucoup de choses qui me bloquent, alors des questions bêtes, je vais en avoir des kilos!!
Alors si vous pouvez mettre le programme, que je l'étudie au moins et que je puisse voir comment l'intégrer dans mon futur projet; projet qui sera ouvert sur une nouvelle discussion mais avant je le peaufine afin de ne pas faire trop une usine à gaz, donc un programme "assez" simple ;-)

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Une question bête

Message par jlb » lun. 29 déc. 2014, 11:22

Voici :
const byte pinPoussoir = 2;
const byte pinLED = 3;

void setup()
{
  pinMode(pinPoussoir, INPUT_PULLUP);
  pinMode(pinLED, OUTPUT);
}

/*
 * Lecture du poussoir avec anti-rebond
 *
 * L'état du poussoir est initialisé à HIGH, poussoir non enfoncé.
 * La variable est static c'est à dire que l'initialisation
 * est faite une seule fois au démarrage du programme
 * 
 * Le poussoir est d'abord lu une première fois
 * on attend ensuite 5ms
 * Le poussoir est lu une seconde fois et comparé à la première lecture
 * Si les deux lectures donnent la meme valeur c'est que l'etat du
 * poussoir est stable. On met cet etat dans etatPoussoir et
 * on retourne etatPoussoir
 */
byte lirePoussoir()
{
  static byte etatPoussoir = HIGH;
  
  byte nouvelEtatPoussoir = digitalRead(pinPoussoir);
  delay(5);
  if (nouvelEtatPoussoir == digitalRead(pinPoussoir)) {
    etatPoussoir = nouvelEtatPoussoir;
  }

  return etatPoussoir;
}

/*
 * enfoncePoussoir retourne true sur détection de l'enfoncement
 * 
 * La détection de l'enfoncement est le passage de l'etat HIGH
 * a l'etat LOW
 */
boolean enfoncePoussoir()
{
  static byte etatPrecedent = HIGH;
  boolean resultat = false;
  byte nouvelEtat = lirePoussoir();
  if (nouvelEtat == LOW && etatPrecedent == HIGH) {
    resultat = true;
  }
  etatPrecedent = nouvelEtat;
  return resultat;
}

void loop()
{
  static int compte = 0;
  static byte etatLED = HIGH;
  
  if (enfoncePoussoir()) {
    compte++;
    etatLED = !etatLED;
  }

  digitalWrite(pinLED,etatLED);
}

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » lun. 29 déc. 2014, 11:57

Merci beaucoup.

En regardant le programme, j'avais bon jusqu'au setup sauf le INPUT_PULLUP, je ne mettais pas le pullup, puis ensuite, je faisait bien un digitalread (mais sur l'entrée A1) . Ma led s'allumait mais impossible de la rallumer ensuite.
Du coup, pour vérifier l'état de la led je faisais aussi un truc du genre etatLed mais je n'arrivai pas à trouver la suite! donc ça merdait à chaque fois.

Plus qu'à brancher tout ça et à tester. Je vous remercie de votre aide. Je me sens complètement ignare sur ce coup là! J'imagine pour la suite de mon programme! Ca promet de longs moments de solitude... car il va bien falloir que j'arrive à me debrouiller seul.

Merci encore.

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Une question bête

Message par jlb » lun. 29 déc. 2014, 12:03

Le PULLUP est là par ce que le poussoir est raccordé entre la broche de l'Arduino et la masse. Quand le poussoir est relâché, la broche de l'Arduino est donc « en l'air ». Le PULLUP la maintient à 5V (c'est une résistance de quelques dizaines de kΩ intégrée à chaque broche de l'Arduino). Quand on presse le poussoir, on établit le contact entre la broche et la masse et la broche est tirée à 0V.

On sera là pour aider ;-)

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » lun. 29 déc. 2014, 19:43

Merci Jean-Luc....et tous les autres pour votre aide. Je sais que je vais trouver de l'aide mais je déteste abuser.
Quand je demanderai c'est que je serai vraiment au bout du bout ;-)

je vous avertirai lorsque je mettrai en ligne mon projet d'éclairage. Je suis en train de tout mettre au propre et de voir si cela tient sur une UNO ou si je dois passer à la Mega.

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une question bête

Message par Sash28 » lun. 29 déc. 2014, 21:55

la suite:

Je viens de tester le programme. Ca fonctionne nickel. J'ai juste inversé les LOW et HIGH afin que la led soit éteinte au démarrage. je pense que c'est aussi du au branchement de ma led. Bref, ça tourne nickel.

Mais maintenant c'est une autre question qui me vient à l'esprit :siffle: :

Si je veux rajouter un bouton poussoir, (ou un autre morceau de programme), comment faire? Mis à part déclarer le nouveau bouton poussoir en "const byte" avec sa led associée, je ne vois pas comment imbriquer le tout dans le programme.

De plus, puis-je utiliser les entrées A1 et A2 pour les boutons poussoirs? (vous comprendrez plus tard pour quelle raison).

Merci encore à vous. Je file continuer mes triturations de programme :mdr2:

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Une question bête

Message par jlb » mar. 30 déc. 2014, 10:43

Bonjour,

La réponse directe : il suffit de les passer en revue via une fonction similaire à enfoncePoussoir et de changer l'état de la LED correspondante.

La réponse qui voit un peu plus loin :

Si tu as besoin de plusieurs boutons, avec peut-être des fonctions plus sophistiquées, tu vas réinventer la roue. Je te suggère d'utiliser une bibliothèque : Button. Tu peux la télécharger là : https://dl.dropboxusercontent.com/u/67740546/Button.zip

Dans son utilisation la plus simple, ça remplace en mieux le programme que j'avais mis ci-dessus.

Pour l'installer, regarde ici : http://www.locoduino.org/spip.php?article71

Sans aller chercher dans le détails, la bibliothèque offre de nombreuses possibilités, il y a, pour chaque bouton, une fonction scan() à appeler et ensuite la fonction uniquePress() qui renvoie un booléen true si le bouton a été pressé.
Concernant le raccordement du bouton, le plus pratique est de le raccorder entre la broche et la masse et d'activer le pull-up sur la broche. C'est la façon de faire supposée par la bibliothèque par défaut.

Ça simplifie énormément l'écriture. Voici un exemple avec 2 boutons :
#include <Button.h>

/*
 * Deux boutons, b1 et b2. Le premier est sur la broche 5. Le second
 * sur la broche 6.
 * ils sont tous les deux en PULLUP (non pressé = HIGH). Quand le
 * bouton est pressé, la broche est LOW.
 */
Button b1(5);
Button b2(4);

/*
 * 2 LED sur les broches 6 et 7. Anode au 5V via une résistance de 330 ohms
 * cathode sur la broche de l'Arduino. Pour allumer la LED il faut donc
 * que la broche soit LOW.
 */
const byte pinLED1 = 7;
const byte pinLED2 = 6;

/*
 * Etat initial : LEDs éteintes
 */
byte etatLED1 = HIGH;
byte etatLED2 = HIGH;

void setup()
{
  pinMode(pinLED1, OUTPUT);
  pinMode(pinLED2, OUTPUT);
  
  digitalWrite(pinLED1, etatLED1);
  digitalWrite(pinLED2, etatLED2);
}

void loop()
{
  b1.scan();
  b2.scan();
  if (b1.uniquePress()) {
    etatLED1 = !etatLED1;
  }
  if (b2.uniquePress()) {
    etatLED2 = !etatLED2;
  }
  digitalWrite(pinLED1, etatLED1);
  digitalWrite(pinLED2, etatLED2);
}

Répondre