nacheinander Abfrage für Auslösung

Hallo,

wie Programmiere ich in folgenden Code um das erst der Freuchigkeitssensor ausgelöst werden muss und der Motor in eine Richtung dreht und dann muss der Taster gedrückt werden das der Motor in die andere Richtung dreht und dann erst wieder der Feuchtigkeitssensor.

Aktuell ist es so, dass egal welche Auslösung man drückt dreht er sich. Dies soll aber nicht so sein, sondern immer nacheinander.

Habt ihr vielleicht eine Idee.

Hier der Aktuelle Code von uns:

#include <Stepper.h>

int SPMU = 32;
int messwert=0;
const int tasterPin=11;
bool tasterStatus;

Stepper myStepper(SPMU, 2,3,4,5);        

void setup(){

  Serial.begin(9600);
 
  pinMode (tasterPin,INPUT);
 
  myStepper.setSpeed(500);

}

void loop() {


  messwert=analogRead(A4);

 Serial.print("Feuchtigkeits-Messwert:");

 Serial.println(messwert);


if (messwert > 200 ){
 
 myStepper.step(2048);

}

 tasterStatus=digitalRead(tasterPin);

if (tasterStatus == HIGH )

 myStepper.step(-2048);

}

Danke schon mal für die Hilfe.

Kommt mir das Thema nicht irgendwie bekannt vor? Hier hatte ich etwas geschrieben, was ich im aktuellen Programm nicht finden kann. Ist aber der springende Punkt.

Wenn du den Taster auf HIGH prüfst, dann braucht der Port einen Pulldown und sollte auch im Setup auf LOW gesetzt werden.

agmue:
Kommt mir das Thema nicht irgendwie bekannt vor? Hier hatte ich etwas geschrieben, was ich im aktuellen Programm nicht finden kann. Ist aber der springende Punkt.

Ja das haben wir probiert aber der Sketch zeigt irgendwie einen fehler an. Könntest du uns hier evtl zeigen wie der Code richtig lauten muss (komplett)

So habe ich die Logik getestet:

#include <Stepper.h>

int SPMU = 32;
int messwert = 400;
const int tasterPin = 11;
bool tasterStatus;
bool altWertFs = true;

Stepper myStepper(SPMU, 2, 3, 4, 5);

void setup() {
  Serial.begin(9600);
  pinMode (tasterPin, INPUT_PULLUP);
  myStepper.setSpeed(500);
}

void loop() {
  //  messwert = analogRead(A4);
  int m = Serial.parseInt();
  if (m > 0) messwert = m;
  Serial.print("Feuchtigkeits-Messwert:");
  Serial.println(messwert);
  if ((messwert < 200 ) && !altWertFs) {
    Serial.print("dreht positiv Start");
    myStepper.step(2048);
    Serial.println("  Stop");
  }
  altWertFs = messwert < 200;

  tasterStatus = digitalRead(tasterPin);
  if (tasterStatus == HIGH ) {
    Serial.print("dreht negativ Start");
    myStepper.step(-2048);
    Serial.println("  Stop");
  }
}

Jetzt geht irgendwie gar nix mehr...

TanjaGoldrain:
Jetzt geht irgendwie gar nix mehr...

Das ist leider zu unspezifisch, um darauf reagieren zu können.

Ich mache jetzt das :sleeping:

Der Sketch lässt sich zwar Hochladen, doch der Motor dreht sich weder in die eine Richtung noch in die andere Richtung, sprich er regiert jetzt auf keine Auslösung mehr.

So soll es sein :slight_smile:

Was zeigt der serielle Monitor, wenn du "100" eingibst?

Wenn der Sensor mitspielen soll, dann ändern

  messwert = analogRead(A4);
  // int m = Serial.parseInt();

Ich habe keinen Sensor zum Testen, daher nutze ich den seriellen Monitor der IDE zur Eingabe von Meßwerten.

Hmmm da kommt wieder die Fehlermeldung.....

Anscheinend packen wir die Änderung an die falsch Stelle.....

Also der Feuchtikeitssensor soll/muss als erstes aus gelöst werden. Dann der Taster.

Zum Monitor können wir dir nicht viel sagen der ist bei uns nicht angeschlossen. Wir testen es gleich in der Schaltung.

Hallo,

du möchtest folgendes?

Feuchtesensor auslesen, wenn > 200, dann dreht Motor
Programm soll jetzt auf Tastendruck warten, wenn gedrückt, Motor dreht anders herum
wenn das erfolgt ist, darf wieder der Sensor ausgelesen werden und der Motor wieder richtig herum drehen.

So korrekt? Wenn ja, erkläre ich dir was dein Programm aktuell wirklich macht.

TanjaGoldrain:
Zum Monitor können wir dir nicht viel sagen der ist bei uns nicht angeschlossen. Wir testen es gleich in der Schaltung.

Ist es immer noch der Nano? Der hat doch eine USB-Schnittstelle, über die er mittels IDE programmiert wird, oder wie machst Du das? In der IDE, ich habe 1.6.5, dann "Werkzeuge/Serieller Monitor".

Ja ist der Nano und ja soweit sind wir in das Programm nicht eingedrungen :wink:

@Doc_Arduino ist so in etwa korrekt.

Ziel: Der Motor draf sich nicht doppelt drehen und anfangen muss es mit dem Feuchtigkeitssensor

