Apri porta con Password - PROBLEMA

Ciao a tutti,
sto realizzando un sistema che mi sblocchi la porta attraverso l’immissione del codice di sblocco attraverso il KEYPAD 4x4.
[IMMAGINE COME REFERENZA ALLEGATA]
Il codice dovrebbe fare cosí, ovvero una volta validato il codice dovrebbe andare da B ad A, aspettare 20 secondi per permettere di entrare e tornare in B a bloccare la porta.
tutto funziona bene tranne per il fatto che il motore a riposo é nella posizione A, si muove nella posizione B e poi ritorna in A, quindi si muove al contrario… no so come fare per risolvere il problema

Il secondo problema è questo:
come avete intuito il keypad sta nella parte verso l’esterno dell’abitazione, mentre per uscire dall’interno volevo implementare un semplice interruttore che premendolo facesse appunto muovere il motore come prima… Altro problema

Grazie a tutti quelli che contribuiranno :smiley:

allego codice

keypad_password_servo.ino (2.82 KB)

Per primo un chiavistello motorizzato é pericoloso perché se si blocca sei davanti alla porta. Una soluzione praticbile é motorizzare il pomello interno che fa girare la serratura. In caso di malfunzionamento puoi sempre aprire con la chiave dall'esterno.

Ciao Uwe

non ti preoccupare di questo, non ha solo un accesso, anche se si blocca non è un problema

focamonca: tutto funziona bene tranne per il fatto che il motore a riposo é nella posizione A, si muove nella posizione B e poi ritorna in A, quindi si muove al contrario... no so come fare per risolvere il problema

Ciao @Gianmaria (io sono Igor Diego), concentriamoci su 1 passo alla volta: E questo che non mi è chiaro. Se il chiavistello e quindi il servo ti serve in 2 posizioni, A e B, qual'e' il poblema? Se il servo parte in posizione A, teorizzo che hai servo con write(0). Se la posizione B è write(100), allora quando è in posizione A e comandi servo.write(100) si porta in posizione B. Nella posizione B se comandi servo.write(0) ritorna in posizione A, quindi facendo la rotazione inversa.

Però non capisco il problema, o inverti i comandi ( 45º chiuso - 0º aperto ) , o metti il servo al di sotto. E poi ci vuole anche un sensore per sapere se la porta è aperta o chiusa, altrimenti se dopo 20 secondi il chiavistello scatta e la porta è sempre aperta?

nid69ita:
Ciao @Gianmaria (io sono Igor Diego), concentriamoci su 1 passo alla volta:
E questo che non mi è chiaro. Se il chiavistello e quindi il servo ti serve in 2 posizioni, A e B, qual’e’ il problema?
Se il servo parte in posizione A, teorizzo che hai servo con write(0). Se la posizione B è write(100), allora quando è in posizione A e comandi servo.write(100) si porta in posizione B. Nella posizione B se comandi servo.write(0) ritorna in posizione A, quindi facendo la rotazione inversa.

avevo concettualizzato anche io questa soluzione, il problema è come implementarlo con successo.
l’angolo a me utile è di 45 gradi

up :sweat_smile:

OK ho risolto il problema della rotazione

Ora manca quello del bottone

Ora manca quello del bottone

ma se hai già la routine belle pronta......

lanciala

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  pressButton() ; // lancia la routine di controllo se è stato premuto il tasto apriporta
  keypad.getKey();
  myservo.write(0);
  }

Brunello: ma se hai già la routine belle pronta......

lanciala

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  pressButton() ; // lancia la routine di controllo se è stato premuto il tasto apriporta
  keypad.getKey();
  myservo.write(0);
  }

forse non ho afferrato bene cosa intendevi ma aggiungendo quel pezzo di codice ottengo questo:

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Mac OS X), Board: "Arduino Uno"
keypad_password_servo.ino: In function 'void loop()':
keypad_password_servo:46: error: 'pressButton' was not declared in this scope

scusa, puoi ripostare lo sketch che usi

#include <Password.h> 
#include <Keypad.h> 
#include <Servo.h>


Servo myservo; //declares servo
Password password = Password( "1923" ); //password to unlock box, can be changed

const byte ROWS = 4; // Four rows
const byte COLS = 4; // columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 5, 4, 3, 2 }; 

const int buttonPin = 10;     // the number of the pushbutton pin
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int sensorValue = digitalRead(10); //NB ho provato a creare un metodo per il bottone, ma ho eliminato
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(200); 
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  myservo.attach(13); //servo on digital pin 9 //servo
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);   
  }

void loop(){
  Serial.println(sensorValue);
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  keypad.getKey();
  myservo.write(90);
  }
  //take care of some special events
  void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:
  
  Serial.print("Enter: ");
  Serial.println(eKey);
  delay(10);
  
  Serial.write(254);
  
  switch (eKey){
    case 'A': checkPassword(); delay(1); break;
    
    case 'C': password.reset(); delay(1); break;
    
     default: password.append(eKey); delay(1);
}
}
}
void checkPassword(){
  
if (password.evaluate()){  //if password is right open box
    
    Serial.println("Accepted");
    Serial.write(254);delay(1000);
    //Add code to run if it works
    myservo.write(50); //160deg
    
        digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off
    
    
}else{
    Serial.println("Denied"); //if passwords wrong keep box locked
    Serial.write(254);delay(10);
    //add code to run if it did not work
    myservo.write(77);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off
    
}


}

cert che ti dava errore, visto che hai eliminato un pezzo

#include <Password.h> 
#include <Keypad.h> 
#include <Servo.h>


Servo myservo; //declares servo
Password password = Password( "1923" ); //password to unlock box, can be changed

