PADLOCK avec arduino+10 switch

Bonjour tout le petit monde ca va bien? :sunglasses:
alors aujourd'hui le but est de trouver ce qu'il y a(ou a pas) dans mon code pour que mon systeme fonctionne. Ca fait qd meme un ptit moment que je buche dessus et comme personne en a fait de comme ca a ce que j'ai vu eh bien c'est aps trop évident. :-/

Il s'agit d'utiliser arduino pour déverrouiller (envoyer un signal a un relais 5v) suite a l'entrée d'une bonne combinaison de 6 chiffres (dans le présent programme c'est 6-6-6-6-6-6).

La circuiterie fonctionne entierement (merci Mr bisson! ;D) mais le probleme réside dans le code

voila le monstre! (certains trucs sont inutiles mais sont présente pr le débuggage)

HEHE

/*

  • Analyse analogue suivit de calcul logique pour détermienr la touche pressée.
    */
    int nba ; //nb actif
    int swt = 5; // Ligne des commutateurs
    int val ; //Valeur lue sur la ligne de commutateurs
    int nb0 = 12 ; //Lumiere pour le nombre 0
    int nb1 = 13 ; //Lumiere pour le nombre 1
    int nb2 = 2 ; //Lumiere pour le nombre 2
    int nb3 = 3 ; //Lumiere pour le nombre 3
    int nb4 = 4 ; //Lumiere pour le nombre 4
    int nb5 = 5 ; //Lumiere pour le nombre 5
    int nb6 = 6 ; //Lumiere pour le nombre 6
    int nb7 = 7 ; //Lumiere pour le nombre 7
    int nb8 = 8 ; //Lumiere pour le nombre 8
    int nb9 = 9 ; //Lumiere pour le nombre 9
    int LO = 10; //Lumiere pour systeme Verrouillé
    int UL = 11; //Lumiere pour systeme Déverrouillé
    int State =0; //état du verrou 1=ouvert 0=fermé
    byte C[7]; //variables du password.
    byte i=1 ; //définie la variable d'incrémentale

void setup() {
pinMode(swt, INPUT);
pinMode(nb0, OUTPUT);
pinMode(nb1, OUTPUT);
pinMode(nb2, OUTPUT);
pinMode(nb3, OUTPUT);
pinMode(nb4, OUTPUT);
pinMode(nb5, OUTPUT);
pinMode(nb6, OUTPUT);
pinMode(nb7, OUTPUT);
pinMode(nb8, OUTPUT);
pinMode(nb9, OUTPUT);
pinMode(LO, OUTPUT);
pinMode(UL, OUTPUT);
Serial.begin(9600);
digitalWrite(nb0,LOW);
digitalWrite(nb1,LOW);
digitalWrite(nb2,LOW);
digitalWrite(nb3,LOW);
digitalWrite(nb4,LOW);
digitalWrite(nb5,LOW);
digitalWrite(nb6,LOW);
digitalWrite(nb7,LOW);
digitalWrite(nb8,LOW);
digitalWrite(nb9,LOW);
}

void loop(){
if (i==7 &&C[1]==6&&C[2]==6&&C[3]==6&&C[4]==6&&C[5]==6&&C[6]==6);
State=1;
if (i==7 &&C[1]!=6||C[2]!=6||C[3]!=6||C[4]!=6||C[5]!=6||C[6]!=6);
{
i=1;
State=0;
}
if (State==0);
{
digitalWrite(UL,LOW);
digitalWrite(LO,HIGH);
}
if (State==1);
{
digitalWrite(UL,HIGH);
digitalWrite(LO,LOW);
}

val = analogRead(swt); // lit la valeur de la ligne des commutateurs et l'attribue a la variable val
{
if (val > 40); //vérifie si une touche est pressée
{
if (val > 40 && val < 143);
nba = 9;
if (val > 164 && val < 246);
nba = 8;
if (val > 266 && val < 348);
nba = 7;
if (val > 368 && val < 451);
(nba = 6);
if (val > 471 && val < 553);
(nba = 5);
if (val > 573 && val < 655);
(nba = 4);
if (val > 676 && val < 758);
(nba = 3);
if (val > 778 && val < 860);
(nba = 2);
if (val > 880 && val < 963);
(nba = 1);
if (val > 983 && val < 1024);
(nba = 0);
C*=nba;*

  • i=i+1;*
  • delay(500); *
  • }*
  • delay(10); *
  • }*
  • Serial.println(val);*
  • Serial.println(nba);*
    }
    Le probleme principal qui bloque le tout présentement c'est que la variable nba ne devient jamais qlque choz autre que 0 :cry:
    Donc qd je vérifie via le serial que mes différents voltages entre et sont convertits pr swt ca fonctionne sauf un ptit truc..
    Le truc étant que jarrive pas a faire 0 en entrée avec mon systeme de switch alors qun potentiometre lui peut.
    Jai 10 interupteurs qui recoivent tous un certains voltage (0,5 a 5 en incrément de 0,5 volt-->de la les marges pour lidentification) et qui le apssent au capteur 5 analog qui lui détermine quel interrupteur est actionné et store cette valeur incr.mente et ainsi de suite....quelqun peut bien me prendre par la main,réviser mon code et me dire comment le faire fonctionner?

Lut
J'ai l'impression qu'il y a des { } en trop, par exemple après le analogRead.
Sinon rajoute des ( ) dans les if pour séparer les conditions.

/*

  • Analyse analogue suivit de calcul logique pour détermienr la touche pressée.
    */
    int nba ; //nb actif
    int swt = 5; // Ligne des commutateurs
    int val ; //Valeur lue sur la ligne de commutateurs
    int nb0 = 12 ; //Lumiere pour le nombre 0
    int nb1 = 13 ; //Lumiere pour le nombre 1
    int nb2 = 2 ; //Lumiere pour le nombre 2
    int nb3 = 3 ; //Lumiere pour le nombre 3
    int nb4 = 4 ; //Lumiere pour le nombre 4
    int nb5 = 5 ; //Lumiere pour le nombre 5
    int nb6 = 6 ; //Lumiere pour le nombre 6
    int nb7 = 7 ; //Lumiere pour le nombre 7
    int nb8 = 8 ; //Lumiere pour le nombre 8
    int nb9 = 9 ; //Lumiere pour le nombre 9
    int LO = 10; //Lumiere pour systeme Verrouillé
    int UL = 11; //Lumiere pour systeme Déverrouillé
    int State =0; //état du verrou 1=ouvert 0=fermé
    byte C[7]; //variables du password.
    byte i=1 ; //définie la variable d'incrémentale

void setup() {
pinMode(swt, INPUT);
pinMode(nb0, OUTPUT);
pinMode(nb1, OUTPUT);
pinMode(nb2, OUTPUT);
pinMode(nb3, OUTPUT);
pinMode(nb4, OUTPUT);
pinMode(nb5, OUTPUT);
pinMode(nb6, OUTPUT);
pinMode(nb7, OUTPUT);
pinMode(nb8, OUTPUT);
pinMode(nb9, OUTPUT);
pinMode(LO, OUTPUT);
pinMode(UL, OUTPUT);
Serial.begin(9600);
digitalWrite(nb0,LOW);
digitalWrite(nb1,LOW);
digitalWrite(nb2,LOW);
digitalWrite(nb3,LOW);
digitalWrite(nb4,LOW);
digitalWrite(nb5,LOW);
digitalWrite(nb6,LOW);
digitalWrite(nb7,LOW);
digitalWrite(nb8,LOW);
digitalWrite(nb9,LOW);
}

void loop(){
if (i==7 &&C[1]==6&&C[2]==6&&C[3]==6&&C[4]==6&&C[5]==6&&C[6]==6);
State=1;
if (i==7 &&C[1]!=6||C[2]!=6||C[3]!=6||C[4]!=6||C[5]!=6||C[6]!=6);
{
i=1;
State=0;
}
if (State==0);
{
digitalWrite(UL,LOW);
digitalWrite(LO,HIGH);
}
if (State==1);
{
digitalWrite(UL,HIGH);
digitalWrite(LO,LOW);
}

val = analogRead(swt); // lit la valeur de la ligne des commutateurs et l'attribue a la variable val

if (val > 40); //vérifie si une touche est pressée
{
if (val > 40 && val < 143);
nba = 9;
if (val > 164 && val < 246);
nba = 8;
if (val > 266 && val < 348);
nba = 7;
if (val > 368 && val < 451);
(nba = 6);
if (val > 471 && val < 553);
(nba = 5);
if (val > 573 && val < 655);
(nba = 4);
if (val > 676 && val < 758);
(nba = 3);
if (val > 778 && val < 860);
(nba = 2);
if (val > 880 && val < 963);
(nba = 1);
if (val > 983 && val < 1024);
(nba = 0);
C*=nba;*

  • i=i+1;*
  • delay(500); *
  • }*
  • delay(10); *
  • Serial.println(val);*
  • Serial.println(nba);*
    }
    Arduino ne met plus d'erreur quand on enlève les { }

je n'avais aucune erreur de compilation mais plustot de programme,teste le si tu peut,la variable nba ne prend jamais une valeur déterminente,c'Est la le gros de mon probleme.Je vias essailler de fournir des pics et des schéma de mon actuelle conception.
merci pour ton aide,jvais tenter ce prog a linstant pour voir au cas ^^.--->meme probleme :cry: la variable nba ne veut jamais prendre la valeur autre que 0....:frowning:

et jai un autre ptit probleme,coté électronique celui la

qd je branche un potentiometre(gnd,5V,Signal) chui capable davoir un analog read a 0.Mes switch sont en dégradé de voltage en incrément de 0,5 volt et apres la 10e résistance je retourne ca au GND,lentrée est au positif,et chaque switch envoie un signal parfaitement ajusté a Ardui mais lorsque je nappui sur aucune touche je suis incapable d'obtenir la valeur 0 en entrée,comme qd le potentiometre est a 0....any suggestions?

Avec un petit schéma ça serait plus facile :wink:

voila un sch.ma pr les switch ^^..jme demande pk ca fait aps comme un potentiometre..:frowning: :stuck_out_tongue:

ton probleme c'est ca :

if (val > 40 && val < 143);
nba = 9;

il ne faut pas de ; a la fin du if...
ca s'ecrit comme ca :

if (val > 40 && val < 143)
nba = 9;

et encore mieux :

if (val > 40 && val < 143) {
nba = 9;
}

c'est valable pour tout ta serie de if...

oué merci ca a regler le probleme de l'assignation ^^

1 probleme reste: comment faire pour que la valeur lue soit 0(comme qd jai un potentiometre)

le 0 que tu cherches, c'est pour ta valeur nba ? ou pour la valeur lue sur l'entrée analogique ?
autrement dit :

est-ce le probleme c'est :
que tu n'arrives pas a avoir une valeur assez basse ? ( < 40)
ou une valeur assez haute ( > 983)

quand tu devrais avoir 0, tu as quoi en entrée analog ?
question code, je pense que c'est bon, surtout si ca marche avec un potentiometre, donc je chercherais plus au niveau de ton montage.

bonne chance.

Avec un potentiomètre tu as 0 sur l'entrée analogique car tu es relié à la masse. Ici avec ton système quand aucuns boutons n'est enfoncés, ton entrée est en l'air, elle n'a pas de potentiel déterminé.

ou jdoit rajouter un brin dfil pour que mon analog read me donne 0 comme avec un potentiometre?....
Peut-tu modifier le schéma electrique que jai fait pour me montrer? ca serais apprécié:P

un autre truc,jcroit pas que la variable C fonctionne..quelqun peut me montrer une autre facon d'assigner des valeurs pour éliminer le delais et pour qu'il ane détecte qu'une seule fois la touche presée.....j'aimerais un remaniement complet du code dans le genre:
si touche pressée-->C1=nba
Si touche relachée-->attendre
si touche pressée-->C2=nba
un truc dans le genre...pour éliminer le delais de 500 milis qui me poz probleme.merci !

Moi j'utiliserai un flag :

au depart, :
flag = 0;

lire la valeur analog

if (analog !=0) {
si (flag ==0) {
flag=1
enregistrer la valeur lue
}sinon {
ne rien faire, l'utilisateur n'a pas encore relaché le bouton.
}
}sinon {
flag = 0
}

en gros l'idée, c'est que tant qu'on a pas relaché le bouton, on ignore la valeur lue.
quand on relache le bouton, le flag est remis à 0, et on s'occupera de la prochaine valeur non nulle lue...

Skall t'es vrmnt d'une aide précieuse,mais comme le c c'est pas vrmnt mon fort..tu veut bien remanier mon programme? ::slight_smile:
mais ca regle toujours pas le probleme du potentiometre qui mdonne 0 et de mon paquet de switch..jai essailler de brancher un jumper a quelques endroits..ca a tout fait planter -_- any suggestion?

je dis peut être une grosse bétise mais ton mot de passe comporte 6 chiffres et tu en déclare 7

ouais mais ca c nécéssaire parceque jutilise pas le C0,seulement c1 pour le chiffre 1 et etc..plus simple a l'oeil.mais emrci dla remarke ^^ ;D

boolean keypressed=false;

void loop(){  
  if (i==7 &&C[1]==6&&C[2]==6&&C[3]==6&&C[4]==6&&C[5]==6&&C[6]==6);  
  State=1;  
  if (i==7 &&C[1]!=6||C[2]!=6||C[3]!=6||C[4]!=6||C[5]!=6||C[6]!=6);  
  {  
    i=1;  
    State=0;  
  }  
  if (State==0);  
  {  
    digitalWrite(UL,LOW);  
    digitalWrite(LO,HIGH);  
  }  
  if (State==1);  
  {  
    digitalWrite(UL,HIGH);  
    digitalWrite(LO,LOW);  
  }  
 
  val = analogRead(swt);    // lit la valeur de la ligne des commutateurs et l'attribue a la variable val  
   
    if (val > 40);   //vérifie si une touche est pressée  
    {
               keypressed=true;  
          if (val > 40 && val < 143) nba = 9;    
     if (val > 164 && val < 246) nba = 8;  
     if (val > 266 && val < 348) nba = 7;  
     if (val > 368 && val < 451) nba = 6; 
     if (val > 471 && val < 553) nba = 5;  
     if (val > 573 && val < 655) nba = 4;  
     if (val > 676 && val < 758) nba = 3;  
     if (val > 778 && val < 860) nba = 2;  
     if (val > 880 && val < 963) nba = 1;  
     if (val > 983 && val < 1024) nba = 0;      
    }else{
          if (keypressed) {
                C[i]=nba;  
                i=i+1;  
              }
          keypressed = false;
    }
  }
  delay(10);    
 
  Serial.println(val);  
  Serial.println(nba);  
}

