LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: helderjsd em 13 de Janeiro de 2017, 15:56
-
Boas,
Estou aqui a inventar com um DTMF decoder, ligado entre o telemovel e o arduino.
A minha ideia, é usar um DTMF generator no telemovel, e ir "meviando" numeros para o arduino.
Tudo funciona bem, excepto a validação da password.
Adaptei o codigo nos exemplos dos keypad sd ememebranam, e usando a biblioteca password.h
Mas o raio é que isto dá sempre password errada. Com o keypad de memebrana funciona bem e valida correctamente, mas usando o que recebo do DTMF dá erro.
estou a usar o seguinte codigo:
#include <Password.h>
int Q4 = 10; // Q4 of MT8870D is connected to Digital Pin 10 of Arduino
int Q3 = 11; // Q3 of MT8870D is connected to Digital Pin 11 of Arduino
int Q2 = 12; // Q2 of MT8870D is connected to Digital Pin 12 of Arduino
int Q1 = 13; // Q1 of MT8870D is connected to Digital Pin 13 of Arduino
int Qt = 7;
int Tirou=0;
Password password = Password( "12345" );
void setup() {
Serial.begin(9600);
// make the digital pins inputs:
pinMode(Q1, INPUT);
pinMode(Q2, INPUT);
pinMode(Q3, INPUT);
pinMode(Q4, INPUT);
pinMode(Qt, INPUT);
}
void loop() {
int key_number;
// read the input pin:
if ((digitalRead(Qt)==HIGH) and (Tirou==0)){
Tirou=1;
int read_from_Q1 = digitalRead(Q1); // Read data from Q1
int read_from_Q2 = digitalRead(Q2); // Read data from Q2
int read_from_Q3 = digitalRead(Q3); // Read data from Q3
int read_from_Q4 = digitalRead(Q4); // Read data from Q4
key_number = (read_from_Q4 * pow(2,3)) + (read_from_Q3 * pow(2,2)) + (read_from_Q2 * pow(2,1)) + (read_from_Q1 * pow(2,0));
/* Serial.print("Binary of key number :");
Serial.print(read_from_Q4);
Serial.print(read_from_Q3);
Serial.print(read_from_Q2);
Serial.print(read_from_Q1);
Serial.print(" ");
*/
Serial.print("Key pressed is :");
Serial.print(key_number);
Serial.println(" ");
if (key_number==11) {
Serial.println("* - VAMOS VERIFICAR A PASS");
checkPassword();
Serial.println(password.evaluate());
}
else {
if (key_number==12) {
Serial.println("# - PASSWORD LIMPA/RESET");
password.reset();
}
else {
password.append(key_number);
Serial.print("Numero adicionado:" );
Serial.print(key_number);
}
}
//delay(50);
key_number = 0;
}
if (digitalRead(Qt)==LOW)
{
Tirou=0;
}
}
void checkPassword(){
if (password.evaluate()){
Serial.println("Successo");
//-----------------------------------------------------
password.reset();
}else{
Serial.println("Errado");
}
}
Se introduzir por exemplo os numeros 12345* no telemovel, o monitor mostra o seguinte:
Key pressed is :1 Numero adicionado:1
Key pressed is :2 Numero adicionado:2
Key pressed is :3 Numero adicionado:3
Key pressed is :4 Numero adicionado:4
Key pressed is :5 Numero adicionado:5
Key pressed is :11
* - VAMOS VERIFICAR A PASS
Errado
0
Porque raio dá sempre pass errada???
-
Acho que descobri.
A biblioteca password compara strings, e estás a encher a mesma (append) com números quando devias meter chars.
Segundo a documentação http://playground.arduino.cc/Code/Password (http://playground.arduino.cc/Code/Password) :
append(character)
Append a character to the currently guessed password
Troca a linha:
password.append(key_number);
Por esta:
password.append('0'+key_number);
Eu sei que parece estranha, mas é um truque velho para coverter inteiros de 1 digito no char correspondente.
-
PERFEITO :) :) :) :) :)
Nao conhecia esse truque
Obrigadao :)
-
Nao conhecia esse truque
http://www.asciitable.com (http://www.asciitable.com)
'0' == 48 dec == 0x30