Knop meteen laten werken niet eerst loop afmaken

Hallo,

Ik ben voor het toneel van mijn kinderen een grote klok aan het maken welke gewoon draait (Sneller dan 1 uur.) snel vooruit, snel achteruit en stil kan staan. Dit is mij als leek gelukt via de diverse fora's.

Echter kan ik niet vinden hoe ik zodra ik op een knop druk meteen versneld of terug laat draaien. Hij maakt eerst zijn loop af. graag zou ik het hebben dat hij meteen op de knop reageert.

Voor de grote en de kleine wijzer heb ik een eigen stappenmotor en een eigen Arduino UNO gebruikt. Dus beide worden apart geprogrammeerd met andere delays.

Dit is hoe het schema van 1 wijzer er nu uit ziet.

int PinButton3 = 4; //klok stilstaan
int PinButton1 = 5; // snel vooruit
int PinButton2 = 6; //snel achteruit

int Pin0 = 8; //motor grote wijzer
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 11;

int msDelay = 400; //snelheid klok (12 min.circa 1 uur.)

int snelDelay = 4; // klok versneld laten draaien

void setup()
{
pinMode(Pin0, OUTPUT); //motor grote wijzer
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);

pinMode(PinButton1, INPUT); // versnel
pinMode(PinButton2, INPUT); //stop
pinMode(PinButton3, INPUT); // draai terug
}

void loop()

{start:
{
if (digitalRead (PinButton3)==HIGH){ // stop klok
}
if (digitalRead (PinButton1)==HIGH && digitalRead(PinButton2)==LOW && digitalRead (PinButton3)==LOW)

{ // snel vooruit

digitalWrite(Pin3, HIGH); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
delay(snelDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
delay(snelDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin0, LOW);
delay(snelDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, HIGH);
delay(snelDelay);

goto start;
}

if (digitalRead (PinButton1)==LOW && digitalRead(PinButton2)==LOW && digitalRead (PinButton3)==LOW)
{

digitalWrite(Pin3, HIGH); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
delay(msDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
delay(msDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin0, LOW);
delay(msDelay);

digitalWrite(Pin3, LOW); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, HIGH);
delay(msDelay);

goto start;

}

if (digitalRead (PinButton1)==LOW && digitalRead(PinButton2)==HIGH && digitalRead (PinButton3)==LOW)
{ // versneld terug draaien

digitalWrite(Pin0, HIGH); //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
delay(snelDelay);

digitalWrite(Pin0, LOW); //motor grote wijzer
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
delay(snelDelay);

digitalWrite(Pin0, LOW); //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
delay(snelDelay);

digitalWrite(Pin0, LOW); //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
delay(snelDelay);

goto start;

}
}
}

Precies dit vraag ik me ook af! Ik moet de knop de gehele loop ingedrukt houden voordat het werkt...

Hoi jvasten, welkom.

Ook in deze thread hetzelfde antwoord als in de thread die ik net heb beantwoord.
Zie mijn handtekening hieronder.
Goh, deze vragen komen eigenlijk nooit voor...
En het gaat daarbij om de manier van werken, ondanks de naam van die sketch en van die functie.

Graag de volgende keer je code tussen [code] [/code] tags zetten, dat leest en werkt veel prettiger voor degenen die je graag willen helpen.

@akatchi, jij hebt mijn handtekening al een aantal malen voorbij moeten zien komen...

maak gebruik van interrupts.Zoek daar eens op.

MAS3:
Hoi jvasten, welkom.

Ook in deze thread hetzelfde antwoord als in de thread die ik net heb beantwoord.
Zie mijn handtekening hieronder.
Goh, deze vragen komen eigenlijk nooit voor...
En het gaat daarbij om de manier van werken, ondanks de naam van die sketch en van die functie.

Graag de volgende keer je code tussen tags zetten, dat leest en werkt veel prettiger voor degenen die je graag willen helpen.

@akatchi, jij hebt mijn handtekening al een aantal malen voorbij moeten zien komen...

Huh ik snap niet zo goed wat je bedoelt :S?
Handtekening?
Ik heb je zeker vaak gezien op de nederlandse forums :D!

akatchi:
Huh ik snap niet zo goed wat je bedoelt :S?
Handtekening?
Ik heb je zeker vaak gezien op de nederlandse forums :D!

Mas bedoeld blink without delay.
Het loslaten van delay is voor velen een grote stap omdat je de code niet meer zo makkelijk sequentieel kan lezen. Maar het is echt de moeite van tijd investeren waard.

vadeveni:
maak gebruik van interrupts.Zoek daar eens op.

Dat zou ik beginners ten stelligste afraden.
Met vriendelijke groet
Jantje

En voor de gestelde problemen zijn interrupts ook absoluut niet nodig.

Oh oke bedankt MAS3 en Jantje!

Hallo heren,

Aller eerst bedankt voor de reactie.

Ik heb het geprobeerd te programmeren zonder delays.
Maar weet er zelf bar weinig van af.
Het versneld vooruit draaien werkt. het normaal draaien pakt hij steeds andere spoelen aan de leds te zien. versneld terug reageert hij helemaal niet op.

Wat doe ik fout?

int PinButton3 = 4; //klok stilstaan
int PinButton1 = 5; // snel vooruit
int PinButton2 = 6; //snel achteruit
int Pin0 = 8;  //motor grote wijzer
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 11;

long korte_previousMillis = 0;
long lange_previousMillis = 0;
long korte_interval = 2;
long lange_interval = 1000;

unsigned long korte_currentMillis;
unsigned long lange_currentMillis;
//===================================================================================
void setup()
{
pinMode(Pin0, OUTPUT); //motor grote wijzer
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);

pinMode(PinButton1, INPUT); // versnel
pinMode(PinButton2, INPUT); //stop
pinMode(PinButton3, INPUT); // draai terug
}
//===================================================================================
void loop()

