Problem beim Schreiben eines Ablaufs

Hallo Leute,

ich bin soon hobby Bastler und arbeite an einer kleinen Steurung für ein UV - Einheit .

Der Sketch soll über drei Knöpfe einen Steppermotor antreiben oder eben nicht. Mein Problem steckt im externen VOID START der wird zwar ausgeführt aber die While Schleife läuft ewig und ich verstehe seid 2 Stunden nicht warum.

//Stepper-Motor-Steuerung mit A4988 und Taster 
#include "OneButton.h"

const int stepperpin = 2; // D2 am Arduino
const int startpin = 12;
const int dauerpin = 11;
const int auspin = 10;
const int offpin = 9;
unsigned long timer = 0;
unsigned long starttime = 0;
unsigned long interval = 6000;
unsigned long val = 0;

OneButton button(startpin, true);
OneButton button1(dauerpin, true);
OneButton button2(auspin, true);


void setup() {
pinMode(stepperpin, OUTPUT);
pinMode(startpin, INPUT);
pinMode(dauerpin, INPUT);
pinMode(auspin, INPUT);
pinMode(auspin, OUTPUT);

button.attachDoubleClick(START);
button1.attachDoubleClick(DAUER);
button2.attachDoubleClick(AUS);

Serial.begin(115200);
Serial.println("eingeschalet");
digitalWrite(offpin, HIGH);
delay(1000);


}

void loop(){
   
  button.tick();      //void START
  
  button1.tick();     //void DAUER
  
  button2.tick();     //void STOP
}
 
  
void START(){
   digitalWrite(offpin, LOW);
   delay(100);
   starttime = millis();
   
   Serial.println(starttime);
   Serial.println();
   Serial.println(timer);
   while (millis <= (starttime + timer)){ 
   digitalWrite(stepperpin, HIGH);
   delayMicroseconds(9000);  // Geschwindigkeit
   digitalWrite(stepperpin, LOW);
   delayMicroseconds(9000);  //Geschwindigkeit
      
   button2.tick();     //void STOP
   }
   Serial.println("ENDE ZEIT");
   AUS();
}

void DAUER(){
   timer = timer + interval;
   Serial.println(timer);

}

void AUS(){
      Serial.println("STOP");
      // aus Display
      timer =0;
      starttime=0;
      digitalWrite(offpin, HIGH);
}

Die Taster funktionieren (auch wenn ich 3 Klick Machen muss) alle bestens. Ich kann die Schleife auch stoppen mit Taster aber Sie läuft nicht ab.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hat sich erledigt danke allen die kurz drauf geschaut haben.

anscheinend muss man millis immmer so schreiben millis()

hab ich net gewust wird auch nicht als fehler in der Arduino entwicklung angezeigt

Roedel:
Mein Problem steckt im externen VOID START der wird zwar ausgeführt aber die While Schleife läuft ewig und ich verstehe seid 2 Stunden nicht warum.

void START(){

digitalWrite(offpin, LOW);
  delay(100);
  starttime = millis();
 
  Serial.println(starttime);
  Serial.println();
  Serial.println(timer);
  while (millis <= (starttime + timer)){
  digitalWrite(stepperpin, HIGH);
  delayMicroseconds(9000);  // Geschwindigkeit
  digitalWrite(stepperpin, LOW);
  delayMicroseconds(9000);  //Geschwindigkeit



Ich kann die Schleife auch stoppen mit Taster aber Sie läuft nicht ab.

Nö.
Das ist auch richtig.
Mit jedem Aufruf machst Du:
starttime = millis();
Damit bekommst nie ein Ende...
Und was ist das hier:

   while (millis <= (starttime + timer)){

Das geht nicht.
Schalte bitte die Kompilermeldungen ein.
DATEI-VOREINSTELLUNGEN-Ausführliche Ausgabe während [x] Kompilierung
Und unter Kompilerwarnungen: ALLE

Und dann schau Dir mal in der IDE unter Beispiele - Digital das blinkwithoutdelay an.
Du läufst in die Überlauf-Falle
Das mit den Codetags war schon - dann schaun wa weita

o ja, einen Funktionsaufruf muß man immer so schreiben: millis().
Eine Funkton kann Werte mitbekommen (Werte in der Klammer) und einen Rückgabewert haben.
Grüße Uwe

Roedel:
anscheinend muss man millis immmer so schreiben millis()
... wird auch nicht als fehler in der Arduino entwicklung angezeigt

Das ist ja auch kein Fehler im technischen Sinn.
Denn ein Funktionsbezeicher, ohne die Klammern, liefert einen Zeiger auf die Funktion.

Dass es ein Fehler im logischen Sinne ist, kann der Kompiler nicht wissen, denn er weiß nicht was du willst.


Mein Problem steckt im externen VOID START

Es gibt kein void START !
Denn void heißt "unbestimmt", oder "nicht vorhanden".

Du meinst die Funktion START!
Die, deren Rückgabe Wert void ist, da sie keinen hat.

Ich rate dir zu einem schönen modernem dicken C++ Buch.

Hallo Leute,

total lieb von euch einiges davon habe ich verstanden anderes nicht ich konnte die Probleme aber so weit Lösen mit euerer hilfe.

Lieben Dank.

Gruß
Tom

Nur bedauerlich, dass du "unseren" Bitten (Post#1) nicht nachkommst.

Hi,

ups sorry, war wohl das mit code und /code gemeint, ich habs ist erledigt.

Roedel:
Hi,

ups sorry, war wohl das mit code und /code gemeint, ich habs ist erledigt.

Alles klar, danke....auch für deine Rückmeldung.

Der Dieter kann mir sicherlich auch helfen mit der onebutton Libary. ich habe Sie soweit eingebunden funst auch alles.

Ich habe einen meiner 3 Button in einer While Schleife drin als Stop. Das funst prima. Ich würde aber gern nach dem While
wissen ob der Button in der While Schleife gedrückt wurde. Ich hab das auf github nicht verstanden den da steht.

You can specify a logic level when calling tick(bool), which will skip reading the pin and use that level instead.

Ohh, sorry....da muss ich passen.

  1. Die Lib habe ich bisher noch nie eingesetzt, kenne sienicht.
  2. While-Schleifen sind blockierend, daher kommen die in meinen Sketch nicht vor.

Wozu die While-Schleife, du hast doch mit der Loop schon eine Schleife.

ok danke.