Ardunio Zahlenschloss Programmcde erweitern.

Hallo,

Ich sitze hier bei einem Freund über einem Ardunio Projekt Zahleschloss für eine Türöffnung.
Es funktioniert alles einwandfrei so wie es soll. Wir möchten nun aber ein weiteren Taster als Notöffnung einbinden.

#include <Password.h> //http://playground.arduino.cc/uploads/Code/Password.zip //tells to use password library
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip  //tells to use keypad library
 
 
Password password = Password( "123" ); //password to unlock, can be changed
 
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 6, 7, 8};
byte colPins[COLS] = {2, 3, 4};
 
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(100);
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  pinMode(52, OUTPUT); //Test
  pinMode(22, INPUT); //rot
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  }
 
 
void loop()
 
 
 
{
  keypad.getKey();
  }
  //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 '#': checkPassword(); delay(1); break; //Ziffer 5 beendet Code
   
    case '0': password.reset(); delay(1); break; //Ziffer sperrt Code und muss als erste Ziffer genutzt werden
   
     default: password.append(eKey); delay(1);
}
}
}
void checkPassword(){
 
if (password.evaluate()){  //if password is right open
   
    Serial.println("Accepted");
    Serial.write(254);delay(10);
    //Add code to run if it works
 
    digitalWrite(52, HIGH);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(10000);
    digitalWrite(12, HIGH);
   
   
}
else
{
    Serial.println("Denied"); //if passwords wrong keep locked
    Serial.write(254);delay(10);
    //add code to run if it did not work
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
   
}
}

Der Taster ist an Pin 22 angeschlossen und soll wenn er gedrückt wird Pin 52 auslösen. Das ganze oben wurde dafür mit diesem Programmcode ergänzt:

am anfang nach Aufruf der Libarys:

int taster=22;
int tasterstatus=0;

und am Ende des ganzen Codes:

tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)

{
digitalWrite(52, HIGH);
delay (1000);
digitalWrite(52, LOW);
delay (1000);

Aber der Taster reagiert nicht. Woran könnte das liegen?

Grüße hugoLOST

Bitte den Sketch hier in Code-Tags (</>) posten.
So kann man den im Tablet nicht lesen.
Code-Tags verwenden.

Und das es nicht funktioniert, liegt vermutlich an einem fehlenden Pulldown-Widerstand.
Und zeig uns, wie der Taster angeschlossen ist.

hugolost:
... ist an Pin 22 angeschlossen und soll wenn er gedrückt wird Pin 52 auslösen. Das ganze oben wurde dafür mit diesem Programmcode ergänzt:...

Von welchem Board sprichst Du?! Pin 52 ist mir vollkommen unbekannt. Und könntest Du Deinen Code ein bisschen lesbarer machen und in Code-Tags einschließen? So ist das ja nicht so toll zu lesen.

Gruß

Gregor

Wenn du den Code einfach anhängst,geht es nicht.
Der Code für den Taster muss in die Loop.
Und den Pulldown nicht vergessen.

Besser ist es den Taster auf Low abfragen und einen internen Pullup verwenden.

Board ist das Arduino Mega.

Der Taster ist mittels Jumper Kabel an pin 22 und GND angeschlossen. Es ist noch ein zweiter taster angesclossen für eine andere funktion dieser ist genauso angeschlossen (an einem anderen Pin).

hugolost:
Board ist das Arduino Mega.

Der Taster ist mittels Jumper Kabel an pin 22 und GND angeschlossen. Es ist noch ein zweiter taster angesclossen für eine andere funktion dieser ist genauso angeschlossen (an einem anderen Pin).

Dann brauchst du unbedingt einen Pullup (intern) oder 10 k extern.
Und du musst auf Low abfragen.

Danke werden wir ausprobieren.

Aber wir haben noch ein anderen Programmcode der ähnlich aufgebaut ist (selbe funktionen um ein Taster abzufragen) und dieser zweite Taster funktioniert ohne Pulldown Wiederstand und mit Abfrage auf High? Wie kommt das ist das glück?

hugolost:
Danke werden wir ausprobieren.

Aber wir haben noch ein anderen Programmcode der ähnlich aufgebaut ist (selbe funktionen um ein Taster abzufragen) und dieser zweite Taster funktioniert ohne Pulldown Wiederstand und mit Abfrage auf High? Wie kommt das ist das glück?

Das ist wirklich Glück.

Der Eingang eines Atmega ist ohne "Abschluss" sehr empfindlich. Speziell wenn Kabel angeschlossen sind.
Dann fängt dieser sich etwas aus dem Umfeld ein, was Funktion empfindlich stören kann.
Daher sollten Ports, die als Eingang deklariert werden immer mit einem Pullup oder Pulldown abgeschlossen werden.

https://www.arduino.cc/en/Tutorial/DigitalPins

Ein frohes neues.

Wir haben jetzt ein 10k ohm wieder stand als pulldown eingebaut. Es klappt aber trotzdem nicht. Der Taster zeigt keine Reaktion. Mit einem anderen Programm (aus dem die Funktion für den Taster kopiert wurde) klappt dieser einwandfrei auch ohne wieder stand.

Wir kennen den anderen Sketch nicht und auch deinen aktuellen Sketch nicht.
Du solltest den aktuellen Sketch und die Schaltung zeigen wie du den Taster angeschlossen hast.

Ohne weitere Angaben (Sketch und Schaltung) ist es nur eine Raterei.

int LEDblau=6;

int taster=7;

int tasterstatus=0;



void setup()

{

pinMode(LEDblau, OUTPUT);

pinMode(taster, INPUT);

}

 

void loop()

{

tasterstatus=digitalRead(taster);

 

if (tasterstatus == HIGH)

 

{

digitalWrite(LEDblau, HIGH);

delay (5000);

digitalWrite(LEDblau, LOW);

}

else

{

digitalWrite(LEDblau, LOW);

}

}
	

Das Wort „LEDblau“ steht jetzt für den Wert 6.

Das Wort „taster“ steht jetzt für den Wert 7.

Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.

 

Hier beginnt das Setup.

 

Der Pin mit der LED (Pin 6) ist jetzt ein Ausgang.

Der Pin mit dem Taster (Pin 7) ist jetzt ein Eingang.

 

 

-Mit dieser Klammer wird der Loop-Teil geöffnet.

Hier wird der Pin7 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „tasterstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.

-Verarbeitung: Wenn der taster gedrückt ist (Das Spannungssignal ist hoch)

-Programmabschnitt des IF-Befehls öffnen.

- dann soll die LED leuchten

- und zwar für für 5 Sekunden (5000 Millisekunden).

- danach soll die LED aus sein.

-Programmabschnitt des IF-Befehls schließen.

ansonsten

-Programmabschnitt des else-Befehls öffnen.

soll die LED aus sein.

-Programmabschnitt des else-Befehls schließen.

-Mit dieser letzten Klammer wird der Loop-Teil geschlossen.

Damit funktioniert der Taster nur das wir anstatt einer LED ein Relais verwenden.

Mit dem Code oben wo wir den Taster in das Zahlenschloss einbauen funktioniert es nicht.

Und warum zeigst du uns nicht den aktuellen Code mit der gemachten Änderung von dir.
Erst dann können wir sehen was falsch ist.
Und zeig uns auch die Schaltung, wie du den Taster angeschlossen hast.

Es würde auch mal interessieren, wie du den Widerstand eingebaut hast.
Bei so einer simplen Schaltung und Code kann man eigentlich nicht viel verkehrt machen.

Also zeig uns bitte den jetzigen Code wo du den zusätzlichen Tastercode eingesetzt hast.

Zwischen GND und Taster ist er verbaut. Bild kann ich kein brauchbares zeigen aufgrund von zuviel Kabel.

Hier der "neue" Code mit dem es nicht funktioniert.

#include <Password.h> //http://playground.arduino.cc/uploads/Code/Password.zip //tells to use password library
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip  //tells to use keypad library
 
int taster=22;
int tasterstatus=0;
Password password = Password( "123" ); //password to unlock, can be changed
 
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 6, 7, 8};
byte colPins[COLS] = {2, 3, 4};
 
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(100);
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  pinMode(52, OUTPUT); //Test
  pinMode(taster, INPUT); //roter Button
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  }
 
 
void loop()
 
 
 
