Problemi tempo di reattività tastierino 4x4

Buongiorno, ho utilizzato un Arduino r3 samraza per creare un prototipo di cassaforte. Funziona tutto ma quando ho aggiunto il tastierino 4x4 ho riscontrato un problema. Quando la cassaforte è bloccata mi sembra di avere un intervallo di tipo un secondo ogni 4 per digitare una lettera, invece quando è aperta (la cassaforte) questo ritardo si annulla completamente, diventando super reattivo ( e dovrebbe essere così anche quando è chiusa). Mi domandavo se fosse un problema del codice oppure dovendo controllare il sensore ir, Arduino "rallenta". Tra poco pubblico il codice, grazie in anticipo.

#include <IRremote.h>
#include <Keypad.h>
#include <Servo.h> // libreria
#define PIN_SERVO 2 //pin servomotore
#define  pulsante 7 //pin pulsante
IRrecv IR(3);

Servo servo;

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {6, 7, 8, 9};
byte colPins[COLS] = {10,11,12,13};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String v_passcode="";

void setup() {
  IR.enableIRIn();
  servo.write(170);
  digitalWrite (A1, HIGH);
  servo.attach(PIN_SERVO);
  pinMode (pulsante, INPUT);
  pinMode (A2, OUTPUT);
  pinMode (A1, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  char key = keypad.getKey();
  if (key){
    Serial.println(key);
  }

    if (key != NO_KEY){
    
    v_passcode = v_passcode + key;
    
    if(key=='A')
    {
      Serial.println("Inserisci Password");
        v_passcode="";
    }
    
    if(key=='D')
    {
      Serial.println("Password Letta");
        //Serial.println(v_passcode);
        
        if (v_passcode=="104D")
        {
          Serial.println("Accesso Eseguito");
                servo.write(75);
      digitalWrite (A1, LOW);
      digitalWrite (5, HIGH);
      digitalWrite (A2, HIGH);
      digitalWrite (5, HIGH);
      digitalWrite (4, HIGH);
      delay (700);
      digitalWrite (A2, LOW);
      delay (1050);

        }
        else
        {
          Serial.println("Accesso Negato");
          digitalWrite (A2, HIGH);
          delay(100);
          digitalWrite (A2, LOW);
          delay(100);
          digitalWrite (A2, HIGH);
          delay(100);
          digitalWrite (A2, LOW);
          delay(100);
          digitalWrite (A2, HIGH);
          delay(100);
          digitalWrite (A2, LOW);
        }      
    }        
  }
  if (IR.decode()) {
    Serial.println(IR.decodedIRData.decodedRawData, HEX);

    if (IR.decodedIRData.decodedRawData == 0xFC037F80) {
      servo.write(75);
      digitalWrite (A1, LOW);
      digitalWrite (5, HIGH);
      digitalWrite (A2, HIGH);
      digitalWrite (5, HIGH);
      digitalWrite (4, HIGH);
      delay (700);
      digitalWrite (A2, LOW);
      delay (1050);

    }
    delay(50);
    IR.resume();
  }

  if (analogRead(A0) < 200) {
    delay (260);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, LOW);
    servo.write(180);
    digitalWrite (A1, HIGH);
    delay (900);

  }
}

Su A0 cosa è collegato ??? Leggi di continuo da questo pin

P.S. pezzi di codice uguali li puoi mettere in una funzione con un nome:

void ApriCassaforte()
{ servo.write(75);
  digitalWrite (A1, LOW);
  digitalWrite (5, HIGH);
  digitalWrite (A2, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (4, HIGH);
  delay (700);
  digitalWrite (A2, LOW);
  delay (1050);
}

Al posto dei due blocchi uguali metti semplicemente
ApriCassaforte();

Se nel codice usi "delay()" è normale. Mentre esegue il "delay()" Arduino non fa (non può fare) nulla perché non è multitask.
Devi cercare di evitare o ridurre al minimo essenziale i "delay()" ed usare ove opportuno "millis()", ma per farlo devi rivedere abbastanza la struttura del codice. Ad esempio questo delay(900), per iniziare, meglio toglierlo:

  if (analogRead(A0) < 200) {
    delay (260);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, LOW);
    servo.write(180);
    digitalWrite (A1, HIGH);
    delay (900);
  }

Prova, e se hai difficoltà posta qui il "nuovo" sketch o le domande che ti sorgono a proposito di millis().

