Schrittmotor Feuchtigkeitssensor Taster

Hallo ich beschäftige mich seit kurzem mit dem Arduino.
Also auf deutsch ich hab noch nicht viel Ahnung.

Ich habe mir ein Starterset min einem Nano bestellten und schon einige Sachen erfolgreich hin bekommen nun aber bin ich an meine Grenzen geraten.

Ich will eine Schaltung mit einem Schrittmotor einem Feuchtigkeitssensor und einem Taster bauen.
Diese Wie folgt funktionieren soll.

Wenn der Feuchtigkeitssensor anschlägt soll der Schrittmotor ein paar Steps in eine Richtung drehen und dann Stehen bleiben und wenn der Taster gedrückt wird soll der Motor die gleich Anzahl an Steps wieder zurück drehen und Stehen bleiben.

Hab leider keine Ahnung wie ich das Programmieren soll. :confused:

TanjaGoldrain:
... Hab leider keine Ahnung wie ich das Programmieren soll. :confused: ...

Meine Erfahrung ist, dass ich Algorithmen viel leichter verstehen und umsetzen kann, wenn ich mir die gewünschten Vorgänge als Programmablaufdiagramm male. Für derlei Zeug gibt es auch gute und einfache Werkzeuge (Libreoffice Draw würde ich zuerst probieren).

HTH

Gregor

Hallo und willkommen im Forum!

TanjaGoldrain:
Wenn der Feuchtigkeitssensor anschlägt ...

Das wird mit einer Flankenerkennung gemacht: Wenn neuer Wert HIGH und alter Wert LOW, dann tue was. Das gilt genauso für den Taster.

if (neuWertFs && !altWertFs) {dreheMotor(200)}
if (neuWertTa && !altWertTa) {dreheMotor(-200)}

Wie steuerst Du den Schrittmotor an? Hast Du ihn schon zum Drehen gebracht?

aslo den Motor habe ich bis jetzt nur so zum Laufen gebracht

#include <Stepper.h>
int SPMU = 32;  

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

void setup()
{
 myStepper.setSpeed(500);
}

void loop() {
 myStepper.step(2048);
 delay(500);
 myStepper.step(-2048);
 delay(500); 
}

und so hab ich mal den Freuchtigkeitssensor ausprobiert

int messwert=0;
int LED=6;

void setup()
{
 Serial.begin(9600);
pinMode (6,OUTPUT);
}

void loop()
{
messwert=analogRead(A4);
Serial.print("Feuchtigkeits-Messwert:");
Serial.println(messwert);
delay(500);
if (messwert <200 )
{
digitalWrite(LED, LOW);
}
else
{
digitalWrite(LED, HIGH);
delay(20000);
}
}

also einzeln bekomm ich alles zum laufen nur ich weiß nicht wie ich alles in eine Programierug bekomme

Ganz grob gesehen so ungefär. Aber da musst du noch Feinheiten anpassen. Wenn es dann funktioniert noch die Delay mit Millis ersetzen. (Beispiel BlinkWithoutDelay)

#include <Stepper.h>

int SPMU = 32; 
int messwert=0;
int taster = 3;
int LED=6;

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

void setup(){
  
   Serial.begin(9600);
   
   pinMode (6,OUTPUT);
   pinMode (3,INPUT);
    
   myStepper.setSpeed(500);

}

void loop() {

   messwert=analogRead(A4);

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

  Serial.println(messwert);
  
 if (messwert < 200 ){  
    
  myStepper.step(2048);

  digitalWrite(LED, LOW);

}
 
if (taster == HIGH ){ 
  
  myStepper.step(-2048);

}
delay(5000);
}

Scherheinz:

... if (messwert < 200 ){  }

Das bedeutet, der Motor dreht alle 5 Sekunden 2048 Schritte, was aber wohl nicht gewollt ist.

Daher muß m. E. die Flanke erkannt werden:

if ((messwert < 200 ) && !altWertFs) {
  myStepper.step(2048);
}
altWertFs = messwert < 200;

Stimmt, hab ich nicht aufgepasst. Hatte nur schnell die 2 Sketche zusammen geschmissen und den Taster eingefügt

Scherheinz:
... hab ich nicht aufgepasst ...

Ich schreibe nur deshalb hier, weil ich weiß, daß ich immer überprüft werde und bei Bedarf mein Blödsinn korrigiert wird :smiley:

Hehe nicht schlecht. ;D

Aber generell lohnt es sich auch mal einen funktionierenden Code zu zeigen, irgendjemand hat immer einen Verbesserungsvorschlag, immer :slight_smile:

so ich habe jetzt diesen Code hochgelden

#include <Stepper.h>

int SPMU = 32;
int messwert=0;
int taster=11;

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

void setup(){
 
   Serial.begin(9600);
   
   pinMode (11,INPUT);
   
   myStepper.setSpeed(500);

}

void loop() {

   messwert=analogRead(A4);

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

  Serial.println(messwert);
 
 if (messwert < 200 ){ 
   
  myStepper.step(2048);

}
 
if (taster == HIGH ){
 
  myStepper.step(-2048);

}
delay(5000);
}

aber irgendwie funktioniert dieser nicht so wie wir uns das vorstellen.
Wenn keine Wasser da ist dreht sich der Motor und wenn Wasser da ist Stoppt er und dreht in die andere Richtung. Der Taster hat gar keine Funktion. Mit der Feuchtigkeitsauslösung wollten wir es aber genau anders rum haben, sprich Wenn kein wasser da ist ist alles in ruhe "Modus". Kommt wasser auf die Feuchtigkeitsauslösung dreht der Motor in die eine Richtung und Stopt dann nach einen Step. Betätigt man den Taster soll er in die andere Richtung fahren und dann wieder stoppen. :sob:

Der Taster hat gar keine Funktion

Taster (oder Pins allgemein) musst du mit digitalRead() einlesen
Du machst im Prinzip das:

if (11 == 1)
{
}

Der Taster braucht außerdem einen Pulldown-Widerstand gegen Masse. Wenn du keinen externen Widerstand verbaut hast, dann verwende INPUT_PULLUP und frage auf LOW statt HIGH ab.

int taster=11;
...
pinMode (11,INPUT);
...
if (taster == HIGH )

Das paßt so nicht zusammen, besser so:

const int tasterPin = 11;
bool tasterStatus;
...
pinMode (tasterPin, INPUT);
...
tasterStatus = digitalRead(tasterPin);
...
if (tasterStatus == HIGH )
...