Hallo,
ich versuche seit Stunden den Fehler zu finden ....
Ich arbeite an einem Programm für einen Piezo Klopf Sensor. Wenn der richtige Code geklopft wird, soll ein Servo ein Schloss freigeben. Der Servo funktioniert und wird im setup einmal hin- und her gefahren. Wenn der richtige Code erkannt wird, bewegt sich der Servo allerdings nicht. Dass Programm durchläuft den Programmteil, das sehe ich an der seriellen Ausgabe.
Hier das komplette Programm
#include <Servo.h>
/* Piezo Klopf Sensor - Piezo mit R=10k und C=10n parallel an A0 *
Empfindlichkeit mir AnalogReadSerial ausprobieren */
Servo myservo;
int state=0;
int knocks;
byte code=0b110000;
byte testcode;
unsigned long startm, startl;
unsigned long dauer;
unsigned int duration[6];
void setup() {
Serial.begin(115200);
Serial.println("Knock Sensor detect");
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo.write(0); // test servo
delay(800);
myservo.write(180); // Ausgangsposition
}
void loop() {
switch (state) {
case 0: // initial loop for first detection
if ((millis()-startm)>2000){
knocks=0;
}
if (analogRead(A0)>50) {
while (analogRead(A0)>10) {
}
startl=startm;
startm=millis();
/* Serial.print("Knock ");
Serial.print(knocks);
Serial.print(" erkannt - ");
Serial.print(startm-startl);
Serial.println(" Pause");*/
duration[knocks]=startm-startl;
knocks++;
if (knocks>=7) {
state=1;
knocks=0;
}
}
break;
case 1: // detect knocks and check if valid
int groesster = 0;
int kleinster = 1023;
for (int i=1;i<=6;i++) {
if (duration[i]>groesster) groesster=duration[i];
if (duration[i]<kleinster) kleinster=duration[i];
Serial.print(duration[i]);
Serial.print("\t");
}
Serial.println();
Serial.print(kleinster);
Serial.print("\t");
Serial.println(groesster);
int kleinster_plus=kleinster+(kleinster>>2);
int groesster_minus=groesster-(groesster>>2);
Serial.print(kleinster_plus);
Serial.print("\t");
Serial.println(groesster_minus);
for (int i=1;i<=6;i++) { // 1=lang, 0=kurz
if (duration[i]==groesster) Serial.print("i");
else if (duration[i]==kleinster) Serial.print("o");
else if (duration[i]>=groesster_minus) Serial.print("1");
else if (duration[i]<=kleinster_plus) Serial.print("0");
}
Serial.println();
for (int i=1;i<=6;i++) { // 1=lang, 0=kurz
testcode <<= 1;
if (duration[i]==groesster) testcode |= 0b00000001;
else if (duration[i]==kleinster) testcode &= 0b1111110;
else if (duration[i]>=groesster_minus) testcode |= 0b00000001;
else if (duration[i]<=kleinster_plus) testcode &= 0b1111110;
}
Serial.println(testcode,BIN);
Serial.println();
if (testcode==code) {
myservo.write(0); // open
Serial.println("Safe open");
delay(800);
myservo.write(180); // close
delay(1000);
}
state=0;
break;
}
}
Die Stelle, wo der Servo sich nicht bewegt ist
if (testcode==code) {
myservo.write(0); // open
Serial.println("Safe open");
delay(800);
myservo.write(180); // close
delay(1000);
}
Wie gesagt: die Ausgabe "Safe open" wird seriell ausgegeben
Wer weiß Rat ?
Gruß
Reinhard