Flag wird nicht berücksichtigt - Steh auf dem Schlauch

Hallo allerseits

Ich verstehs nicht: Eigentlich sollte die While-Schlaufe solange ausgeführt werden bis der Flag geändert wird, aber der Code wird nur EINMAL durchlaufen. Ich kann den Fehler nicht finden. Vielleicht hilft jemand ?

Nebenbei: Wenn ich den Code (ohne Flag) im Setup ausführe, dann passiert gar nichts. )

Dank Euch im voraus
Mike

// constants won't change. They're used here to set pin numbers:
const int closedPin = 9;     // Taster der anzeigt ob Schieber geschlossen
const int dirPin = 10;       // Leitung zum Motor für Richtung
const int stepPin = 11;      // LEitung für Step Signal
const int manualPin = 8;     // Manual open and close
const int led = 13;

// variables will change:
int manualState;         //Stat for manual Open / Close; 
bool closed;             //Holds the result of the Taster
int steps = 0;


void setup() {
  // initialize the LED pin as an output:
  pinMode(led, OUTPUT);
  pinMode(closedPin, INPUT);
 
  pinMode(manualPin, INPUT);

  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);

  //Make sure it's closed
  digitalWrite(led, HIGH);
  digitalWrite(dirPin, LOW);

  closed = true;
  if (digitalRead(closedPin) == LOW ) closed = false;
  
  }

void loop() {

if (closed==false){
while (digitalRead(closedPin) == LOW) 
  {
      digitalWrite(stepPin, HIGH);
      delay(2);
      digitalWrite(stepPin, LOW);      
      delay(2);
      digitalWrite(led, HIGH);
      
  }
  closed = true;
}


}

Du setzt closed auf true und der Inhalt der if-Abfrage wird nur bei false ausgeführt.

Gruß Tommy

Hallo Tommy

Danke für die prompte Antwort. Das sollte so sein, oder ? Im Setup wird geprüft ob das Ventil geschlossen ist. Zuerst auf true (init) und dann abfragen. Wenn LOW dann ist es offen.

Im loop: Wenn offen, dann while ausführen. Nach dem While ist das Ventil geschlossen und ich setzt den Flag auf closed = true.

Falsch ?!

Mike

Und danach passiert nichts mehr, weil closed immer true bleibt. Das hast Du so programmiert. Ist das auch so gewollt?

Könnte es sein, dass diese Zeile im Loop fehlt:

if (digitalRead(closedPin) == LOW ) closed = false; 
else closed = true;

Gruß Tommy

Ja, das war so gedacht. Ist ne Init-Routine die nur einmal ausgeführt werden soll. Mein Problem ist der while Block.Der Servo macht einen Step und fertig.

Da sich der While-Block innerhalb des if befindet, wird der natürlich auch nur einmal aufgerufen.

Gruß Tommy

Hallo,

wenn ich mir das so anschaue, würde ich behaupten, dass die Zeile

if (digitalRead(closedPin) == LOW ) closed = false;

an den Anfang der loop gehört und nicht ins setup. Erst dann haste die Chance closed überhaupt zu ändern während der Laufzeit.

Diese Zeile im setup kannste auch weglassen, indem du bool closed gleich mit true initialisierst.

closed = true;

und bei noch genauerer Betrachtung kürzt sich die loop dann darauf ein, die Hilfsvariable closed wird nicht benötigt. Musst nur noch dafür sorgen das die LED wieder ausgeht. Zum Bsp. mit if else

void loop() {

  if (digitalRead(closedPin) == LOW ) {
    digitalWrite(stepPin, HIGH);
    delay(2);
    digitalWrite(stepPin, LOW);
    delay(2);
    digitalWrite(led, HIGH);
  }

}

Danke Euch allen für den Input. Es hat sich herausgestellt, dass der Code ganz okay ist, aber es Probleme bei der Übertragung auf den Stepper gab. Die Pins von den Verbindungskabel scheinen nicht wirklich gut auf dem Arduino zu halten.

