Einmaliges ausführen eines Befehls (Arduino LOW;HIGH)

OP #5165749
Lesenswert?

Hi Leute,
ich habe mir hieran bereits ein Zahn aus gebissen und komm trotzdem
nicht weiter.
Der Pin A1 eines Arduino UNO, an welchen eine Lichtschranke
angeschlossen wurde, soll ausgelesen werden. Das klappt schon einmal.

Anschließend soll sobald ein HIGH Signal des Sensors vorliegt ein Servo
die Positionen 30° und 90° EINMAL anfahren, und anschließend soll
gewartet werden bis der Sensor wieder LOW ist.
Nachdem der Sensor erneut HIGH ist, soll der Servo die Positionen wieder
nur EINMAL anfahren u.s.w.


Das Problem ist das mein Servo die Positionen während einer HIGH Periode
100 mal anfährt.

Bitte helft mir. Ich bin am verzweifeln

Hier der Code:

_________________________________________

#include <Servo.h>
Servo servo1;

void setup() {
  servo1.attach(9);
}

void loop() {
  int sensorValue = analogRead(A1);

       if (A1==HIGH){
        servo1.write(30);
        delay (10);
        servo1.write(90);
        delay (10);
}
}
Gast #5165864
Lesenswert?

Raphael B. schrieb:
> Bitte helft mir.

Ein Bier trinken und schlafen gehen, dann erneut nachdenken.

Wenn Deine Schleife zu ende ist, was passiert?
Ja, sie wird erneut wieder durchlaufen und fährt wieder den Servo.

Was fehlt?
Die Abfrage auf High nach der Ausführung, in der so lange nichts getan 
wird, bis wieder low kommt!
Gast #5165956
Lesenswert?

Manfred schrieb:
> Da wurde eigentlich die Lösung schon geliefert:
> Christopher B. schrieb:
>> while (A1==HIGH);

Böse, böse. Da hängt der Prozessor.

Sinnvollerweise spendiert man sich eine Variable, um sich den alten 
Zustand des Pins z merken und bricht nur in Aktionismus aus, wenn der 
alte und der neue Zustand unterschiedlich sind.
Gast #5166023
Lesenswert?

Wenn das Code für die Arduino IDE sein soll,
würde ich noch ein paar Kleinigkeiten anpassen:
1
#include <Servo.h>
2
Servo servo1;
3

4
void setup() {
5
  servo1.attach(9);
6
  pinMode(A1, INPUT);   //Pin A1 auf Eingang setzen
7
}
8

9
void loop() {
10

11
  // int sensorValue = analogRead(A1); //Befehl ist hier überflüssig
12

13
  if (digitalRead(A1)==HIGH){    //Pin A1 Lesen
14
     servo1.write(30);
15
     delay (100);                //100ms
16
     servo1.write(90);
17
     delay (100);
18
     while (digitalRead(A1)==HIGH); //warte solange A1==HIGH
19
  }
20
}
#5166044
Lesenswert?

Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau 
dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht...

Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die 
Arduidioten einzuführen.

Da könnten sich die Kinder dann nach Herzenslust austoben, und die 
Anderen können sich wieder den ernsthaften Fragen der Elektronik 
zuwenden.
Gast #5166116
Lesenswert?

Eine  +Flanke von "pin"erkennen geht so :

If ((pin==high)&(alte_zustand==low)) +Flanke_erkannt=high;
else +Flanke_erkannt=low;
alte_zustand=pin;

Eine  -Flanke von "pin" erkennen geht so :

If ((pin==low)&(alte_zustand==high)) -Flanke_erkannt=high;
else -Flanke_erkannt=low;
alte_zustand=pin;

Wichtig : Diese variabele "+Flanke_erkannt" bleibt nur eine Durchlauf 
"high", dan geht sie wieder "Low" bis auf die naechtse +Flanke !!
Dieses Verfahren ist nicht "blocking" wie eine "While" schleife, und 
damit besser geeignet wen die µ-controller auch noch andere Tasks soll 
machen.
Gast #5166126
Lesenswert?

Wolfgang schrieb:
> Manfred schrieb:
>> Da wurde eigentlich die Lösung schon geliefert:
>> Christopher B. schrieb:
>>> while (A1==HIGH);
> Böse, böse. Da hängt der Prozessor.

Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange 
der Prof. nichts weiter zu tun hat ...

> Sinnvollerweise spendiert man sich eine Variable,