const byte ROWS = 4; // Four rows
const byte COLS = 4; // columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {
    '1','2','3','A'  }  ,
  {
    '4','5','6','B'  }  ,
  {
    '7','8','9','C'  }  ,
  {
    '*','0','#','D'  }
  };
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 
  9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 
  5, 4, 3, 2 }; 

const int buttonPin = 10;     // the number of the pushbutton pin
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int sensorValue = digitalRead(10); //NB ho provato a creare un metodo per il bottone, ma ho eliminato
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(200); 
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  myservo.attach(13); //servo on digital pin 9 //servo
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);   
}

void loop(){
  Serial.println(sensorValue);
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  pressButton() ;
  keypad.getKey();
  myservo.write(90);
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:

    Serial.print("Enter: ");
    Serial.println(eKey);
    delay(10);

    Serial.write(254);

    switch (eKey){
    case 'A': 
      checkPassword(); 
      delay(1); 
      break;

    case 'C': 
      password.reset(); 
      delay(1); 
      break;

    default: 
      password.append(eKey); 
      delay(1);
    }
  }
}
void checkPassword(){

  if (password.evaluate()){  //if password is right open box

    Serial.println("Accepted");
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(50); //160deg

    digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off


  }
  else{
    Serial.println("Denied"); //if passwords wrong keep box locked
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(77);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off

  }
}
void pressButton(){
  if (buttonState == HIGH) {     
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(45); //160deg

    digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off  
  } 
  else {
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(0);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off
  }
}

Brunello:
cert che ti dava errore, visto che hai eliminato un pezzo

#include <Password.h> 

#include <Keypad.h>
#include <Servo.h>

Servo myservo; //declares servo
Password password = Password( “1923” ); //password to unlock box, can be changed

const byte ROWS = 4; // Four rows
const byte COLS = 4; // columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {
    ‘1’,‘2’,‘3’,‘A’  }  ,
  {
    ‘4’,‘5’,‘6’,‘B’  }  ,
  {
    ‘7’,‘8’,‘9’,‘C’  }  ,
  {
    ‘*’,‘0’,’#’,‘D’  }
  };
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {
  9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = {
  5, 4, 3, 2 };

const int buttonPin = 10;    // the number of the pushbutton pin
// variables will change:
int buttonState = 0;        // variable for reading the pushbutton status
int sensorValue = digitalRead(10); //NB ho provato a creare un metodo per il bottone, ma ho eliminato
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(200);
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  myservo.attach(13); //servo on digital pin 9 //servo
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT); 
}

void loop(){
  Serial.println(sensorValue);
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  pressButton() ;
  keypad.getKey();
  myservo.write(90);
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:

Serial.print("Enter: ");
    Serial.println(eKey);
    delay(10);

Serial.write(254);

switch (eKey){
    case ‘A’:
      checkPassword();
      delay(1);
      break;

case ‘C’:
      password.reset();
      delay(1);
      break;

default:
      password.append(eKey);
      delay(1);
    }
  }
}
void checkPassword(){

if (password.evaluate()){  //if password is right open box

Serial.println(“Accepted”);
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(50); //160deg

digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off

}
  else{
    Serial.println(“Denied”); //if passwords wrong keep box locked
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(77);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off

}
}
void pressButton(){
  if (buttonState == HIGH) {   
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(45); //160deg

digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off 
  }
  else {
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(0);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off
  }
}

Brunello:
cert che ti dava errore, visto che hai eliminato un pezzo

#include <Password.h> 

#include <Keypad.h>
#include <Servo.h>

Servo myservo; //declares servo
Password password = Password( “1923” ); //password to unlock box, can be changed

const byte ROWS = 4; // Four rows
const byte COLS = 4; // columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {
    ‘1’,‘2’,‘3’,‘A’  }  ,
  {
    ‘4’,‘5’,‘6’,‘B’  }  ,
  {
    ‘7’,‘8’,‘9’,‘C’  }  ,
  {
    ‘*’,‘0’,’#’,‘D’  }
  };
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {
  9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = {
  5, 4, 3, 2 };

const int buttonPin = 10;    // the number of the pushbutton pin
// variables will change:
int buttonState = 0;        // variable for reading the pushbutton status
int sensorValue = digitalRead(10); //NB ho provato a creare un metodo per il bottone, ma ho eliminato
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(200);
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  myservo.attach(13); //servo on digital pin 9 //servo
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT); 
}

void loop(){
  Serial.println(sensorValue);
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  pressButton() ;
  keypad.getKey();
  myservo.write(90);
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:

Serial.print("Enter: ");
    Serial.println(eKey);
    delay(10);

Serial.write(254);

switch (eKey){
    case ‘A’:
      checkPassword();
      delay(1);
      break;

case ‘C’:
      password.reset();
      delay(1);
      break;

default:
      password.append(eKey);
      delay(1);
    }
  }
}
void checkPassword(){

if (password.evaluate()){  //if password is right open box

Serial.println(“Accepted”);
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(50); //160deg

digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off

}
  else{
    Serial.println(“Denied”); //if passwords wrong keep box locked
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(77);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off

}
}
void pressButton(){
  if (buttonState == HIGH) {   
    Serial.write(254);
    delay(1000);
    //Add code to run if it works
    myservo.write(45); //160deg

digitalWrite(11, HIGH);//turn on
    delay(20000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off 
  }
  else {
    Serial.write(254);
    delay(10);
    //add code to run if it did not work
    myservo.write(0);
    digitalWrite(12, HIGH); //turn on
    delay(500); //wait 5 seconds
    digitalWrite(12, LOW);//turn off
  }
}

Domani provo e ti dico! :smiley:

focamonca: Domani provo e ti dico! :D

allora.... il codice non va proprio. tipo il servomotore si muove avanti e indietro tipo epilettico.. :/ help