Es handelt siche hier um einen EasyDriver und manchmal tut er was und manchmal nicht. Wenn ich den Arduino anfasse - reagiert der Stepper.

Ich bekomm den Stepper einfach nicht stabil zum laufen.

Input und Tips zu dem Problem ist willkommen. Sonst mach ich noch nen anderen Thread auf.

Mike

MikeLimaZulu:
Danke Euch allen für den Input. Es hat sich herausgestellt, dass der Code ganz okay ist, aber es Probleme bei der Übertragung auf den Stepper gab. Die Pins von den Verbindungskabel scheinen nicht wirklich gut auf dem Arduino zu halten.

Input und Tips zu dem Problem ist willkommen. Sonst mach ich noch nen anderen Thread auf.

Dass es nicht der Code ist, der ein Problem verursacht, habe auch ich schon erlebt. In meinem Fall war es das Nachlaufen von Getriebemotoren. Auf der Fehlersuche im Code habe ich mir schier eine Hornhaut auf die Brille geglotzt.

Wenigstens kenne ich gute Flüche :slight_smile:

Gruß

Gregor

MikeLimaZulu:
.....
Es handelt siche hier um einen EasyDriver und manchmal tut er was und manchmal nicht. Wenn ich den Arduino anfasse - reagiert der Stepper.
.....

Das deutet darauf hin, dass irgend ein Input deines Arduino nicht richtig terminiert ist.
Es fehlt da ein Pullup- oder Pulldownwiderstand.
Dann reagieren die Dinger so wie du es andeutest.

Danke für den Hinweis. Bin mittlerweile auf Adafruit Shield umgestiegen. Aber stimmt: Musste noch 10k Widerstände einlöten.

Mein Problem: Ich hab einen Schalter eingebaut, der angibt ob ein Ventil geschlossen ist oder nicht. Ich kann, wenn geschlossen, die 5 Volt messen, aber das Mega-Board scheint nicht zu reagieren.

Pin ist auf Input, Widerstand eingelötet und auf einen Digitalport (Mega 22) eingesteckt.

Kann die Steckverbindung so schlecht sein ?!

Mike

Dann schreib doch mal wie du die Widerstände eingelötet hast.
Am besten du zeigst uns ein Schaltbild.

Und evtl. ist der Widerstand auch noch zu groß.