Richtig. Dann wird "Servo" bitte auch eine eigene Routine, die 
Hauptschleife fragt dann zyklisch den Schalter ab und springt diese nur 
zwecks Ausführung an.
Gast #5166190
Lesenswert?

Manfred schrieb:
>  while (A1==HIGH);
> Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange

A1 wird nie Null werden.
Auf einem UNO bleibt der Wert von A1 stocksteif auf 15.
Der Wert liegt im Flash. Damit ist er unveränderlich.


-------

Harry L. schrieb:
> Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau
> dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht...
>
> Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die
> Arduidioten einzuführen.
>
> Da könnten sich die Kinder dann nach Herzenslust austoben, und die
> Anderen können sich wieder den ernsthaften Fragen der Elektronik
> zuwenden.
Trump Fan?
#5166194
Lesenswert?

@Harry L. (mysth)

>Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau
>dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht...

naja, früher war alles besser ;-)

>Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die
>Arduidioten einzuführen.

>Da könnten sich die Kinder dann nach Herzenslust austoben, und die
>Anderen können sich wieder den ernsthaften Fragen der Elektronik
>zuwenden.

Gibt es doch schon! Nomen est Omen!

http://playground.arduino.cc/

"Let your children play", das wußten schon "The Doors"
#5166207
Lesenswert?

Manfred schrieb:
> Patrick J. schrieb:
>> Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des
>> Ende der Lichtschranke zu warten:
>> Eine State-Maschine/Endlicher Automat.
>
> Stifte keine Verwirrung, Raphael kaut erstmal an den Grundlagen.

Das heißt nicht, dass man ihm erstmal beibringt, es so zu machen, wie 
man es eigentlich nicht macht. Eine Statemachine ist hier aber etwas 
oversized. Aber das Programm zu blockieren, bis der Pin wieder low wird, 
ist nicht der richtige Weg, auch wenn es in der jetzigen Ausbaustufe 
noch nichts anderes zu tun hat. Er wird damit sehr schnell an die 
Grenzen kommen und muss dann wieder umdenken. Da kann man ihm auch 
gleich sagen, wie es richtig geht.
Gast #5166431
Lesenswert?

Erstmal Danke für die ganzen Beiträge.
Den Code den ich in den Chatt geschrieben habe, ist noch lange nicht 
fertig gewesen. Und das Problem welches mir bewusst war, war ja ebenda 
das die Bedingung immer wieder erneut eintritt.

Vielleicht sage ich nochmal etwas zum eigentlichen Projekt.

Es handelt sich hierbei um eine Ettiketiermaschiene mit einem Laufband.
 Wenn ein Produkt kommt soll ein Servo die 30° anfahren um so das 
Produkt zu etikettieren. Problem ist aber gewesen sobald das Produkt 
gekommen ist hat die Lichtschranke ein LOW signal gegeben solange das 
Produkt den Sensor Passiert hat. In der Zeit hat der Servo mehr als ein 
Ettiket rausgelassen weil die If Bedingung erneut abgefragt wurde und 
als TRUE bestätigt wurde. Ich habe daran schon alles mögliche mit While 
schleifen und so probiert, habe anschließend aber alles Sinnlose aus dem 
Code entnommen.

Nur mal so viel dazu

Also macht mich hier bitte nicht so runter mit Idiot und so. Schließlich 
habt ihr auch irgendwann mal mit Programmieren angefangen.

Trotzdem vielen Dank für die Lösungsvorschläge.
Gast #5166450
Lesenswert?

Arduino F. schrieb:
> Manfred schrieb:
>>  while (A1==HIGH);
>> Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange
> A1 wird nie Null werden.
> Auf einem UNO bleibt der Wert von A1 stocksteif auf 15.
> Der Wert liegt im Flash. Damit ist er unveränderlich.

Was habe ich da übersehen? Wie ich die Frage interpretiere, liegt der 
Sensor als Schalter an A1. Auch einen A-Anschluß der Arduinos kann man 
digital verwenden, habe ich erst neulich getestet, weil meine D-Pins 
knapp wurden.

Dann sollte doch, wenn A1 nicht High ist, die while-Schleife verlassen 
werden?

Ich sehe gerade am Anfang:
"int sensorValue = analogRead(A1);"

siehst Du da den Störenfried, werden ab da nur noch Analogwerte 
geliefert, die man auf 0..1023 abfragen müsste?
Gast #5166481
Lesenswert?

Raphael schrieb:
> Ahh stimmt habs grade im Seriel Monitor abgefragt. Jip er liefert mir
> immer eine 43 für ein Low signal und eine 1223 für ein HIGH Signal.

