Go Down

Topic: INPUT_PULLUP ou pas? (Read 938 times) previous topic - next topic

emorej

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 :

Code: [Select]
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);
}

hameau

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.

@+

68tjs

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.

emorej

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à?

hameau

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 ?

@+


emorej

#5
Jul 05, 2018, 06:18 pm Last Edit: Jul 05, 2018, 06:19 pm by emorej
minimum 10cm entre chaque, au multimètre y a pas de soucis...c'est ça que pige pas.


hameau

#6
Jul 05, 2018, 06:43 pm Last Edit: Jul 05, 2018, 06:45 pm by hameau
Dans ton code rajoute des serial.println, afin d'afficher dans la console serie, l'etat des ILS , voir le code ci-dessous


Code: [Select]
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);
}



68tjs

Est-ce que tu gère les rebonds ?

dfgh

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

//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
Code: [Select]
//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);
}}

-Standby

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  :)
The Mind is like a parachute it works best when opened.

emorej

Bonjour,

désolé j'étais en WE avec ma moitié ;-)

@-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 ;-)

dfgh

#11
Jul 08, 2018, 08:58 pm Last Edit: Jul 08, 2018, 08:59 pm by dfgh
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 ??

emorej

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.
Code: [Select]
#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);
}

68tjs

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.


dfgh

hello
chez moi, ce code fonctionne

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

Code: [Select]
#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;
}

Go Up