Hier ist ein Schaltbild. Ich verwende ein 10k Widerstand (zumindest vermute ich das :wink:

Farben am Widerstand: Gold (braun) schwarz schwarz gold (braun) gold (braun)

gold oder braun - kanns nicht genau unterscheiden.

Nochmals Dank an alle im voraus
Mike

Unbenannt.png

MikeLimaZulu:
Hier ist ein Schaltbild. Ich verwende ein 10k Widerstand (zumindest vermute ich das :wink:

Farben am Widerstand: Gold (braun) schwarz schwarz gold (braun) gold (braun)

gold oder braun - kanns nicht genau unterscheiden.

Nochmals Dank an alle im voraus
Mike

Und warum misst du den Widerstand nicht nach ?

Hi

Dafür (dagegen) habe ich einen Bauteil-Tester, in meinem Fall ein 'EZM 328' und bin sehr zufrieden damit.
Z.B. M328LCD/GM328A/M328/MK-328/MK-168/LCR-T4/LCR-T5/TS-M8N/EZM328 Transistor Tester, eBay
Der verlinkte Tester ist 'der erst Beste 'EZM328', Der mir auf eBay unter kam.
Zumindest soll Das keine direkte Kaufempfehlung sein - wie gesagt, bin mit dem Ding sehr zudrieden.

Ein 'DMM' (digitales Multi Meter - also ein normales Messgerät) solltest Du Dir auch zulegen, für Spannungen im Arduino-Bereich wäre ein Modell vom Grabbeltisch ausreichend - wenn's mehr taugt schadet nicht.

MfG

postmaster-ino:
Ein 'DMM' (digitales Multi Meter - also ein normales Messgerät) solltest Du Dir auch zulegen, für Spannungen im Arduino-Bereich wäre ein Modell vom Grabbeltisch ausreichend - wenn's mehr taugt schadet nicht.

Es muss noch nicht einmal digital sein (wobei mir wieder einmal einfällt, dass „digitale Qualität“ auch echt scheiße sein kann).

Etwas Analoges vom Flohmarkt kann auch ganz gut sein.

Gruß

Gregor

MikeLimaZulu:
Hier ist ein Schaltbild. Ich verwende ein 10k Widerstand (zumindest vermute ich das :wink:

Farben am Widerstand: Gold (braun) schwarz schwarz gold (braun) gold (braun)

gold oder braun - kanns nicht genau unterscheiden.

Nochmals Dank an alle im voraus
Mike

Ein 10 kOhm Widerstand hat folgende Farben:
braun schwarz orange gold ( 10 kOhm 5%)
oder
braun schwarz schwarz rot braun ( 10,0 kOhm 1%)

Es gibt viele Widerstands-Farb Berechner im Netz zB.Calculino.com - Widerstand Farbcode mit 3-6 Ringen in Ohm umrechnen!

Dein braun schwarz schwarz braun braun sind 1,00 kOhm

Grüße Uwe

Ich hab heute die 10k Widerstände erhalten und mal eingelötet. Damit ist das ganze stabiler, aber ich hab immer noch ein grundlegendes Problem mit folgendem Code (oder der Elektronik):

  • Einerseits wird der while Abschnitt im Setup nur einmal ausgeführt (zumindest hört es sich so an)
    und im Loop habe ich mit demselben Code (while Schlaufen) dasselbe Problem: Einmal ausgeführt, statt bis zum endgültigen Öffnen oder Schliessen.

Beschreibung Hardware: Zwei Taster (jetzt mit 10k Ohm ;), ein Schalter und ein Stepper. Grundidee: Solange Taster “Open” auf LOW, solange while durchlaufen und schliessen. Dasselbe fürs Öffnen, abhängig vom Schalter Zustand.

Das ganze will aber nicht, so wie ich.

Für jeden Hinweis dankbar.

#include <AFMotor.h>
AF_Stepper motor(48, 1);


// constants won't change. They're used here to set pin numbers:
const int closedPin = 22;     // Taster der anzeigt ob Schieber geschlossen
const int openPin = 24;
const int startPin = 26;     //

// variables will change:
int startstatus;             //Holds the result of the Taster
int laststartstatus;
int opened;
int closed;


void setup() {
  motor.setSpeed(50);
  Serial.begin(9600);
  pinMode(closedPin, INPUT);
  pinMode(openPin, INPUT);
  pinMode(startPin, INPUT);

  laststartstatus = digitalRead(startPin);
  motor.setSpeed(20);

  closed = digitalRead(closedPin);
  while (closed == LOW) {
    motor.step(1,BACKWARD, SINGLE);
    closed = digitalRead(closedPin);
  }

}

void loop() {

  startstatus = digitalRead(startPin);
  opened = digitalRead(openPin);
  closed = digitalRead(closedPin);

  
  Serial.println(startstatus);
  Serial.println(opened);
  Serial.println(closed);

  if (laststartstatus != startstatus) {
    if (startstatus == HIGH) {
      Serial.println("OPEN");
      do {
      motor.step(1,FORWARD, SINGLE);}
      while (digitalRead(openPin) != HIGH);
    }
    if (startstatus == LOW) {
      Serial.println("CLOSE");
      delay(2);
      do {
        motor.step(1,BACKWARD, SINGLE);
      } while  (digitalRead(closedPin) != HIGH);
    }    
    laststartstatus = startstatus;
  }
}

(zumindest hört es sich so an)

ist eine Aussage ohne Wert. Baue Serial.println-Ausgaben rein, damit Du siehst, was passiert.

While im Loop ist nicht gut. Du hast doch schon eine große Schleife: loop. Mehr brauchst Du nicht.

Gruß Tommy