Problème de codage

Bonjours, je n'arrive pas faire fonctionner complétement mon programme, j'aimerais bien avoir l'aide de quelqu'un. Merci d'avance

Voici ce que je veux faire:

Si capteur de lumière est de moins de 200
Alors
Si bouton 1 pressé?
Alors
Mettre l'état de la broche sur haut (car module relais et le courant doit passer)
Attendre 5 seconde
Mettre l'état de la broche sur bas (car le courant ne doit pas passer)
Sinon
Si bouton 2 pressé?
Alors
Mettre l'état de la broche sur haut (car module relais et le courant doit passer)
Attendre 5 seconde
Mettre l'état de la broche sur bas (car le courant ne doit pas passer)
Sinon
Si bouton 3 pressé?
Alors
Mettre l'état de la broche sur haut (car module relais et le courant doit passer)
Attendre 5 seconde
Mettre l'état de la broche sur bas (car le courant ne doit pas passer)

Et voici mon programme:

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;

void setup(){
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(A0+2,INPUT);
    pinMode(2,INPUT);
    pinMode(3,INPUT);
    pinMode(4,INPUT);
    digitalWrite(8,0);
    digitalWrite(9,0);
    digitalWrite(10,0);
}

void loop(){
    if((analogRead(A0+2)) < (200)){
        if(((digitalRead(2))==(1))){
            digitalWrite(8,1);
            _delay(5);
            digitalWrite(8,0);
        }else{
            if(((digitalRead(3))==(1))){
                digitalWrite(9,1);
                _delay(5);
                digitalWrite(9,0);
            }else{
                if(((digitalRead(4))==(1))){
                    digitalWrite(10,1);
                    _delay(5);
                    digitalWrite(10,0);
                }
            }
        }
    }
    _loop();
}

void _delay(float seconds){
    long endTime = millis() + seconds * 1000;
    while(millis() < endTime)_loop();
}

void _loop(){
}
       

Merci si quelqu'un arrive à régler mon problème.

PS: voici la photo de mon shéma:

ce post est une catastrophe...

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

:warning: La rédaction de votre message ne répond pas aux critères attendus. Il n'aura sans doute pas de réponse tant que vous n'aurez pas pris en compte et mis en application les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Merci d'éditer votre post pour rajouter les balises de de code, c'est quasiment illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Quel problème?
Décrit ce qui ne va pas.

je n'arrive pas faire fonctionner complétement mon programme, entre les interrupteurs et les modules relais, l'information se perd.

tu penses que qqun va pouvoir t'aider si tu ne fais pas l'effort de décrire en détail ce qui ne va pas ?

et si vous ne faites pas l'effort non plus de remettre en forme correctement le premier message ➜ cliquez le petit crayon en dessous de votre message et ajoutez au moins les balises de code correctes (trois backtick ``` )

Bonjour poupou_3

La première chose "visible" est que tu utilises, pour tes boutons, le mode PULL_DOWN, c'est à dire que tu vas lire un 1 quand le bouton est pressé. Or pour ce mode de fonctionnement, il faut des résistances de PULL_DOWN d'environ 10k ohm.
Mais il y a plus simple à faire, c'est l'utilisation du mode PULL_UP, pour ça, la plus part du temps, il n'est pas nécessaire de d'ajouter des résistances, les internes de l'Arduino suffisent.

Ces résistances sont activées par:
pinMode(boutonPoussoir1,INPUT_PULLUP);

et le bouton pressé est lu par
if(digitalRead(boutonPoussoir1) == 0)

et tes boutons poussoirs sont câblés au GND au lieu du +5V.

Cela dit, j'ai essayé ton programme avec des PULL_DOWN de 10k, il fonctionne très bien.

Il y a pas mal d'autres choses à dire sur ton programme, je préfère, si tu le désires, en faire une correction tout en t'expliquant le pourquoi du comment.

A+
Cordialement
jpbbricole

Pour encadrer le code ce n'est pas 3 apostrophes, mais 3 backticks <ALT GR>+7. J'ai fait la correction.


Pourquoi réinventer delay()??


Pourquoi cette déclaration tordue pinMode(A0+2,INPUT); autant utiliser directement A2


Cette ligne
if(((digitalRead(2))==(1))){
devrait être écrite
if(digitalRead(2) == HIGH){
car digitalRead() retourne HIGH ou LOW


Cette ligne
while(millis() < endTime)_loop();
s'écrit
while(millis() < endTime);


Cette fonction est inutile
void _loop(){
}


C'est une bonne pratique de nommer les signaux.
Au lieu d'écrire
pinMode(2,INPUT);
Il vaut mieux déclarer en tête du programme
const byte BOUTON1 = 2;
et ainsi ensuite tu écris
pinMode(BOUTON1, INPUT);
ou
if(digitalRead(BOUTON1) == HIGH)
Cela permet de savoir de quoi on parle


Autrement, pour savoir ce qu'il se passe, il faudrait faire afficher les valeurs retournées par analogRead() et les digitalRead() pour comprendre pourquoi le fonctionnement n'est pas correct.

D'après le schéma, les boutons sont des inverseurs qui reçoivent +5V et GND et qui retournent l'une ou l'autre des tensions.

Bonjour fdufnews

Oui, mais dans le programme:

if(((digitalRead(2))==(1)))

J'en déduis qu'il est en mode PULL_DOWN.
J'ai testé son programme en mettant ces résistances (PULL_DOWN) et il fonctionne.

Cordialement
jpbbricole

Ce que je veux dire, c'est qu'il y a erreur sur la terminologie, il n'y a ni pull up, ni pull down.
@poupou_3 considère simplement que le signal est actif au niveau haut.

Bonjour, le programme fonctionne mieux, merci

Bonjour fdufnews

Il n'y a pas erreur sur la terminologie, il n'y a ni PULL_UP et ni PULL_DOWN comme je l'ai signalé, c'est là qu'est le problème, bien sûre @poupou_3 lit que le niveau haut, mais en l'absence d'un signal comme un commutateur "entre deux" ou un bouton "ouvert" que lit on sur une pin initialisée par avec pinMode(2,INPUT); ?

Cordialement
jpbbricole

1 Like

pas si c'est un inverseur avec une référence (GND ou 5V) ➜ il y a toujours une tension de définie

Si ce n'est pas le cas et que la pin peut flotter, en effet il faut un pullup ou pulldown

1 Like

Il n'y a pas de bouton ouvert. Sur le schéma le +5V ET le GND arrivent sur les extrémités des inverseurs qui retournent donc soit +5V soit GND et s'il y a des rebonds c'est transitoire donc ça se filtre (et de toutes les façons, cela ne dure pas 5 secondes).
Maintenant peut-être qu'il y a un problème de câblage (fil coupé, poussoirs câblés à l'envers, ...) ou de breadboard.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.