Hallo
Ich habe eine Frage und zwar ist es möglich eine If Bedingung abzufragen wie zum Beispiel
ifdigitalRead(pirPin) == HIGH) dann soll ein Servo warten bis der T1 gedrückt wird und anschliessend drehen. Kann mir jemand weiterhelfen? Bzw einen kleine Beispiel Code schreiben.
void loop() {
if (digitalRead(pirPin) == HIGH) {
************************ Hier sollte er warten bis der Taster t1 gedrückt wird
void loop()
{
if (digitalRead(pirPin) == HIGH)
{
// assuming that "T1" is INPUT_PULLUP
// Wir nehmen an, dass "T1" INPUT_PULLUP ist
do
{
T1result = digitalRead(T1);
} while (T1 == HIGH);
Servo1.attach(22);
Servo1.write(180);
// delay(1000);
}
}
Hallo,
sollte das nicht auch ein Eingang sein.
Mir ist Deine Logik noch nicht klar. Letztlich müssen beide Bedingungen erfüllt sein damit der Motor dreht. Warum dann nicht gleich logisch AND vergknüpfen. Wenn die Eingänge zeitlich hintereinander kommen, dann ist das ein fester Ablauf damit ist einen Ablaufsteuerung (Schrittkette ) die einen Lösung.
1 warten auf Taster 1
2. warten auf Pir
3 Servo verfahren
4 zurück auf 1
Hallo ich habe es auch schon versucht mit der and Bedingung also
if(Bedingung1 = HIGH) && Bedingung 2 = HIGH) ;
Servo.write(180) usw)
Jetzt ist aber das Problem damit ich denn Taster unmittelbar danach drücken muss deshalb habe ich gedacht könnte es mit wait until oder so gehen.
Zum Verständnis es soll ein Snackautomat werden und wenn eine Münze vor dem Sensor vorbei geht gibt der ein Signal an den Servo und so kann man einen von 4 Snacks auswählen. Wenn man nur denn taster drückt soll er sich nicht drehen.
Hallo
also eine feste Schrittkette wobei im schritt 2 einen Auswahl aus 4 erfolgen kann.
Such mal nach Ablaufsteuerung , Schrittkette, endlicher Automat hier im Forum das gibt jede Menge Beispiele die Du ein bisschen anpassen mußt.
Vergess delay() eventuell willst Du ja gleichzeitig noch einen LED blinken lassen
würde beitragen, wenn die Beschaltung bekannt wäre.
Wenn Du keine externen Widerstände hast, geht das nicht.
Ich habs trotzdem gebaut - weil ich darauf vertraue, das Du das wenigstens elektrisch so aufgebaut hast, das es funktioniert.
#include <Servo.h> //Servo Datei von Arduino hinzugefügt
Servo Servo1;
const byte pirPin = 9;
const byte tastPin = 52;
bool lastPir = false; // Merker für Restart
bool pirTrue = false; // Merker für Servo
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(pirPin, INPUT); // setzt voraus, das extern beschalten!
pinMode(tastPin, INPUT);// setzt voraus, das extern beschalten!
Servo1.attach(22);
}
void loop()
{
if (lastPir == false && pirTrue == false) // Nur wenn beide gelöscht
{
// Hier könnte der Servo zurück gestellt werden
if (digitalRead(pirPin) == HIGH)
{
pirTrue = true;
lastPir = true;
}
}
if (pirTrue == true && tastPin == HIGH) // Pir ausgelöst und Taste ausgelöst
{
Servo1.write(180);
pirTrue = false; // lösche Merker für Servo
}
if (lastPir == true && digitalRead(pirPin) == LOW) // ausgelöst und PIR nicht mehr ausgelöst
{
lastPir = false; // lösche Merker für Pir
}
}
Du machst einen gravierenden Denkfehler. Das ist die falsche Programmlogik.
Es ist grundsätzlich falsch ein Program anzuhalten (in einer Schleife zu blockieren) solange bis ein Event auftritt.
Die richtige Logik ist daß der Sketch die Events abfragt und dementsprechend reagiert. Nur so kann zB nach 1 Minute ohne Auswahl die Münze zurückgegeben werden oder ein Rückgabeknopf eingebunden werden.
Die Methode wurde bereits erwähnt: Schrittkette.
Der Sketch loopt dauernd und je nach Zustand ( warten auf Geldeinwurf, warten auf Auswahl, warten auf Rückgabe, Ausgabe Text ecc.) hat die Zustandsvariable einen anderen wert und wird ein anderer Teil zB einer Swicht-case Kontrollstruktur abgearbeitet.
Hallo,
hab mal in meiner Bastelkiste gesucht und eine Variante mit einer "standard Schrittkette" etwas angepasst. Wenn Du das verstanden hast wirst Du das leicht erweitern können.
Heinz
/* Beispiel Schrittkette
* Tasater gehen Gnd geschaltet
*/
#include <Servo.h>
const byte btnStart = 2;
const byte btnsel1 = 3;
const byte btnsel2 = 4;
uint32_t vorhin;
// Ablauf festlegen
enum zustand {aus = 1, auswahl, ende};
zustand ablauf = aus;
Servo Servo1;
Servo Servo2;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(btnStart, INPUT_PULLUP); // Schalter schalten gegen GND
pinMode(btnsel1, INPUT_PULLUP);
pinMode(btnsel2, INPUT_PULLUP);
Servo1.attach(10);
Servo2.attach(11);
Servo1.write(0);
Servo2.write(0);
}
void loop() {
// put your main code here, to run repeatedly:
switch (ablauf) {
case aus:
if (digitalRead(btnStart) == false) { // Starttaster gedrückt
Serial.println("Start");
ablauf = auswahl;
}
break;
case auswahl:
if (digitalRead(btnsel1) == false) {
Serial.println("Auswahl prog 1 starten");
Servo1.write(180);
ablauf = ende;
vorhin = millis();
}
if (digitalRead(btnsel2) == false) {
Serial.println("Auswahl prog 2 starten");
Servo2.write(180);
ablauf = ende;
vorhin = millis();
}
break;
case ende:
if (millis() - vorhin >= 2000) {
ablauf = aus;
Serial.println("Prog ende");
Servo1.write(0);
Servo2.write(0);
}
break;
}
}
Ich habe nochmals probiert einen Code zu schreiben. Er funktioniert nicht. Wo liegt der Fehler und wo sollte ich noch die Verzögerung einbauen, damit man nach dem Münzeinwurf Zeit hat um den Snack auszuwählen und anschliessend den Taster zu betätigen?
Hallo,
was erwartest Du denn von Deinem Code.
Ich sehe keine Taster und keine Lichtschranke auf Deinem Foto
die Anzeige sollte funktionieren
Wenn Du die Lichtschranke gleichzeitig mit einem Taster betätigst sollte auch der Servo einmal auf Pos 0 fahren. Zurück fährt er ja nicht da gibts ja nichts für. Wenn er also schon auf 0 steht wird er sich auch nicht davon weg bewegen.
Ich werde auch aus den Tastern nicht schlau , schaltet der nun nach plus oder nach minus. der Pir sollte doch auch ein Eingang sein , das hast Du ja immer noch falsch.
Lese mal was Dir geschrieben wurde .
@my_xy_projekt meint den post nummer 9 mit seinem Vorschlag
Heinz
Das Foto soll nur die Verkabelung des LCD Displays darstellen . Den Code von #9 habe ich ausprobiert und er funktioniert nicht. Du schreibst ja etwas von Widerständen wo sollten die genau eingebaut werden?
Von meinem Code erwarte ich dass wenn ich den Taster T1, T2, T3, T4 drücke das nur auf dem Display Snack Auswählen steht.
Wenn der Sensor aktiviert ist soll man Zeit haben einer der 4 Snacks auszuwählen. Deshalb kann ich ja keine if Schleife mit && Brauchen da man Beides sofort machen muss, also Snack auswählen und Münze einwerfen. Das Ziel ist es das man nach dem Münzeinwurf Zeit hat um den Snack auszuwählen und anschliessend soll sich der Servo drehen damit der Riegel rausfällt.