Code werkt maar is niet netjes

Hallo,

Met een omweg werkt dit maar krijg het niet netjes geprogrammeerd.
de bedoeling: knop indrukken timer loopt 3600 sec, daarna stepper langzaam aan.
Knop los stepper langzaam uit.

if (digitalRead(8) == HIGH) {x=1500000; kan mij inziens anders
En als de knop los is en timer is afgelopen gaat de motor toch even langzaam uit.
geen groot probleem ......maar ja

wat kan ik verbeteren ?

// defines pins numbers
const int stepPin = 4; 
const int dirPin = 5; 
const int ms1Pin = 10;
// const int ms2Pin = 9;
// const int ms3Pin = 8;
const int ledPin = 13;
float waitTime = 0.003;
int accelerationTerm = 4000;
int roundedWaitTime;
unsigned long timer1;
unsigned long timer2;
unsigned long difference;
int Timer=1;
int buttonPin = 8;




void setup() {


  Serial.begin(115200); // opens serial port, sets data rate to xxxx bps
while (!Serial);
 pinMode(9, OUTPUT);       //  enable / disable
  pinMode(8, INPUT_PULLUP);  // schakelaar 
  //setup the pins
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(ms1Pin,OUTPUT);
  // pinMode(ms2Pin,OUTPUT);
  // pinMode(ms3Pin,OUTPUT);
  pinMode(ledPin, OUTPUT);  

  //change the microstepping
  digitalWrite(ms1Pin,LOW);
  // digitalWrite(ms2Pin,HIGH);
  //digitalWrite(ms3Pin,LOW);
}

//function to return the next delay value for positive acceleration
float positiveAcceleration(float waitTime) {
    float dVelocity = waitTime * accelerationTerm;
    waitTime = 1/(dVelocity+1/waitTime);
    if (waitTime < 0.00025){
      waitTime = 0.00025;
    }
    return waitTime;
}

//function to return the next delay value for negative acceleration
float negativeAcceleration(float waitTime) {
    float dVelocity = waitTime * -1 * accelerationTerm;
    waitTime = 1/(dVelocity+1/waitTime);
    if (waitTime > 0.003){
      waitTime = 0.003;
    }
    return waitTime;
}








void loop() {

   digitalWrite(9, LOW);  //  motor is Enable 
  // digitalWrite(9, HIGH);  //   motor is Disable  



 if (digitalRead(8) == LOW)
 

while (Timer <=3600) {
    Serial.print("0 sec naar 3600 sec  =>");
    Serial.println(Timer);
    Timer = Timer + 1;
    delay (1000);
  }

  
 if (Timer >= 3600){

 
  //accelerate for 150000 steps
  for(long x = 0; x < 1500000; x++) 
  
  {
    waitTime = positiveAcceleration(waitTime);
    roundedWaitTime = round(waitTime*1000000);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(roundedWaitTime);
    digitalWrite(stepPin, LOW);
   
    if (digitalRead(8) == HIGH) {x=1500000;


 //deccelerate for 1984 steps
  for(int y = 0; y < 1984; y++) {

    waitTime = negativeAcceleration(waitTime);
    roundedWaitTime = round(waitTime*1000000);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(roundedWaitTime);
    digitalWrite(stepPin, LOW);
    // Serial.println(y);
    }
  }
 }

}
  
  Timer=1;
  Serial.println("motor gestopt");
  delay(1000);
}  // end loop
 

 
 

 
  

In de Arduino IDE op Ctrl+T drukken natuurlijk.
Daarna de tekst nog netjes bijwerken, zodat het er goed uit ziet.
Het is niet mogelijk om een goede werkend programma te hebben als de text van de code een grote puinhoop is.

Je sketch verbeteren is nog niet zo eenvoudig. Daar komt nog heel wat bij kijken.
Voor een soepel lopende sketch is het nodig om opnieuw te beginnen:

  1. Geen while en for-loops die tijd kosten. Laat de Arduino loop() zo vaak mogelijk uitvoeren, bij voorkeur honderden of duizenden keren per seconde.
  2. De State Change Detection voor de knop.
  3. Een "debounce" voor de knop. Daar zijn libraries voor. Sommige libraries hebben de State Change Detection ingebouwd.
  4. Een millis-timer voor de tijden. Begin met het lezen van de Blink Without Delay pagina.

Er zijn libraries die eenvoudig een millis-timer kunnen maken. Maar dan moet je je verdiepen in die libraries.
Er zijn ook multitasking libraries die op een Uno werken. Dan hoef je geen millis-timer te gebruiken. Het is dan wel nodig dat je al ervaring hebt met het schrijven van multitasking code.

Je zou ook een globale omschrijving van je project kunnen geven, en dan vertellen wat je wilt doen met een uitleg van de stappen. Misschien weet iemand een eenvoudigere oplossing.

Dus je wilt zelf de knop een uur ingedrukt houden?

hallo heren dank voor jullie berichten.

Koepel ik hoef je natuurlijk niet te vertellen dat in een beginneling ben :slight_smile:
maar ga me er in verdiepen. Ctrl+T geeft aan .... geen aanpassingen noodzakelijk :face_with_hand_over_mouth:
sterretje ja dat klopt.... this eigenlijk geen drukknop maar een heveltje met schakelaar

Niet bij mij :smiley:

Als je naar je opening post kijkt zie je bv

Die tweede regel zal, na een auto-format uitgelijnd zijn met de eerste regel.

Een tweede <CTRL>T zal inderdaad aangeven dat er geen verandering nodig zijn.

Kijk eens naar de teller millis() die kan al die delays afvangen en gaat je programma gelijk een stuk sneller.
je schrijft bijv while time <3600 delay 1000. dat is dus eigenlijk een uur dat je mega helemaal niks doet.
als je ergens schrijft dat de millis() 3600000 is verhoogd doe je hetzelfde.