voila la fonction loop modifiée...
l'idée, c'est que la valeur est prise en compte au moment ou on relache la touche, et non au moment ou on l'enfonce.
d'ailleurs, avec ton systeme, si j'appuie sur deux boutons en meme temps, il se passe quoi ?

il se passais que via un calcul de résistance il me donnais un chiffre entre...ex: 2 et 6 appuyées me donnais le chiffre 4
:stuck_out_tongue:

mais jai un probleme dordre physique...jpeut aps lire la valeur 0 avec mes branchemetns alors jvais tout simplement le demolir et fiare passer ca par 10 entrées digital...quel gachis.
merci pr le code!

Bon jme suis tanné et jai refait le circuit!!!
10 input(1 pr chaque interrupteur) plus 2 output--->diodes de sortie rouge et verte

le code:

int b1 = 11;
int b2 = 7;
int b3 = 10;
int b4 = 5;
int b5 = 9;
int b6 = 4;
int b7 = 8;
int b8 = 2;
int b9 = 3;
int b0 = 7;
int ledred = 12 ;
int ledgreen = 13 ;
int val;
int flag;
int c1 ;
int c2 ;
int c3 ;
int c4 ;
int c5 ;
int c6 ;

void setup()
{
Serial.begin(9600);
pinMode(b1,INPUT);
pinMode(b2,INPUT);
pinMode(b3,INPUT);
pinMode(b4,INPUT);
pinMode(b5,INPUT);
pinMode(b6,INPUT);
pinMode(b7,INPUT);
pinMode(b8,INPUT);
pinMode(b9,INPUT);
pinMode(b0,INPUT);
pinMode(ledred,OUTPUT);
pinMode(ledgreen,OUTPUT);
flag=0;
}