Serial Monitor - gut, dann kennst Du also die Möglichkeit, den zu 
benutzen. 1223 wird er nicht liefern, 1023.

Warum setzt Du den Sensor nicht auf einen Digitalport?

Wenn die Schranke am Analogpin bleiben muss:
Vorne deklarieren: "pinMode (Schranke, INPUT);"
und dann "(digitalRead(A1) == HIGH)" sollte auch klappen,
#5166510
Lesenswert?

Manfred schrieb:
> Arduino F. schrieb:
>> Manfred schrieb:
>>>  while (A1==HIGH);
>>> Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange
>> A1 wird nie Null werden.
>> Auf einem UNO bleibt der Wert von A1 stocksteif auf 15.
>> Der Wert liegt im Flash. Damit ist er unveränderlich.
>
> Was habe ich da übersehen?

Dass A1 eine Konstante ist, genau wie HIGH.

> Wie ich die Frage interpretiere, liegt der Sensor als Schalter an A1.

An Pin A1, für dessen Identifikation eine Konstante namens A1 definiert 
ist. Es macht aber wenig Sinn, die Nummer des Pins mit HIGH zu 
vergleichen. Man muss schon erstmal seinen Status auslesen.

> Ich sehe gerade am Anfang:
> "int sensorValue = analogRead(A1);"
>
> siehst Du da den Störenfried, werden ab da nur noch Analogwerte
> geliefert, die man auf 0..1023 abfragen müsste?

Eher umgekehrt: Hier wird auch wirklich der Wert gelesen und nicht nur 
seine Nummer verwendet.
Gast #5166572
Lesenswert?

Manfred schrieb:
> Ich sehe gerade am Anfang:
> "int sensorValue = analogRead(A1);"
Es macht keinen Sinn, digitale Werte, analog zu lesen.
A1 kann auch digital verwendet werden.

Manfred schrieb:
> Vorne deklarieren: "pinMode (Schranke, INPUT);"
> und dann "(digitalRead(A1) == HIGH)" sollte auch klappen,
So ist es!
Wobei man sich das " == HIGH" durchaus einsparen kann.

Rolf M. schrieb:
> Dass A1 eine Konstante ist, genau wie HIGH.
So ist es.
Gast #5166617
Lesenswert?

Rolf M. schrieb:
>> Was habe ich da übersehen?
> Dass A1 eine Konstante ist, genau wie HIGH.
Jou, danke! Ich sollte keinen fremden Programmkot anschauen.

Da habe ich mir mal etwas kopiert:
"Wenn Du einen analogen Eingang mit pinMode als digitalen Ein/Ausgang 
definierst werden aus A0 bis A5 die Pins 14 bis 19."

Die Abfrage heisst dann also nicht digitalRead(A1), sondern 
"digitalRead(14)"
#5167106
Lesenswert?

Hi

Manfred schrieb:
> Patrick J. schrieb:
>> Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des
>> Ende der Lichtschranke zu warten:
>> Eine State-Maschine/Endlicher Automat.
>
> Stifte keine Verwirrung, Raphael kaut erstmal an den Grundlagen. Das ist
> der Weg, so etwa ging das bei mir auch los.
>
> Da wurde eigentlich die Lösung schon geliefert:
> Christopher B. schrieb:
>> while (A1==HIGH);

Nicht, daß ich dadurch schlaflose Nächte bekomme - aber warum war mein 
Post 'nicht lesenswert'?

Vll. in diesem konkreten Beispiel nicht das beste Mittel der Wahl - da 
die Maschine akut wohl läuft, stört das blockierende 'auf den Pin 
warten' ja auch nicht - hmm, in diesem Sinn war der Post 'nicht das 
Lesen wert', aber trotzdem nicht 'nicht lesenswert' - entgegen einer 
ganzen Menge anderer Ergüsse dieses Fadens.

@Raphael
Glückwunsch zum ersten Projekt!
Wenn Du jetzt noch Deinen Code rausrücken würdest, hätten folgende 
Fragende vll. direkt Ihre Antwort.

MfG
Gast #5167296
Lesenswert?

> warum war mein Post 'nicht lesenswert'?

Frag nicht. Die Bewertungen beziehen sich nicht immer auf den Beitrag 
selbst. Oft bewerten sie, ob jemand die Idee toll findet. Manchmal 
bewerten Leute damit auch die Person. Und manchmal steckt einfach gar 
nichts ernsthaftes dahinter.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren