Boutons poussoir sur alarme

Bonjour à tous,
Ne m'en voulez pas si ma question peut paraître bête mais je suis un grand novice.
Je compte me créer une alarme pour éviter les vols.
Celle-ci fonctionnera avec des capteurs à effet hall, un module SIM900 et une sirène.
De ce côté là, pas de problème.

Elle sera pilotée par SMS, par exemple l'envoi du message "On" l'activera et l'envoi du message "Off" la désactivera.

Je compte aussi rajouter des boutons poussoirs, et c'est la que se pose le problème :
J'aimerais mettre 4 ou 5 boutons poussoirs un peu cachés et un seul désactivera l'alarme, tous les autres la feront sonner. Cela permet de ne pas sortir son téléphone et d'envoyer un Sms à chaque fois qu'on veut entrer dans la pièce/maison.

Le problème est que, par exemple si le voleur voit les boutons, il appuie sur un des 5, le mauvais par exemple, l'alarme sonne mais il appuie par la suite sur le bon bouton, celui qui la désactive. L'alarme sera alors désactivée....
C'est ce bout de programme là qui me pose problème et je ne sais pas comment l'écrire...
Je ne sais pas si vous avez compris mon problème mais si vous avez une piste, je suis preneur.
Merci d'avance !
Bonne soirée.

Vous vous en êtes sorti pour l’autre post?

vous pouvez envoyer du 220V dans le bouton si on appuie sur le mauvais.... (c’est une blague - en faites pas ça!!)

Au lieu d’un seul bouton vous pourriez coder une séquence de boutons à appuyer.. et tant qu’à faire alors Vous pourriez mettre un clavier/membrane au lieu de quelques boutons et il faudra taper un code à 22 chiffres. Là c’est plus difficile à trouver (bon 6 chiffres c’est déjà assez complexe, voire même 4 si c’est pas 0000)

J’ai un tuto sur la gestion d’ un flux asynchrone (port série ou keypad) vous pouvez y jeter un oeil éventuellement (le post 6 vous donne un code de lecture du mot de passe)

Oui, l'autre post c'est Ok.
Sinon j'ai un truc à membranes à chiffres,
pensez vous que ça peut marcher ?

Merci d'avance.

Ben oui... pourquoi ça ne marcherait pas ??

Oui oui, il n'y a aucune raison que ça ne marche pas.

j’ai trouvé cet autre code :

#include <Keypad.h>

//Variables

int character = 0;

char Str[16] = {' ', ' ', ' ', ' ', ' ', ' ', '-', '*', '*', '*', ' ', ' ', ' ', ' ', ' ', ' '};

//Pins

int buzzer = 11;   //pin for the buzzer beep


//Keypad config
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1', '4', '7', '*'},
  {'2', '5', '8', '0'},
  {'3', '6', '9', '#'},
  {'A', 'B', 'C', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup()
{

  pinMode(buzzer, OUTPUT);

}

void loop()
{




  character = 0;
  Str[6] = '-';
  Str[7] = '*';
  Str[8] = '*';
  Str[9] = '*';
  Str[10] = ' ';




  char customKey = customKeypad.getKey(); //this function reads the presed key

  if (customKey) {

    if (character == 0)
    {
      Serial.println(customKey);
      Str[6] = customKey;
    }



    if (character == 1)
    {
      Serial.println(customKey);
      Str[7] = customKey;
    }



    if (character == 2)
    {
      Serial.println(customKey);
      Str[8] = customKey;
    }



    if (character == 3)
    {
      Serial.println(customKey);
      Str[9] = customKey;
    }



    if (character == 4)
    {
      Serial.println(customKey);
      Str[10] = customKey;
    }


    character = character + 1;


  }


  /*Change your password below!!!
    Change each of Str[6], Str[7], Str[8], Str[9]*/

  if (Str[10] = 'A' && character == 5 && Str[6] == '3' && Str[7] == '0' && Str[8] == '0' && Str[9] == '7' )
  {
    analogWrite(buzzer, 240);
    delay(250);
    analogWrite(buzzer, 200);
    delay(250);
    analogWrite(buzzer, 180);
    delay(250);
    analogWrite(buzzer, 250);
    delay(250);
    analogWrite(buzzer, LOW);
    delay(1000);
  }

  else
  {
    analogWrite(buzzer, 150);
    delay(3000);
    analogWrite(buzzer, LOW);
    character = 0;
    Str[6] = '-';
    Str[7] = '*';
    Str[8] = '*';
    Str[9] = '*';
    Str[10] = ' ';

  }
}

je le comprends mieux, sauf la partie avec

char Str[16] = {' ', ' ', ' ', ' ', ' ', ' ', '-', '*', '*', '*', ' ', ' ', ' ', ' ', ' ', ' '};

que signifie “Str” ?
Merci

je suppose que c'est parce que vous avez trouvé ça dans un exemple où ils ont un écran de 16 caractères.

Str[] c'est un tableau de caractères qui représentent sans doute une ligne d'affichage où ils veulent que le code soit centré et donc en affichantchar Str[16] = {' ', ' ', ' ', ' ', ' ', ' ', '-', '*', '*', '*', ' ', ' ', ' ', ' ', ' ', ' '};ça affiche 6 espaces, un tiret (là où on doit taper sans doute), 3 étoiles qui seront le mot de passe, et 6 espaces.

leur code remplace un caractère dans ce tableau à chaque fois que vous tapez mais ils ne gèrent pas que 4 caractères comme le tableau de caractères pourrait le laisser penser mais ils l'ont étendu à 5...

Sinon c'est pas terriblement structuré comme code et affichage et le Str[10] = 'A'sans doute un bug (et un autre bug s'ils avaient mis ==) et ça va beeper en permanence...