Mein Sketch hat Kontrollausgaben, da ich ja nicht Deine Hardware habe. Das sieht dann so aus:

Feuchtigkeits-Messwert:400
Feuchtigkeits-Messwert:400
Feuchtigkeits-Messwert:400
Feuchtigkeits-Messwert:100
dreht positiv Start Stop
Feuchtigkeits-Messwert:100
Feuchtigkeits-Messwert:100
dreht negativ Start Stop
Feuchtigkeits-Messwert:100
Feuchtigkeits-Messwert:100
Feuchtigkeits-Messwert:100
Feuchtigkeits-Messwert:400
Feuchtigkeits-Messwert:400

Zwischen "Start" und "Stop" vergeht immer etwas Zeit. Bei mir "dreht" also der Motor.
Wenn das bei Dir anders aussieht, wäre eine Fehlersuche notwendig.

Hallo,

auch wenn sich argmue schon mächtig ins Zeug legt, sollte man dir erstmal dein Problem im Code erklären. Sonst nützt das wohl alles nichts. Ich habe dafür 3 Dinge rot markiert.

Das steht alles in der loop. Die loop wird ständig ohne Pause durchlaufen von oben nach unten, springt wieder nach oben und arbeitet wieder alles nach unten ab.
Das bedeutet für deinen Code. Das auch ebenfalls ständig der Feuchtesensor ausgelesen wird und wenn sein Meßwert > 200 ist, dann wird damit auch jedesmal der Motor angesteuert. Klingt logisch, oder? :slight_smile:

Und wenn du in der IDE den seriellen Monitor öffnen würdest, dann bekommst Du ohne Pause die Serial.print Ausgaben. Hättest du das mal probiert und nicht nur reingeschrieben, wäre dir das gesagte dabei schon aufgefallen.

Desweiteren fragst Du ständig den Taster ab. Erstmal richtig, auch wenn noch die Entprellung fehlt, wobei die bestimmt vom myStepper verdeckt wird. Und hast du einen Pulldown Widerstand dran oder nicht?
Erst wenn der Tasterpegel High ist, dreht für diesen Moment der Motor anders herum. Ist der Taster nicht mehr gedrückt, was passiert dann? Richtig, dann erfolgt wieder die Abfrage Meßwert > 200, wenn ja, Motor dreht wieder fleißig in die vorherige Richtung.

Programmablauf verstanden? Problem erkannt?

@ agmue: du mußt auch daran denken das der Meßwert zappeln kann. Ich würde nicht mit einem vorherigen Meßwert vergleichen. Ich würde bool Statusvariablen einsetzen.

Doc_Arduino:
@ agmue: du mußt auch daran denken das der Meßwert zappeln kann. Ich würde nicht mit einem vorherigen Meßwert vergleichen. Ich würde bool Statusvariablen einsetzen.

bool altWertFs = true;
...
if ((messwert < 200 ) && !altWertFs) 
...
altWertFs = messwert < 200;

Wo vergleiche ich mit einem vorherigen Meßwert?

Hallo,

upps, beim überfliegen falsch gelesen. Entschuldigung.

Danke erstmal an agmue und auch an Doc Arduino für die tatkräftige Unterstützung :wink:

Wir haben jetzt ca. 1 Woche das Programm, da stellt man sich am Anfang natürlich etwas blöd an. Ok den Monitor haben wir jetzt auch gefunden. Habe jetzt auch den Fehler im Sketch gefunden.

Und wenn ich die Aussage von Doc richtig verstehe geht es nicht wirklich die Abfrage nacheinander zu legen da der Sketch den Taster und den Feuchtigkeit Sensor permanent ausliest. Sobald halt eine neue "Auslösung" erfolgt, dreht der Motor in die entsprechende Richtung.

Korrekt formuliert?

Da wir wie gesagt noch nicht so viel Ahnung haben, kann man dieses umgehen oder nicht?

Danke und wir hoffen das ihr nicht mit uns Verzweifelt.

TanjaGoldrain:
Ok den Monitor haben wir jetzt auch gefunden. Habe jetzt auch den Fehler im Sketch gefunden.

Einen Schritt weiter :slight_smile:

Siehst Du denn auch, was ich sehe? Was zeigt der Monitor?

agmue:
Einen Schritt weiter :slight_smile:

Siehst Du denn auch, was ich sehe? Was zeigt der Monitor?

Nein, nicht ganz. Hab den Code noch mal angepasst, da der Messwert sich bei uns nicht verändert hatte.

Hier der Code:

#include <Stepper.h>

int SPMU = 32;
int messwert = 0;
const int tasterPin = 11;
bool tasterStatus;
bool altWertFs = true;

Stepper myStepper(SPMU, 2, 3, 4, 5);

void setup() {
Serial.begin(9600);
pinMode (tasterPin, INPUT_PULLUP);
myStepper.setSpeed(500);
}

void loop() {
messwert = analogRead(A4);
int m = Serial.parseInt();
if (m > 0) messwert = m;
Serial.print("Feuchtigkeits-Messwert:");
Serial.println(messwert);
if ((messwert > 50 ) && !altWertFs) {
Serial.print("dreht positiv Start");
myStepper.step(2048);
Serial.println(" Stop");
}
altWertFs = messwert > 50;

tasterStatus = digitalRead(tasterPin);
if (tasterStatus == HIGH ) {
Serial.print("dreht negativ Start");
myStepper.step(-2048);
Serial.println(" Stop");
}
}