su A0 c'è una fotoresistenza. Non so come funzionano le funzioni, me le puoi spiegare velocemente? comunque grazie.

il fatto è che i delay sono dopo aver aperto o chiuso la cassaforte

No, se la fotoresistenza è sotto ai 200 tu fai 2 delay il cui tempo totale è 1 secondo e più
Ma a che serve la fotoresistenza ? E IR ?? Non è che hai dato molte spiegazioni.

P.S. Nel IDE usa CTRL+T che indenta il codice per bene

giusto, grazie ora aggiusto il codice e lo ripubblico.

Nella setup che senso ha questo ?

  servo.write(170);
  digitalWrite (A1, HIGH);
  servo.attach(PIN_SERVO);

Posizioni il servo prima di averlo agganciato con la attach ?

potresti avere ragione, ora aggiusto

aggiustato, grazie mille

#include <IRremote.h>
#include <Keypad.h>
#include <Servo.h> // libreria
#define PIN_SERVO 2 //pin servomotore
#define  pulsante 7 //pin pulsante
IRrecv IR(3);

Servo servo;

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {6, 7, 8, 9};
byte colPins[COLS] = {10, 11, 12, 13};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String v_passcode = "";

void setup() {
  IR.enableIRIn();
  digitalWrite (A1, HIGH);
  servo.attach(PIN_SERVO);
  servo.write(170);
  pinMode (pulsante, INPUT);
  pinMode (A2, OUTPUT);
  pinMode (A1, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  char key = keypad.getKey();

  if (key) {
    Serial.println(key);
    digitalWrite(A2, HIGH);
    delay(100);
    digitalWrite(A2, LOW);
  }

  if (key != NO_KEY) {

    v_passcode = v_passcode + key;

    if (key == 'A')
    {
      Serial.println("Inserisci Password");
      v_passcode = "";
    }

    if (key == 'D')
    {
      Serial.println("Password Letta");

      if (v_passcode == "104D")
      {
        Serial.println("Accesso Eseguito");
        servo.write(45);
        digitalWrite (A1, LOW);
        digitalWrite (5, HIGH);
        digitalWrite (A2, HIGH);
        digitalWrite (5, HIGH);
        digitalWrite (4, HIGH);
        delay (700);
        digitalWrite (A2, LOW);
        delay (1050);

      }
      else
      {
        Serial.println("Accesso Negato");
        digitalWrite (A2, HIGH);
        delay(100);
        digitalWrite (A2, LOW);
        delay(100);
        digitalWrite (A2, HIGH);
        delay(100);
        digitalWrite (A2, LOW);
        delay(100);
        digitalWrite (A2, HIGH);
        delay(100);
        digitalWrite (A2, LOW);
      }
    }
  }
  if (IR.decode()) {
    Serial.println(IR.decodedIRData.decodedRawData, HEX);

    if (IR.decodedIRData.decodedRawData == 0xFC037F80) {
      servo.write(45);
      digitalWrite (A1, LOW);
      digitalWrite (5, HIGH);
      digitalWrite (A2, HIGH);
      digitalWrite (5, HIGH);
      digitalWrite (4, HIGH);
      delay (700);
      digitalWrite (A2, LOW);
      delay (1050);

    }
    delay(50);
    IR.resume();
  }

  if (analogRead(A0) < 200) {
    delay (90);
    digitalWrite (5, LOW);
    digitalWrite (4, LOW);
    digitalWrite (5, LOW);
    servo.write(180);
    digitalWrite (A1, HIGH);


  }
}

non ho spiegato tutto per due motivi
1 non sarebbe servito a nulla saperlo
2 dovrei scrivere un poema per spiegarlo

Fare eseguire lo stesso compito già eseguito in questo caso ha poco senso.
A volere fare le cose semplici, mi servirebbe una variabile in cui salvare lo stato della cassaforte che può assumere solo due stati: APERTA, CHIUSA.

if (stato == APERTA) {
    if (analogRead(A0) < 200) {
        delay (90);
        digitalWrite (5, LOW);
        digitalWrite (4, LOW);
        digitalWrite (5, LOW);
        servo.write(180);
        digitalWrite (A1, HIGH);
    }
    stato = CHIUSA;
}

Adesso puoi anche aumentare il delay a piacere.

Ciao.

Grazie, ma ho risolto a modo mio. Ciaoo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.