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);
}
hameau
July 5, 2018, 10:13am
2
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
July 5, 2018, 11:15am
3
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);
}
68tjs
July 5, 2018, 4:52pm
8
Est-ce que tu gère les rebonds ?
dfgh
July 5, 2018, 4:56pm
9
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
emorej
July 8, 2018, 4:08pm
11
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
July 8, 2018, 6:58pm
12
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
July 9, 2018, 7:23am
13
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);
}
68tjs
July 9, 2018, 1:10pm
14
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 :
matériellement en ajoutant un condensateur en parrallèle sur les contacts (100nF céramique).
en faisant un traitement par programation.
dfgh
July 10, 2018, 11:59am
15
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;
}
emorej
July 11, 2018, 5:00pm
16
j'ai mis des résistances de 10k sur les ILS et ça roule maintenant merci