INPUT_PULLUP ou pas?

Bonjour à tous je souhaite monter dans le cadre d'un jeu type "escape room" un système avec des interrupteur reed (ILS) je me demande l'intérêt de les monter d'un façon ou de l'autre??? (voir schéma)

de même, alors qu'ils sont espacer d'environ 10cm et sous une plaque de bois, quand je touche avec un aimant le N°1, le N°2 fonctionne aussi alors que si je descend d'1cm, il n'y a plus de contact avec le N°1 et les deux ce coupent. Est-ce du justement a ce montage en INPUT_PULLUP?

un petit bout de code :

void setup()
{

//LEDs
#define led1 A4
#define led2 2
#define led3 3
#define led4 4
#define led5 5

//ILS
#define ils1 6
#define ils2 7
#define ils3 8
#define ils4 9
#define ils5 10

// définition des modes

pinMode(ils1, INPUT_PULLUP);
pinMode(ils2, INPUT_PULLUP);
pinMode(ils3, INPUT_PULLUP);
pinMode(ils4, INPUT_PULLUP);
pinMode(ils5, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}


void loop()
{

// LIVRES

int livre1 = digitalRead(ils1);
if(livre1==LOW)
{
digitalWrite(led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}

int livre2 = digitalRead(ils2);
if(livre2==LOW)
{
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW);
}

Salut,

Si tu utilises la résistance de tirage interne (INPUT_PULLUP) pas besoin de mettre une résistance externe sur les ILS, c'est soit externe soit interne, par contre si usage de INPUT_PULLUP, la logique devient inverse , si ILS ouvert etat logique 1 en entrée et inversement.

@+

Et information suplémentaire la valeur des résistances pull-up internes du micro font entre 30 k et 70k selon le lot de fabrication.

J'ai 3 boutons et 5 ILS en INPUT_PULLUP c'est pas trop? est-ce possible que mon problème de "je mets l'aimant en ils1 et LED1 et LED2 s'allume" vienne de là?

tu as quelle distance entre les differents ILS, car si il sont trop proche il n'y a pas risque que l'aimant puisse argir deux 2 ILS ?

@+

minimum 10cm entre chaque, au multimètre y a pas de soucis...c'est ça que pige pas.

Dans ton code rajoute des serial.println, afin d'afficher dans la console serie, l'etat des ILS , voir le code ci-dessous

void setup()
{
Serial.begin(9600);
//LEDs
#define led1 A4
#define led2 2
#define led3 3
#define led4 4
#define led5 5

//ILS
#define ils1 6
#define ils2 7
#define ils3 8
#define ils4 9
#define ils5 10

// définition des modes

pinMode(ils1, INPUT_PULLUP);
pinMode(ils2, INPUT_PULLUP);
pinMode(ils3, INPUT_PULLUP);
pinMode(ils4, INPUT_PULLUP);
pinMode(ils5, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}


void loop()
{

// LIVRES

int livre1 = digitalRead(ils1);
Serial.println(livre1);

if(livre1==LOW)
{
digitalWrite(led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}

int livre2 = digitalRead(ils2);
if(livre2==LOW)
{
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW);
}

Est-ce que tu gère les rebonds ?

hello
les connexions des leds 1 et 2 qui se touchent? soudure qui bave?
peux tu tester ce prg qui va tester tes leds

//LEDs
#define led1 A4
#define led2 2
#define led3 3
#define led4 4
#define led5 5

//ILS
#define ils1 6
#define ils2 7
#define ils3 8
#define ils4 9
#define ils5 10

// définition des modes
void setup()
{
pinMode(ils1, INPUT_PULLUP);
pinMode(ils2, INPUT_PULLUP);
pinMode(ils3, INPUT_PULLUP);
pinMode(ils4, INPUT_PULLUP);
pinMode(ils5, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}


void loop()
{
  digitalWrite(A4, HIGH);
  delay(1000);
for (int f=2;f<6;f++){
  digitalWrite(f, HIGH);
  delay(1000);
  }
  digitalWrite(A4, LOW);
  delay(1000);
for (int f=2;f<6;f++){
  digitalWrite(f, LOW);
  delay(1000);
  }
  delay(1000);
}

puis si c'est ok, peux tu tester celui ci avec les aimants

//LEDs
#define led1 A4
#define led2 2
#define led3 3
#define led4 4
#define led5 5

//ILS
#define ils1 6
#define ils2 7
#define ils3 8
#define ils4 9
#define ils5 10

// définition des modes
void setup()
{

pinMode(ils1, INPUT_PULLUP);
pinMode(ils2, INPUT_PULLUP);
pinMode(ils3, INPUT_PULLUP);
pinMode(ils4, INPUT_PULLUP);
pinMode(ils5, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}


void loop()
{

// LIVRES

int livre1 = digitalRead(ils1);
if(livre1==LOW)
{
digitalWrite(led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}

int livre2 = digitalRead(ils2);
if(livre2==LOW)
{
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW);
}}

68tjs:
Est-ce que tu gère les rebonds ?

Surement non, dans le monde Arduino les interrupteurs passent de 1 à 0 en 2ns et sans rebonds :slight_smile:

Bonjour,

désolé j'étais en WE avec ma moitié :wink:

@-Standby : non je gère pas...j'ai entendu parlé mais je ne me suis pas encore renseigner sur ce que c'est et donc comment gérer le problème (si problème il y a).

@dfgh : le premier passe sans broncher quand je passe le second...c'est misère...même les trois boutons qui fonctionnaient bien deconne (je dois appuyer plusieurs secondes pour lancer un compteur qui partait directement avant le montage des DEL et des ILS.

Dans tout les cas, merci de vous intéresser a mon cas :wink:

le 1er code allume et eteinds bien les leds ?

le 2 ème est le même que le tien a part que j'ai sorti les #define du setup.

par contre tu parles d'un compteur que je ne voie pas dans ton code. nous parlons bien du même code ??

Oui oui c'est le même code...le premier fait bien un truc genre chenillard. j'avais pas parler de la partie compteur (car ça marche bien). et je ne pensais pas que ça pouvait avoir une influence.

#include <TimerOne.h>
#include "TM1637.h"
#define ON 1
#define OFF 0
#define hhmm 1 
#define addtime 300 //ajout 5 min

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 2;
unsigned char second = 00;
unsigned char _second = 0;
unsigned char minute = 20;
unsigned char _minute = 0;
unsigned char hour = 12;
boolean Flag_ReadTime;
unsigned int temps = 1200; //minutes en secondes à décompter
int b_start;
boolean etat_start; //Etat
int b_pause;
boolean etat_pause;
int b_reset;
boolean etat_reset;
int b_addtime;
boolean etat_addtime;


#define CLK A1
#define DIO A0
TM1637 tm1637(CLK,DIO);

void setup()
{
Serial.begin(9600);
tm1637.set(2);
tm1637.init();
tm1637.point(POINT_ON);


Timer1.initialize(500000); 
Timer1.attachInterrupt(TimingISR); 
Serial.println("Please send command to control the stopwatch:");
Serial.println("S - start");
Serial.println("P - pause");
Serial.println("R - reset");
Serial.println("A - Addtime");
stopwatchPause();

// Boutons
b_addtime = 13;
etat_addtime = 0;
b_start = 11;
etat_start = 0;
b_pause = A3;
etat_pause = 0;
b_reset = 12;
etat_reset = 0;

//LEDs
#define led1 A4
#define led2 2
#define led3 3
#define led4 4
#define led5 5

//ILS
#define ils1 6
#define ils2 7
#define ils3 8
#define ils4 9
#define ils5 10

//BUZZER
#define buzzer A2


// définition des modes
pinMode(b_start, INPUT_PULLUP);
pinMode(b_pause, INPUT_PULLUP);
pinMode(b_reset, INPUT_PULLUP);
pinMode(b_addtime, INPUT_PULLUP);
pinMode(ils1, INPUT_PULLUP);
pinMode(ils2, INPUT_PULLUP);
pinMode(ils3, INPUT_PULLUP);
pinMode(ils4, INPUT_PULLUP);
pinMode(ils5, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(buzzer, OUTPUT);
}


void loop()
{

// LIVRES

int livre1 = digitalRead(ils1);
if(livre1==LOW)
{
digitalWrite(led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}

int livre2 = digitalRead(ils2);
if(livre2==LOW)
{
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW);
}

// Déclenchement chrono/pause/reset/addtime

int etat_start = digitalRead(b_start);
    if(etat_start == LOW)
    {
        stopwatchStart();
    }

etat_pause = digitalRead(b_pause);
    if(etat_pause == LOW)
    {
        stopwatchPause();
    }

etat_reset = digitalRead(b_reset);
    if(etat_reset == LOW)
    {
        stopwatchReset();
    }

etat_addtime = digitalRead(b_addtime);
    if(etat_addtime == LOW)
    {
        stopwatchAddtime();
    }

  //Commande chrono
char command;
command = Serial.read();

switch(command)
{
case 'S':stopwatchStart();Serial.println("Start timing...");break;
case 'P':stopwatchPause();Serial.println("Stopwatch was paused");break;
case 'R':stopwatchReset();Serial.println("Stopwatch was reset");break;
case 'A':stopwatchAddtime();Serial.println("Stopwatch add 5 second");break;
//default:break;
}
if(Update == ON)
{
TimeUpdate();
tm1637.display(TimeDisp);
}
}
void TimingISR()
{
  halfsecond --;
  Update = ON;
  if (halfsecond <= 0)
  {
    temps = max(temps-1,0);
    second  = temps%60;
    minute = temps/60;
    halfsecond = 2;
  }
  
//Serial.println(minute);
      ClockPoint = (~ClockPoint) & 0x01;
      if(Flag_ReadTime == 0)
    {
      _second = second;
      _minute = minute;
    }
  }



void TimeUpdate(void)
{
if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF); //OFF Pour clignotement
if (hhmm==0)
{
TimeDisp[0] = hour / 10; //Affichage hh:mm
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
}
else
{
//Affichage mm:ss
TimeDisp[0] = minute / 10; //Affichage hh:mm
TimeDisp[1] = minute % 10;
TimeDisp[2] = second / 10;
TimeDisp[3] = second % 10;
}
Update = OFF;
}

void stopwatchStart()//timer1 on
{
Flag_ReadTime = 0;
TCCR1B |= Timer1.clockSelectBits;
}

void stopwatchPause()//timer1 off if [CS12 CS11 CS10] is [0 0 0].
{
TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));
}


void stopwatchReset()
{
stopwatchPause();
Flag_ReadTime = 0;
_second = 0;
_minute = 0;
second = 00;
minute = 20;
temps = 1200;
Update = ON;
}

void stopwatchAddtime()
{
temps = temps + addtime;
delay(200);
Serial.println(temps);
}

Gérer les rebonds est indispensable.
Si tu ne les gères pas quand tu fermes un contact tu crois envoyer un seul signal en réalité comme le métal est élastique il va y avoir des rebonds et tu peux envoyer une dizaine d'information de fermeture qui seront prise en compte par le micro.

Il existe deux moyens pour les gérer :

  1. matériellement en ajoutant un condensateur en parrallèle sur les contacts (100nF céramique).
  2. en faisant un traitement par programation.

hello
chez moi, ce code fonctionne

en 1er le start, puis ils 1 ou ils 2

#include <TimerOne.h>
#include "TM1637.h"
#define ON   1
#define OFF  0
#define hhmm 1 
#define addtime 300 //ajout 5 min

#define led2        2
#define led3        3
#define led4        4
#define led5        5
#define ils1        6
#define ils2        7
#define ils3        8
#define ils4        9
#define ils5       10
#define BP_start   11
#define BP_reset   12
#define BP_addtime 13
#define DIO        15//A1
#define CLK        16//A2
#define buzzer     17//A3
#define b_pause    18//A4
#define led1       19//A5
TM1637 tm1637(CLK,DIO);//14 15

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char Update;
unsigned char ClockPoint =  1;
unsigned char halfsecond =  2;
unsigned char second     =  0;
unsigned char _second    =  0;
unsigned char minute     = 20;
unsigned char _minute    =  0;
unsigned char hour       = 12;
unsigned int temps       = 1200; //minutes en secondes à décompter
boolean Flag_ReadTime;

void setup()
{
Serial.begin(115200);//9600
tm1637.set(2);
tm1637.init();
tm1637.point(POINT_ON);

Timer1.initialize(500000); 
Timer1.attachInterrupt(TimingISR); 
Serial.println("Please send command to control the stopwatch:");
Serial.println("S - start");
Serial.println("P - pause");
Serial.println("R - reset");
Serial.println("A - Addtime");
stopwatchPause();

for(int f=2;f<= 5;f++){pinMode(f,OUTPUT); }      //leds
for(int f=6;f<=13;f++){pinMode(f,INPUT_PULLUP); }//ils et BP
pinMode(buzzer,     OUTPUT);                     //16
pinMode(b_pause,    INPUT_PULLUP);               //17
pinMode(led1,       OUTPUT);                     //18
}


void loop()
{
if(!digitalRead(ils1)){digitalWrite(led1, ON);Serial.println("led1 allumee");}else{digitalWrite(led1, OFF);} 
if(!digitalRead(ils2)){digitalWrite(led2, ON);Serial.println("led2 allumee");}else{digitalWrite(led2, OFF);}
if(!digitalRead(ils3)){digitalWrite(led3, ON);Serial.println("led3 allumee");}else{digitalWrite(led3, OFF);} 
if(!digitalRead(ils4)){digitalWrite(led4, ON);Serial.println("led4 allumee");}else{digitalWrite(led4, OFF);}
if(!digitalRead(ils5)){digitalWrite(led5, ON);Serial.println("led5 allumee");}else{digitalWrite(led5, OFF);}
// Déclenchement chrono/pause/reset/addtime
if(!digitalRead(BP_start))  {stopwatchStart();}
if(!digitalRead(b_pause))   {stopwatchPause();}
if(!digitalRead(BP_reset))  {stopwatchReset();}
if(!digitalRead(BP_addtime)){stopwatchAddtime();}

  //Commande chrono
char command;
command = Serial.read();

switch(command)
{
case 'S':stopwatchStart();  Serial.println("Start timing...");       break;
case 'P':stopwatchPause();  Serial.println("Stopwatch was paused");  break;
case 'R':stopwatchReset();  Serial.println("Stopwatch was reset");   break;
case 'A':stopwatchAddtime();Serial.println("Stopwatch add 5 second");break;
//default:break;
}
if(Update == ON)
{
TimeUpdate();
tm1637.display(TimeDisp);
}
}



void stopwatchStart()//timer1 on
{Flag_ReadTime = 0;TCCR1B |= Timer1.clockSelectBits;
  }

void stopwatchPause()//timer1 off if [CS12 CS11 CS10] is [0 0 0].
{TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));}


void stopwatchReset()
{stopwatchPause();Flag_ReadTime = 0;_second = 0;_minute = 0;
second = 00;minute = 20;temps = 1200;Update = ON;}

void stopwatchAddtime()
{temps = temps + addtime;delay(200);Serial.println(temps);}

void TimingISR()
{
  halfsecond --;
  Update = ON;
  if (halfsecond <= 0)
  {
    temps = max(temps-1,0);
    second  = temps%60;
    minute = temps/60;
    halfsecond = 2;
  }
  
//Serial.println(minute);
      ClockPoint = (~ClockPoint) & 0x01;
      if(Flag_ReadTime == 0)
    {
      _second = second;
      _minute = minute;
    }
}
void TimeUpdate(void)
{
if(ClockPoint){tm1637.point(POINT_ON);}else{tm1637.point(POINT_OFF);} //OFF Pour clignotement
if (hhmm==0)
{
TimeDisp[0] = hour / 10; //Affichage hh:mm
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
}
else
{
//Affichage mm:ss
TimeDisp[0] = minute / 10; //Affichage hh:mm
TimeDisp[1] = minute % 10;
TimeDisp[2] = second / 10;
TimeDisp[3] = second % 10;
}
Update = OFF;
}

j'ai mis des résistances de 10k sur les ILS et ça roule maintenant :wink: merci