wollte jetzt mal selbst versuchen eine Hühnerklappe zu programmieren und bin kläglich gescheitert.
Könnte mal jemand über mein Programm schauen und mir erklären wo mein Denkfehler ist?
Hänge da jetzt schon mehrere Tage fest und habe schon alles mögliche probiert, mir geht es nicht darum das mir jemand ein Programm fertig schreibt(Könnte ich auch Downloaden) , ich will nur Wissen was ICH in meinem Programm falsch mache. Die Klappe hat 2 Taster(oben und unten). Wenn der Sensor Licht misst und die Türe geschlossen ist(unterer Taster High) soll der Stepper 2 Umdrehungen machen. umgekehrt das selbe. Die LED´s sollen die Position anzeigen und bei Problemen blinken.
Ich hoffe ihr könnt mir helfen.
#include <Stepper.h> //Stepper Bibliothek
int SPU = 2048;
Stepper Motor (SPU, 3,5,4, 6); //Motor erh?lt Pins 8-11
int sensorWert = A0; //
int LEDgruen = 9;
int LEDrot = 8 ;
int Sensoroben = 11 ; //Sensor oben
int Sensorunten = 12 ; //Sensor unten
void setup ()
{
Motor.setSpeed (5); //Motorgeschwindigkeit
Serial.begin (9600); //serieller Monitor
pinMode (LEDgruen, OUTPUT); //LED auf Ausgang
pinMode (LEDrot, OUTPUT);
}
void loop ()
{
Sensoroben = digitalRead(Sensoroben);
Sensorunten = digitalRead(Sensorunten);
sensorWert = analogRead(sensorWert);
Serial.print ("LichsensorWert=");
Serial.println (sensorWert);
if
((analogRead(sensorWert) <= 150) && ( digitalRead(Sensoroben) == LOW)&&( digitalRead(Sensorunten)==HIGH)) {//wenn der SensorWert ?ber 100 ist und T?re Unten...
//delay(3600000)
Motor.step (4100);
}
else
if
((analogRead(sensorWert) >= 151) && ( digitalRead(Sensorunten) == LOW) && (digitalRead(Sensoroben)==HIGH)) {//Wenn der Sensorwert unter 100 ist und T?r oben...
Motor.step (-4100);
}
else
if
((digitalRead(Sensorunten)==LOW )&&( analogRead(sensorWert)<= 150)&& (digitalRead(Sensoroben)==HIGH)) {
digitalWrite(LEDrot,HIGH);
}
else
if
((digitalRead(Sensoroben)==LOW)&&( analogRead(sensorWert) >= 151) && (digitalRead(Sensorunten)==HIGH)) {
digitalWrite(LEDgruen,HIGH);
}
else
{
digitalWrite(LEDgruen,HIGH);
delay(1000);
digitalWrite(LEDgruen,LOW);
digitalWrite(LEDrot,HIGH);
delay(1000);
digitalWrite(LEDrot,LOW);
}
}
Natürlich Entschuldigung.
Die LED´s blinken ständig nur, so als ob er das vorherige alles einfach überspringen würde obwohl ich die Schalter,Lichtquelle, etc... betätige.
eine Frage hätte ich noch:
in dem Pseudocode oben von Hotsystem stehen mehrere if´s nacheinander, ich dachte es darf nur beim ersten "if" ,und dann muss es "if else" heissen?
Wieso darf ?
Wenn du Werte in die Abfrage schreibst, geht das auch so.
Ich hätte es gern ausführlicher gemacht, aber mobil ist das alles sehr umständlich.
Du kannst beides machen.
Sicher gibt es einen Grund, wenn du " if else" nutzen musst, den kann ich dir leider nicht nennen.
Aber es kommt sicher jemand vorbei, der es genau begründen kann.
mach_b() wird ausgeführt wenn b true ist, egal ob vorher mach_a() dran kam oder nicht.
if (a) mach_a();
else if (b) mach_b();
else mach_nix();
es wird genau 1 Funktion ausgeführt, entweder mach_a() oder mach_b() oder mach_nix(). ( Priorität a vor b: Wenn a true ist, wird b gar nicht mehr geprüft )
Wenn die eine IF-Abfrage geschlossen ist, kannst Du natürlich eine neue IF da drunter setzen.
if (farbe==blau){
digitalWrite(ledblau,HIGH);
} else {
digitalWrite(ledblau,LOW);
}
if (uhrzeit>1200){
if (anzeige==0) {
serial.println("12:00");
anzeige=1;
}
}else{
anzeige=0;
}
Nicht sonderlich sinnvoll, aber zwei eigenständige IF untereinander.
Da Deine Klappe Licht-Abhängig ist, würde ich Das auch so programmieren:
//Pseudocode
... lese Sensoren ein ...
if (Helligkeit>=Schwellwert){
if (klappezu==geschlossen){
stepper.run(richtung_auf);
}
}else{ //Helligkeit kleiner oder gleich der Schwelle
if (klappeauf!=geschlossen){
stepper.run(Richtung_zu);
}
}
Dabei musst Du aber ggf. mithalten, ob die Klappe nicht schon VOR dem Ende der Drehung offen/geschlossen ist.
Wenn's nur das aller erste Anfahren ist, wo 'kein Mensch weiß, wie der Stepper steht', würde ich 'so lange fahren, bis AUF erreicht' - bzw. 'so lange fahren, bis ZU erreicht' - begrenzt duerch eine Step-Anzahl, Die ca. eine Umdrehung 'Luft' gewährt.
Sollte Dir Mal einer der Klappen-Sensoren 'verloren' gehen (hörte schon Einiges über Hühner ...), dreht der Stepper nicht die nächsten zwei Stunden und wickelt den Seilzug zu einem schönen Knoten zusammen, sondern bleibt nach 'Zu + eine Umdrehung' stehen.
erstmal nochmal danke für eure Hilfe. Habe lange überlegt in welchem Forum ich mich anmelde .Gibt ja leider auch genug wo man nur blöd angemacht wird und keine Hilfe bekommt.
Hier war bis jetzt alles top, also nochmal danke.
Habe jetzt mal ein wenig mit “bool” herumprobiert. Leider findet man recht wenig deutschsprachige Infos dazu. Ich bin zwar des englischen mächtig, allerdings hackt es bei Fachausdrücken leider noch.
Anbei mein Programm. Irgendwie ist (immernoch) der Wurm drin.
Wo liegt mein Fehler?
Beim Hochladen dreht er manchmal und manchmal leuchtet nur die rote Diode . ich komm nicht drauf.
#include <Stepper.h> //Stepper Bibliothek
int SPU = 2048;
Stepper Motor (SPU, 3,5,4, 6); //Motor erh?lt Pins 8-11
int eingang = A0; //
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Start
int LEDgruen = 9;
int LEDrot = 8 ;
byte Sensoroben = 11 ; //Sensor oben
byte Sensorunten = 12 ; //Sensor unten
bool posOben = false;
bool posUnten = false;
void setup ()
{
Motor.setSpeed (5); //Motorgeschwindigkeit
Serial.begin (9600); //serieller Monitor
pinMode (LEDgruen, OUTPUT); //LED auf Ausgang
pinMode (LEDrot, OUTPUT);
}
void loop ()
{
posOben = digitalRead(Sensoroben);
posUnten = digitalRead(Sensorunten);
sensorWert = analogRead(eingang);
Serial.print ("LichsensorWert=");
Serial.println (sensorWert);
if (sensorWert<= 150)
{
if (!posOben && posUnten)
{
Motor.step (4100);
}
}
if (sensorWert >= 151)
{
if(posOben && !posUnten)
{
Motor.step (-4100);
}
}
if (sensorWert <= 150)
{
if (posOben && !posUnten)
{
digitalWrite(LEDgruen,HIGH);
}
}
if (sensorWert >= 150)
{
if (!posOben && posUnten)
{
digitalWrite(LEDrot,HIGH);
}
}
else
{
digitalWrite(LEDgruen,HIGH);
delay(1000);
digitalWrite(LEDgruen,LOW);
digitalWrite(LEDrot,HIGH);
delay(1000);
digitalWrite(LEDrot,LOW);
}
}