Besoin d'aide - Code d'un détecteur de mouvement (PIR, buzzer, keypad, oled)

Bonjour,

Avant de vous détailler mon problème voici l’objectif du projet :

  • Un détecteur de mouvement (PIR - HC-501) qui envoie un signal à l’arduino quand il détecte un mouvement

  • L’arduino applique une tension a un transistor (BS170) quand il reçoit la détection ET tant qu’il ne reçoit pas le bon mot de passe (écrit au keypad)

  • Le transistor une fois fermé laisse passer 9V vers un Buzzer

  • Les infos sont inscrites sur l’écran 128x64

Alors maintenant voilà mon problème :

  • Je n’arrive pas à faire en sorte que le buzzer bip TANT QUE le mot de passe n’a pas été entré

Il ne bip que le temps de l’impulsion envoyée par le PIR (soit ± 3sec)

C’est un problème de code… Mais je ne sais pas comment faire (j’ai essayé avec des boucles etc…)

Voici le schéma de ma carte et mon code :

//Je vous passe les includes et la configuration du keypad...

String password = "1234A";
String passin ="";
boolean detection = false;
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
    pinMode(A2, OUTPUT);
    pinMode(2, INPUT);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
    // init done

}

void loop() {
    display.clearDisplay();
    char keypressed = myKeypad.getKey();
    display.setTextSize(1);
    display.setTextColor(WHITE);

    if (digitalRead(2) == HIGH) {
      if(passin != password){
        if (keypressed != NO_KEY) {
          passin = passin + keypressed;
        }
        if (keypressed == '#') {
            passin = "";
        }
        digitalWrite(A2, HIGH);
            display.setCursor(2, 1);
            display.println("pass");
            display.setCursor(2, 22);
            display.println(passin);
      }
      else if (passin == password) {
            display.setCursor(2, 1);
            digitalWrite(A2, LOW);
            display.println("alarme");
            display.setCursor(2, 18);
            display.println("desactive");
        }
    }else {
                display.setCursor(2, 1);
                display.setCursor(50, 0);
                display.println("No detection");
                digitalWrite(A2, LOW);
            }
        display.display();
    }

Un énorme merci d’avance pour votre aide !

Le code en photo c'est pas terrible.... ne t'attends pas à une avalanche de réponse.

Merci pour ta réponse, au temps pour moi... C'est peut-être mieux comme ça ? (même si un peu petit)

Le code, tu en fais un copier coller et tu le mets entre les balises.... autrement c'est une torture pour les yeux.

jfs:
Le code, tu en fais un copier coller et tu le mets entre les balises.... autrement c'est une torture pour les yeux.

Je n'avais pas vu le bouton pour insérer le code proprement désolé :confused:

C'est mieux.

boulyly:

  • L'arduino applique une tension a un transistor (BS170) quand il reçoit la détection ET tant qu'il ne reçoit pas le bon mot de passe (écrit au keypad)

C'est pas un problème de code. C'est un problème de formulation.
Tu as mal formulé ton problème et donc tu l'as mal codé.

  1. Si la détection a lieu on applique une tension sur le transistor
  2. Si le mot de passe est saisi on supprime la tension sur le transistor

Il y a 2 conditions mais elles ne sont pas liées il ne faut donc pas les traiter avec un if ... else ... mais avec 2 if.
L'un va gérer la condition d'activation du transistor et l'autre if va gérer la condition pour désactiver le transistor.

Merci pour ta réponse

Je vois ce que tu veux dire, je vais essayer de changer ça

voilà mon code (mais ça ne marche toujours pas...) :

void setup() {
    pinMode(A2, OUTPUT);
    pinMode(2, INPUT);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
}

void loop() {
    display.clearDisplay();
    char keypressed = myKeypad.getKey();
    display.setTextSize(1);
    display.setTextColor(WHITE);

    display.setCursor(2, 1);
    display.println("pass");
    display.setCursor(2, 22);
    display.println(passin);

    if(passin != password) {
        if (keypressed != NO_KEY) {
            passin = passin + keypressed;
        }
        if (keypressed == '#') {
            passin = "";
        }
    } else {
        digitalWrite(A2, LOW);
    }

    if (digitalRead(2) == HIGH) {
        digitalWrite(A2, HIGH);
    }

    display.display();
}

Si on applique la formulation de fdufnews : d'abord

  1. Si la détection a lieu on applique une tension sur le transistor
    if (digitalRead(2) == HIGH)  {
       digitalWrite(A2, HIGH);
     }

Cette ligne fait bien ça, mais elle ne suffit pas car il faut attendre que cette condition soit remplie pour passer à la suivante (c'est ce que je comprends en tout cas). Je verrais plutôt :

   while  (digitalRead(2) == LOW) {  } 
       digitalWrite(A2, HIGH);

Là, on attend que l'entrée 2 passe à haut pour envoyer le signal sur la sortie A2.

  1. Si le mot de passe est saisi on supprime la tension sur le transistor
    if(passin != password) {
        if (keypressed != NO_KEY) {
            passin = passin + keypressed;
        }
        if (keypressed == '#') {
            passin = "";
        }
    } else {
        digitalWrite(A2, LOW);
    }

Même chose, tu dois attendre que le mot de passe soit entré et correct pour faire ton digitalWrite :

     while(passin != password) {
        if (keypressed != NO_KEY) {
            passin = passin + keypressed;
        }
        if (keypressed == '#') {
            passin = "";
        }
    }
        digitalWrite(A2, LOW);

ça devrait le faire (ou pas :wink: )

Ok merci beaucoup pour vos réponses.

Je vais essayer ça !