void loop()
{
if (digitalRead(b1)==HIGH)
val=1;
if (digitalRead(b2)==HIGH)
val=2;
if (digitalRead(b3)==HIGH)
val=3;
if (digitalRead(b4)==HIGH)
val=4;
if (digitalRead(b5)==HIGH)
val=5;
if (digitalRead(b6)==HIGH)
val=6;
if (digitalRead(b7)==HIGH)
val=7;
if (digitalRead(b8)==HIGH)
val=8;
if (digitalRead(b9)==HIGH)
val=9;
if (digitalRead(b0)==HIGH)
val=0;
if ((digitalRead(b1)==HIGH) || (digitalRead(b2)==HIGH) || (digitalRead(b3)==HIGH) || (digitalRead(b4)==HIGH) || (digitalRead(b5)==HIGH) || (digitalRead(b6)==HIGH) || digitalRead(b7)==HIGH || digitalRead(b8)==HIGH || digitalRead(b9)==HIGH || digitalRead(b0)==HIGH)
flag=flag++;
if (flag==1)
c1=val;
if (flag==2)
c2=val;
if (flag==3)
c3=val;
if (flag==4)
c4=val;
if (flag==5)
c5=val;
if (flag==6)
c6=val;
while((digitalRead(b1)==HIGH) || (digitalRead(b2)==HIGH) || (digitalRead(b3)==HIGH) || (digitalRead(b4)==HIGH) || (digitalRead(b5)==HIGH) || (digitalRead(b6)==HIGH) || digitalRead(b7)==HIGH || digitalRead(b8)==HIGH || digitalRead(b9)==HIGH || digitalRead(b0)==HIGH)
{
delay(10);
}
if (flag ==6 && c1==1 && c2==2 && c3==3 && c4==4 &&c5==5 && c6==6){ //vérifie le code si 6 touches sont pressées
digitalWrite(ledred,LOW);
digitalWrite(ledgreen,HIGH);
delay(5000) ;
}
else{
digitalWrite(ledred,HIGH);
digitalWrite(ledgreen,LOW);
}
if (flag>5)
{
flag=0;
}
}

le probleme: j'ai de la difficulté a concevoir comment faire attendre que l'on dépresse la touche pour enregistrer la valeur dans une variable et pour vérifier le tout...qlqun pourais refaire le code en m'indiquant les modifications apportés??
ce serais VRMNT apprécié :-/

tu sais qu'il existe une function pulseIn ?

http://www.arduino.cc/en/Reference/PulseIn

ca pourrait peut-etre t'aider ...

genre tu fais des pulseIn avec des timeout assez court... et des qu'un pulseIn renvoie !=0, hop, tu stockes que la touche correspondante a été appuyée...
en bouclant sur toutes tes entrées digitales, il y a moyen de le faire de facon assez compacte...

jvais y jeter un coup d'oeil,mais comme jte dit....le C cest pas encore mon m,eilleur ami ;D