{
  keypad.getKey();
  }
  //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 '#': checkPassword(); delay(1); break; //Ziffer 5 beendet Code
   
    case '0': password.reset(); delay(1); break; //Ziffer sperrt Code und muss als erste Ziffer genutzt werden
   
     default: password.append(eKey); delay(1);
}
}
}
void checkPassword(){
 
if (password.evaluate()){  //if password is right open
   
    Serial.println("Accepted");
    Serial.write(254);delay(10);
    //Add code to run if it works
 
    digitalWrite(52, HIGH);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);
    delay(200);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(12, HIGH);
   
   
}
else
{
    Serial.println("Denied"); //if passwords wrong keep locked
    Serial.write(254);delay(10);
    //add code to run if it did not work
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
   
}
 
{
 
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)
 
{
digitalWrite(52, HIGH);
delay (1000);
digitalWrite(52, LOW);
delay (1000);
}
}
}

An 22 ist der Taster angeschlossen und an 52 ein Relais was schalten soll wenn man den Taster drückt auch wenn der Zahlencode nicht eingegeben wurde. Quasi als Notöffnung.

hugolost:
Zwischen GND und Taster ist er verbaut. Bild kann ich kein brauchbares zeigen aufgrund von zuviel Kabel.

Schaltbild und Sketch bitte!

Nur anstatt der LED eine Relaiskarte und das ganze auch an deren Pins (pin22 Taster, pin52 Relaiskarte).

Der Sketch ist falsch! So funktioniert es nicht.

Im Post #3 hatte ich doch geschrieben, der Code soll in die Loop.

Z.B. so:

void loop()
{
  keypad.getKey();

  tasterstatus = digitalRead(taster);
  if (tasterstatus == HIGH)

  {
    digitalWrite(52, HIGH);
    delay (1000);
    digitalWrite(52, LOW);
    delay (1000);
  }

}

Da wo du sie hattest, wird es wohl nie abgefragt.

Ich glaube, du musst dich unbedingt um die Basics kümmern.
Ohne die wirst du weiterhin Probleme haben.

Und unterlasse bitte zukünftig das Crossposting, wir können nichts dafür, dasss du die Basics nicht drauf hast.

Sorry, ich bin dabei es mir anzu eignen. Es ist noch kein Meister vom Himmel gefallen.

Aber jetzt klappt das ganze. Und wenn wir mit dem Gesammten Projekt fertig sind kommt dazu ein Worklog.