{start:
{
if (digitalRead (PinButton3)==HIGH){ // stop klok
}
if (digitalRead (PinButton1)==HIGH){ // snel vooruit

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin0, HIGH); //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin0, LOW);  //motor grote wijzer
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin0, LOW);   //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin0, LOW);   //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
korte_previousMillis = korte_currentMillis;
}
goto start;
}

//===================================================================================
if (digitalRead (PinButton1)==LOW) //normaal draaien
if (digitalRead (PinButton2)==LOW)
if (digitalRead (PinButton3)==LOW){

lange_currentMillis = millis();
if(lange_currentMillis - lange_previousMillis > lange_interval) {
digitalWrite(Pin0, HIGH); //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
lange_previousMillis = lange_currentMillis;
}

lange_currentMillis = millis();
if(lange_currentMillis - lange_previousMillis > lange_interval) {
digitalWrite(Pin0, LOW);  //motor grote wijzer
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
lange_previousMillis = lange_currentMillis;
}

lange_currentMillis = millis();
if(lange_currentMillis - lange_previousMillis > lange_interval) {
digitalWrite(Pin0, LOW);   //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
lange_previousMillis = lange_currentMillis;
}

lange_currentMillis = millis();
if(lange_currentMillis - lange_previousMillis > lange_interval) {
digitalWrite(Pin0, LOW);   //motor grote wijzer
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
lange_previousMillis = lange_currentMillis;
}

goto start;
}

//===================================================================================
if (digitalRead (PinButton2)==HIGH){ // versneld terug draaien

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin3, HIGH); //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin3, LOW);  //motor grote wijzer
digitalWrite(Pin2, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin3, LOW);   //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin0, LOW);
korte_previousMillis = korte_currentMillis;
}

korte_currentMillis = millis();
if(korte_currentMillis - korte_previousMillis > korte_interval) {
digitalWrite(Pin3, LOW);   //motor grote wijzer
digitalWrite(Pin2, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin0, HIGH);
korte_previousMillis = korte_currentMillis;
}

goto start;

}
}
}

Als ik even snel je code scan....
dan zeg je in een continu draaiende loop

Zet de timer gelijk aan millis()
Als de tijd tussen millis(0 en de timer groter is dan verloop duur enz enz

Dat gaat natuurlijk nooit gebeuren als je die timer net ervoor gelijk stelt aan millis().

Hallo Nico,

Ik begrijp jouw opmerking over de timer niet. Ik heb weer van alles geprobeerd maar helaas wordt het er allemaal alleen maar slechter op.

Zoals ik hem hier boven heb staan doet het versneld vooruit en achteruit het. Alleen in de gewone ruststand dat de klok moet lopen verspringen de leds welk de motor aansturen niet meer om de beurt maar willekeurig.
Dus motor draait dan ook niet.

Ik weet niet meer wat ik fout doe.

Hoi jvasten.

De IDE is een slim ding die je kan wijzen op fouten in de code.
Maar als de code uitvoerbaar is, dan is dat dus niet een fout, maar een of andere vreemde wens van de programmeur.

Je leest heel vaak de millis.
Weet je zeker dat je dat nodig hebt ?
Als je in je lange_Millis (sorry, maar ik moet jouw keuzes hier aanhouden) terechtkomt dan moet je je eens indenken wat er daar precies gebeurt.
Realiseer je dat je Arduino heel snel werkt (alles is relatief, maar hier moet je het relateren aan de secondewijzer van je ouderwetse horloge).
Hoeveel tijdsverschil denk je dat er zit tussen de uitvoering van regel 88 en regel 91 in de code die je hierboven hebt staan ?
En hoe staat dat in relatie tot lange_interval ?
Hoe weet je welke stap je het laatst gezet hebt als je in je lange_toestand zit ?
Ik zou dat eens gaan bijhouden en kijken of je er dan verder mee kunt komen.

En die goto's: overbodig.

het idee is aardig, en de loop gaat nu al aardig, echter klopt het totaal niet, maar dat komt vooral door de status.

zet de stepmotor in een losse functie, waar je onthoudt waar de motor staat. als je die functie aanspreekt, gewoon step +1 of step -1.
In de hoofdloop komt dan maar 1 timer die de snelheid bepaalt, dan kun je gelijk kijken of de knop is ingedrukt.

Allemaal Bedankt,

Ik heb de boeg helemaal omgegooid en het is gelukt.
Werkt nu prima.

jvasten:
Allemaal Bedankt,

Ik heb de boeg helemaal omgegooid en het is gelukt.
Werkt nu prima.

Ja zo werkt het nu eenmaal. Je probeert op de manieren die je kent. Tot het niet meer werkt en dan is het tijd voor een leermoment. En afstappen van delay is een groot leermoment.
Proficiat.

Met vriendelijke groet
Jantje