Hallo zusammen.
Bin gerade meine DoorPi am verfeinern. Dabei habe ich mir eine Aussenstation mit einem Arduino NANO und der Soundkarte zusammengebastelt.
Am Arduino hängen die Klingeltaster, die Photodiode und mein Fingerleser. Von aussen nach innen funktioniert alles prima. Die Klingel Commands werden sauber übertragen, der Fingerleser öffnet meine Tür, Audio passt ohne Hall und Delay's.
Ich will nun Outputs auf dem Arduino steuern. Der Sketch ist fertig und über Putty funktionieren die Commands sauber und der Ardu macht, was er soll.
Aktuell habe ich DoorPi 2.5.1 mit dem USB_plain- Keyboard im Einsatz.
Offensichtlich will aber DoorPi keine Commands abfeuern. Wenn ich einen gebridgeten Arduino an den Raspi und auf der anderen Seite an meinen PC hänge, sehe ich mit Hterm keinen der benötigten Commands.
Vielleicht kann mir jemand von euch auf die Sprünge helfen.
Hier der Auszug meiner Doorpi.ini und der Arduino Sketch:
[keyboards]
arduinopins = usb_plain
[arduinopins_keyboard]
baudrate = 9600
bouncetime = 2000
input_max_size = 255
input_stop_flag = \n
output_stop_flag = ;
polarity = 0
port = /dev/ttyUSB0
pressed_on_keydown = True
[arduinopins_InputPins]
10000000 = out:Tueroeffner,1,0,3
11 = call:11 //Klingel1
12 = call:12 //Klingel2
555 = sleep:0 //Pong
99999 = sleep:0 //Door opener
[arduinopins_OutputPins]
1 = fixopen
2 = fixclose
3 = LichtAn
4 = LichtAus
5 = Ping //Output Ping
[EVENT_OnTimeMinuteEvenNumber]
10 = out:5,5 // Dieses Coomand sollte DoorPi abfeuern
20 = os_execute:/usr/local/etc/DoorPi/scripts/ping.sh
[EVENT_OnKeyPressed_arduinopins.555]
10 = os_execute:/usr/local/etc/DoorPi/scripts/pong.sh
Alles anzeigen
Und hier noch der Sketch, ab Linie 122 wird's interessand:
/***************************************************
DoorPi Arduino Extention with Biometric Access Control
by Sven Gaechter info@allround-service.biz
****************************************************/
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <Bounce2.h>
//#include <LED.h>
#include <RGBLED.h>
int getFingerprintIDez();
int warten = 250; // Anzahl, welche pro Fehler hinzugezählt wird
int fehler = 0; // Fehlervariable
int goScanPin = 4; // Leser starten
int whgPin1 = 5; // Klingeknopf Wohnung EG
int whgPin2 = 6; // Klingelknopf Wohnung OG
int overrideState = LOW; // Variable zur Überwachung des Daueröffnungsstatus
int string = 0; // Variable zum speichern der gesendeten Serial-Commands
int connectet = false; // Variable ist gesetzt, wenn Arduino und Raspberry Pi verbunden sind
int licht = 12; // Ausgang Türschildbeleuchtung
int hell=A0; //Fotowiderstand zur Bestimmung der Helligkeit
int lux=0; //Variamel zur Speicherung des Sensorwerts
String SerialString = ""; // a String to hold incoming data
boolean stringComplete = false; // whether the string is complete
int SerialInt = 0;
Bounce debounceScan = Bounce();
Bounce debounceWhg1 = Bounce();
Bounce debounceWhg2 = Bounce();
/*
LED greenLED = LED(11); // Gruene LED
LED redLED = LED(10); // Rote LED
LED blueLED = LED(9); // blaue LED
*/
RGBLED rgbLed(10,11,9,COMMON_CATHODE);
SoftwareSerial mySerial(2, 3);
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
// reserve 200 bytes for the inputString:
SerialString.reserve(200);
// set the data rate for the sensor serial port
finger.begin(57600);
pinMode(goScanPin, INPUT_PULLUP); // Taster um den Leser zu starten
debounceScan.attach(goScanPin);
debounceScan.interval(100); // interval in ms
pinMode(whgPin1, INPUT_PULLUP); // Taster um den Leser zu starten
debounceWhg1.attach(whgPin1);
debounceWhg1.interval(100); // interval in ms
pinMode(whgPin2, INPUT_PULLUP); // Taster um den Leser zu starten
debounceWhg2.attach(whgPin2);
debounceWhg2.interval(100); // interval in ms
pinMode(licht, OUTPUT); // Tuerschildbeleuchtung
Serial.write("DoorPiDuino");
Serial.flush();
}
void leser_an()
{
int time = 5000;
unsigned long previousMillis = millis();
while (millis() - previousMillis < time) {
if (getFingerprintIDez() > 0) {
Serial.println("010000000"); // Unterscheidungen könnten hiermit erreicht werden: + finger.fingerID);
//greenLED.blink(5000);
rgbLed.writeGreen(255);
delay(2000);
rgbLed.turnOff();
fehler = 0; //loescht den Fehlerspeicher wieder
}
else if (getFingerprintIDez() < 0) {
fehler ++;
//redLED.blink(fehler * 1000);
rgbLed.writeRed(255);
delay(fehler * 1000);
rgbLed.turnOff();
if (fehler < 4) {
leser_an();
}
else {
Serial.println("99999");
fehler = 0; //loescht den Fehlerspeicher wieder
}
}
}
}
void beleuchtung()
{
lux =analogRead(hell); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
// Serial.print("lux = " ); //Ausgabe am Serial-Monitor: Das Wort „Sensorwert: „
// Serial.println(lux); //Helligkeitsusgabe am Serial-Monitor.
if (lux < 200 ) //Wenn der Sensorwert über 512 beträgt….
{
digitalWrite(licht, HIGH); //…soll die LED leuchten…
// Serial.print("on " );
}
else //andernfalls…
{
digitalWrite(licht, LOW); //….soll sie nicht leuchten.
// Serial.print("off" );
}
}
void serialEvent()
{
while (Serial.available()) {
char inChar = (char)Serial.read(); // get the new byte
SerialString += inChar; // add it to the SerialString
if (inChar == ';') { // if the incoming character is a newline, set a flag so the main loop can do something about it \n
SerialInt = SerialString.toInt();
SerialString = "";
stringComplete = true;
}
}
}
/*
void statecheck()
{
}
void overridestate()
{
}
*/
void loop()
{
beleuchtung();
//statecheck();
// overridestate();
debounceScan.update();
debounceWhg1.update();
debounceWhg2.update();
if (debounceScan.fell() && overrideState == LOW ) {
Serial.println("555");
leser_an();
}
else if (debounceWhg1.fell()){
Serial.println(11);
rgbLed.writeColorWheel(5);
rgbLed.turnOff();
}
else if (debounceWhg2.fell()){
Serial.println(12);
rgbLed.writeColorWheel(5);
rgbLed.turnOff();
}
if (stringComplete) {
Serial.println(SerialInt);
if (SerialInt == 1) {
Serial.println("override");
fehler = 0;
overrideState = HIGH;
fehler = 0;
SerialInt = 0;
stringComplete = false;
}
else if (SerialInt == 2) {
Serial.println("override off");
overrideState = LOW;
SerialInt = 0;
stringComplete = false;
}
else if (SerialInt == 3) {
digitalWrite(licht, HIGH);
SerialInt = 0;
stringComplete = false;
}
else if (SerialInt == 4) {
digitalWrite(licht, LOW);
SerialInt = 0;
stringComplete = false;
}
else if (SerialInt == 5) {
delay(1000);
Serial.println("555");
rgbLed.writeGreen(255);
delay(40);
rgbLed.turnOff();
SerialInt = 0;
stringComplete = false;
}
}
if (overrideState == HIGH) {
rgbLed.writeColorWheel(50);
}
else rgbLed.turnOff();
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
break;
case FINGERPRINT_NOFINGER:
return p;
case FINGERPRINT_PACKETRECIEVEERR:
return p;
case FINGERPRINT_IMAGEFAIL:
return p;
default:
return p;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
break;
case FINGERPRINT_IMAGEMESS:
return p;
case FINGERPRINT_PACKETRECIEVEERR:
return p;
case FINGERPRINT_FEATUREFAIL:
return p;
case FINGERPRINT_INVALIDIMAGE:
return p;
default:
return p;
}
// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
return p;
} else {
return p;
}
}
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return 0;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
// found a match!
return finger.fingerID;
}
Alles anzeigen
Vielen Dank für die Hilfe.