D'accord merci.
Oui en effet ce code vient d'un exemple où il y a un écran 16 caractères.
Et le Str 10 = 'A' à mon avis est pour la confirmation du code avec la touche A, non ?

AshGork:
Et le Str 10 = 'A' à mon avis est pour la confirmation du code avec la touche A, non ?

oui sans doute, mais pour tester on fait == pas juste = qui est une affectation...

et comme le test est effectué à chaque tour de loop, s'il n'y a pas de 'A' ou pas 5 caractères on part dans le else qui beep et remet tout à zéro...

bref - c'est moche...

je ne veux pas prêcher pour ma paroisse mais mon tuto, même si un peu plus complexe traite d'une machine à état qui sera plus intégrable dans n'importe quel code.

Oui, je suis d’accord.
Encore une petite question :
Tous les pins numériques de mon arduino sont pris (8 pour le 4x4, 1 pour le capteur à effet hall, 1 pour le relais et 2 pour le SIM 900) donc est ce qu’il serait possible de brancher mon buzzer sur les entrées Ax?
Merci.

Bonjour,

Oui les pins Ax sont des pins digitales, qui peuvent en plus être utilisées comme entrées analogiques.

D'accord donc j'utilise ces pin normalement, comme un autre.
Par contre, est ce qu'elles peuvent fournir un signal PWM puisque j'en ai besoin pour mon buzzer ?

Mettez le clavier en partie sur les analogiques et gardez une pin PWM pour le buzzer (ou utilisez Tone)

Est ce que ce montage serait possible ?
Merci

Votre image:

==> vous avez essayé ?

(De manière générale préférer des pins qui n’ont pas de rôle particulier pour vous laisser une opportunité d’évolution. La pin 13 pilote la LED interne ou avec 10/11/12 pour le SPI et A4/A5 est utilisée pour le protocole I2C. Si vous voulez rajouter un petit afficheur LCD 16x2 par exemple vous aurez besoin de A4/A5 et si vous voulez un clignotement de la led interne pour montrer l’état du système la pin 13 serait utilisée)

AshGork:
Par contre, est ce qu'elles peuvent fournir un signal PWM puisque j'en ai besoin pour mon buzzer ?

Non, pour la PWM il faut qu'un timer puisse prendre le contrôle de la pin et sur un micro d'architecture avr seules quelques pins sont dans ce cas. Tout dépend du micro car pour les micros Atmel d'architecture avr c'est un câblage "en dur" sur la puce.
Peut-tu rappeler la carte que tu utilise ?

AshGork:
Par contre, est ce qu'elles peuvent fournir un signal PWM puisque j'en ai besoin pour mon buzzer ?

Pourquoi un signal PWM? Avec un buzzer on utilise tone()

Non, je n'ai pas pu essayer puisque je n'ai pas reçu la totalité de mon matériel...

Pour les pins A4 et A5, je les laisserai libres en vue d'une évolution, ok.
Par contre que voulez vous dire par led interne sur le pin 13 ?

J'utilise un arduino UNO.

Il y a besoin du pwm, enfin je crois :

void loop() 
{ 
analogWrite(BUZZER, 255); 
delay(100); 
analogWrite(BUZZER, 0);
}

Ou as tu trouvé ça?
Si tu fais un analogWrite(BUZZER, 255); tu ne vas pratiquement rien entendre.

Pour émettre un son sur un buzzer (si buzzer passif) on utilise tone()

  tone(BUZZER,400,100);