Je suis en train de mettre au point un système d'alarme, mais j'ai un gros problème avec la partie du code, je m'explique : Une fois qu'il y a eu détection par un module infrarouge, un buzzer "bip" pendant 3 secondes, ce qui indique qu'il faut entrer un code pour désactiver l'alarme. Mais voilà, j'ai décidé que pour entrer mon code, j'allais utiliser 4 boutons-poussoirs, correspondant à des chiffres de 1 à 4 pour réaliser une combinaison de 4 chiffres qui désactivera l'alarme si il correspond au nombre voulu. Mon problème est donc que je n'ai absolument aucune idée de comment récupérer l'appui des boutons l'un après l'autre, pour affecter la valeur correspondante au bouton appuyé aux variables 'a' 'b' 'c' 'd', 'a' pour le premier appui, 'b' pour le second etc... et enregistrer le tout dans une variable "code" qui me permettra de faire la comparaison.
Nouvelle question : Qu'est ce qui te bloque vraiment ? Arrives tu à faire une lecture d'une entrée numérique ? Si oui, moi je verrais bien une machine à état qui permetterait de facilement décomposé/imposé la séquence
Ce qui me bloque, c'est comment réaliser ce code à 4 chiffres. Je récupère l'appui du bouton avec digitalRead(), ensuite si c'est le bouton 1, j'affecte le chiffre 1 à la variable 'a'. Comme le code est l'ensemble des variables 'a','b','c', et 'd', je voudrais savoir comment stocker la valeur 'a' pour ensuite passer à la 'b' et ainsi de suite. Je ne sais pas si c'est très clair...
void loop()
{
distance = analogRead(capteur);
Serial.println(distance);
if (distance > 200)
{
easyvr.playSound(5, EasyVR::VOL_FULL);
}
delay (5000);
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH)
{
a = 1;
}
else if (bouton2 == HIGH)
{
a = 2;
}
else if (bouton3 == HIGH)
{
a = 3;
}
else if (bouton4 == HIGH)
{
a = 4;
}
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH)
{
b = 1;
}
else if (bouton2 == HIGH)
{
b = 2;
}
else if (bouton3 == HIGH)
{
b = 3;
}
else if (bouton4 == HIGH)
{
b = 4;
}
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH)
{
c = 1;
}
else if (bouton2 == HIGH)
{
c = 2;
}
else if (bouton3 == HIGH)
{
c = 3;
}
else if (bouton4 == HIGH)
{
c = 4;
}
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH)
{
d = 1;
}
else if (bouton2 == HIGH)
{
d = 2;
}
else if (bouton3 == HIGH)
{
d = 3;
}
else if (bouton4 == HIGH)
{
d = 4;
}
if (a == 1 && b == 2 && c == 3 && d == 4) // si le code est "1234"
{
// le code est bon, allumge d'une LED témoin.
}
else {
// activation de l'alarme
}
Voilà pour que ce soit plus clair, le code représentatif de ce que je souhaiterais faire, et j'ai l'impression qu'il manque quelque chose.
Voici exactement ton code, reformaté, il prend déjà beaucoup moins de place (de 102 à 55 lignes). Autant de code pour une tâche si simple est inutile, obstructif. Pense aux fonctions! Tu fais 4 fois exactement la même chose, c'est juste une histoire de valeurs de variables.
void loop()
{
distance = analogRead(capteur);
Serial.println(distance);
if (distance > 200) easyvr.playSound(5, EasyVR::VOL_FULL);
delay (5000);
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH) a = 1;
else if (bouton2 == HIGH) a = 2;
else if (bouton3 == HIGH) a = 3;
else if (bouton4 == HIGH) a = 4;
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH) b = 1;
else if (bouton2 == HIGH) b = 2;
else if (bouton3 == HIGH) b = 3;
else if (bouton4 == HIGH) b = 4;
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH) c = 1;
else if (bouton2 == HIGH) c = 2;
else if (bouton3 == HIGH) c = 3;
else if (bouton4 == HIGH) c = 4;
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH) d = 1;
else if (bouton2 == HIGH) d = 2;
else if (bouton3 == HIGH) d = 3;
else if (bouton4 == HIGH) d = 4;
if (a == 1 && b == 2 && c == 3 && d == 4) {
// le code est bon, allumge d'une LED témoin.
}
else {
// activation de l'alarme
}
}
EDIT: Je ne me souviens plus bien mais je ne suis pas sûr que tu peut lire un pin comme ça, sans boucle. Je ne voudrais pas dire de bêtises.
int read_value() {
int digit;
// ici declare les pins de tes 4 boutons
digitalRead(bouton1);
digitalRead(bouton2);
digitalRead(bouton3);
digitalRead(bouton4);
if (bouton1 == HIGH) digit = 1;
else if (bouton2 == HIGH) digit = 2;
else if (bouton3 == HIGH) digit = 3;
else if (bouton4 == HIGH) digit = 4;
return digit
}
void loop()
{
distance = analogRead(capteur);
Serial.println(distance);
if (distance > 200) easyvr.playSound(5, EasyVR::VOL_FULL);
delay (5000);
a=read_value();
b=read_value();
c=read_value();
d=read_value();
if (a == 1 && b == 2 && c == 3 && d == 4) {
// le code est bon, allumge d'une LED témoin.
}
else {
// activation de l'alarme
}
}
Tiens, j'ai récupéré pas mal de trucs ces derniers temps, dont des boutons poussoirs, alors je me suis dit que j'allais faire un petit truc à code comme toi. Ici c'est très simple, c'est avec 2 boutons. En admettant:
a = bouton de gauche
b = bouton de droite
Le code a tapé est:
abb
A chaque pression de bouton, la led pin 13 t'indique si tu as bon en fonction de son clignotement. Si tu as tout bon, la led s'allume.
Mais attention, tu n'as que 1 seconde et demie par pression, sinon, tout se reset. Faut être rapide! J'espère que cela t'aidera, tiens nous au courant!
Voilà, le code, assez simple (j'ai pas commenté c'est pas bien. Mais c'est vraiment facile... J'éditerais si besoin):
const int a = 7;
const int b = 6;
const int c = 5;
int stateA = 0;
int stateB=0;
int stateC=0;
int correct=0;
void check(int stage) {
int counter=0;
int beat=0;
correct=stage;
if (stage==1) beat=500;
else if (stage==2) beat=100;
while (counter<3) {
digitalWrite(13, HIGH);
delay(beat);
digitalWrite(13, LOW);
delay(beat);
counter=counter+1;
}
}
void setup() {
pinMode(a, INPUT);
pinMode(b, INPUT);
pinMode(c, INPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop(){
stateA = digitalRead(a);
stateB = digitalRead(b);
if (correct==0 && stateA==HIGH) check(1);
else if (correct==1 && stateB==HIGH) check(2);
else if (correct==2 && stateB==HIGH) digitalWrite(13, HIGH);
else correct=0;
delay(1500);
}
const int a = 7;
const int b = 6;
const int c = 5;
int stateA = 0;
int stateB=0;
int stateC=0;
int correct=0;
void check(int stage, int beat) {
correct=stage;
int pitch=beat;
int counter=0;
while (counter<3) {
digitalWrite(13, HIGH);
delay(beat);
digitalWrite(13, LOW);
delay(beat);
counter=counter+1;
}
}
void setup() {
pinMode(a, INPUT);
pinMode(b, INPUT);
pinMode(c, INPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop(){
stateA = digitalRead(a);
stateB = digitalRead(b);
stateC = digitalRead(c);
if (correct==0 && stateC==HIGH) check(1, 500);
else if (correct==1 && stateA==HIGH) check(2, 300);
else if (correct==2 && stateB==HIGH) check(3, 150);
else if (correct==3 && stateB==HIGH) check(4, 50);
else if (correct==4 && stateA==HIGH) digitalWrite(13, HIGH);
else correct=0;
delay(1500);
}
Qu'est-ce qui ne va pas avec ça?
Code à poussoirs avec Arduino
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !