Chris--A / Keypad

A version of the keypad library found in Wiring. This is just a copy made compatible with the Arduino IDE library manager.
GNU General Public License v3.0
248 stars 150 forks source link

Avoid nonClick event #37

Open thalesmaoa opened 3 years ago

thalesmaoa commented 3 years ago

Hello, I've build an application using keypad and mount it inside a box. From time to time I receive a beep indicating a fail click in the matrix pad. In other words, there are some interference that I can't understand why. I've tried increasing debounce time. It get better, but still a problem from time to time. Can anyone point a way to improve my code?

It always detect "1" as button pressed.

#include <Arduino.h>
#include <Keypad.h>
#include <UIPEthernet.h>

#define CLIENT_ID "Pad-Senha"
#define RESET_DELAY   5000
#define TEMPO_PREALARME 2000

void buttonPress();
void resetBeep();
void passOk();
void sendMessage(char[]);
void checkMessage();

const uint password_1 = 123; // change your password here
const uint password_2 = 456;  // change your password here
const uint password_3 = 789;   // change your password here
const uint password_4 = 012;   // change your password here
const uint password_5 = 345;   // change your password here
String input_password;

long previousMillis;
long tempoprealarme;

byte start_timer = 0;

byte alarme = 0;
byte prealarme = 0;
byte alarme_sirene = 1;

const int BUZZER_PIN = 9;
const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 3; //three columns

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte pin_rows[ROW_NUM] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {6, 7, 8}; //connect to the column pinouts of the keypad
byte i;

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

EthernetUDP udp;

void setup(){
  pinMode(BUZZER_PIN,OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);
  input_password.reserve(32);

  Serial.begin(9600);

  uint8_t mac[6] = {0x00,0x02,0x02,0x03,0x04,0x05};

  Ethernet.begin(mac,IPAddress(192,168,200,177));

  int success = udp.begin(5555);

  Serial.print(F("initialize: "));
  Serial.println(success ? "success" : "failed");
  Serial.println(UIPEthernet.localIP());

  sendMessage("Sistema ligado");
  sendMessage("Aguardando envio de mensagem");
  sendMessage(UIPEthernet.localIP());

  keypad.setDebounceTime(270); 
}

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

  if(start_timer){
    if(millis() - previousMillis > RESET_DELAY){
      resetBeep();
      input_password = "";
      start_timer = 0;
    }
  }

  if (key){
    Serial.println(key);
    start_timer = 1;
    previousMillis = millis();
    if(key == '*') {
      resetBeep();
      input_password = "";
      start_timer = 0; // reset the input password
    }else if(key == '#') {
      uint input_pass = input_password.toInt();
      switch(input_pass){
        case password_1:
          Serial.println("Pass 1");
          sendMessage("secret");
          passOk();
          break;
        case password_2:
          Serial.println("Pass 2");
          sendMessage("secret");
          passOk();
          break;
        case password_3:
          Serial.println("Pass 3");
          sendMessage("secret");
          passOk();
          break;
        case password_4:
          Serial.println("Pass 4");
          sendMessage("secret");
          passOk();
          break;
        case password_5:
          Serial.println("Pass 5");
          sendMessage("secret");
          passOk();
          break;
        default:
          Serial.println("Senha incorreta");
          resetBeep();
      }
      input_password = "";
      start_timer = 0;
    }else {
      input_password += key; // append new character to input password string
      buttonPress();
    }
  }
}

void sendMessage(char msg[]){
  int success;
    do{
      success = udp.beginPacket(IPAddress(192,168,200,254),5000);
    }while (!success);

    success = udp.print(msg);
    success = udp.endPacket();
    udp.stop();
    Serial.println(udp.begin(5000) ? "success" : "failed");
}

void checkMessage(){
  //check for new udp-packet:
  int size = udp.parsePacket();
  if (size > 0) {
    do{
      char* msg = (char*)malloc(size+1);
      int len = udp.read(msg,size+1);
      msg[len]=0;
      Serial.println(msg);

      if (strcmp(msg, "alarme") == 0){
        alarme = 1;
      }else if (strcmp(msg, "prealarme") == 0){
        prealarme = 1;
      }else if(strcmp(msg, "desabilitaalarme") == 0){
        alarme = 0;
        prealarme = 0;
      }
      free(msg);
    }while ((size = udp.available())>0);
    //finish reading this packet:
    udp.flush();
    //Serial.println(F("'"));
  }
}

void passOk(){
  int NOTE_SUSTAIN = 100;
  for(uint8_t nLoop = 0;nLoop < 2;nLoop ++){
    tone(BUZZER_PIN,NOTE_A5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_B5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_C5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_B5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_C5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_D5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_C5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_D5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_E5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_D5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_E5);
    delay(NOTE_SUSTAIN);
    tone(BUZZER_PIN,NOTE_E5);
    delay(NOTE_SUSTAIN);
  }
  noTone(BUZZER_PIN);
}

void resetBeep(){
  tone(BUZZER_PIN, 500, 200);
  delay(200);
  tone(BUZZER_PIN, 1200, 200);
  delay(200);
  tone(BUZZER_PIN, 300, 200);
  delay(200);
  tone(BUZZER_PIN, 1000, 200);
  delay(200);
  tone(BUZZER_PIN, 400, 200);
  delay(200);
  tone(BUZZER_PIN, 1100, 200);
  delay(200);
}

void buttonPress(){
  tone(BUZZER_PIN,NOTE_B5,200);
  delay(100);
  noTone(BUZZER_PIN);
}