Delays vervangen in millis()

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Delays vervangen in millis()

Berichtdoor Pexy » 13 Mrt 2018, 20:28

Hallo allemaal.

Ik zou graag hulp willen vragen voor mijn sketch.
Er zijn twee drukknoppen en twee ledjes,
het is de bedoeling dat als knop 1 word ingedrukt, led 1 voor drie seconden een stuk of tien keer gaat knipperen.
Hetzelfde geld voor knop 2 en led 2.
Wanneer de knoppen niet aangeraakt worden faden de twee ledjes afwisselend van elkaar.

Het is nu zo dat de sketch wel werkt,
probleem is echter dat wanneer knop 1 ingedrukt word en led 1 knippert,
knop 2 en led 2 in de tussentijd niet reageren ivm de delays.

Ik zou graag alle delays wil vervangen in millis() dan zou dat probleem verholpen moeten zijn.

Hieronder de code, alvast heel erg bedankt!

cpp code
int value1, value2 ;

int S1 = 2; // switch P1
int S2 = 3; // switch P2
int L1 = 10; // led P1
int L2 = 11; // led P2

long time=0;

int periode = 8000;
int displace = 4000;

void setup() {
// initialize the digital pins.
// assume switches will wire from ground to input pins
pinMode(S1, INPUT_PULLUP);
pinMode(S2, INPUT_PULLUP);
pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
}

void loop() {

if (!digitalRead(S1))
{
digitalWrite(L1,LOW);
digitalWrite(L2,LOW);

//-------------------------------

digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(100);
digitalWrite(L1,LOW);
delay(100);
digitalWrite(L1,HIGH);
delay(1500);
digitalWrite(L1,LOW);
delay(200);
}

//-------------------------------------------------------

if (!digitalRead(S2))
{
digitalWrite(L1,LOW);
digitalWrite(L2,LOW);

//-------------------------------

digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(100);
digitalWrite(L2,LOW);
delay(100);
digitalWrite(L2,HIGH);
delay(1500);
digitalWrite(L2,LOW);
delay(200);
}

//-------------------------------------------------------

else {

time = millis();
value1 = 128+127*cos(2*PI/periode*time);
value2 = 128+127*cos(2*PI/periode*(displace+time));

analogWrite(L1, value2); // sets the value (range from 0 to 255)

analogWrite(L2, value1); // sets the value (range from 0 to 255)

}
}

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Delays vervangen in millis()

Berichtdoor Gij Kieken » 13 Mrt 2018, 21:16

Hey Pexy,
Zoek eens naar blink without delay, daar lig je oplossing in.
Een voorbeeldje kun je ook vinden in de IDE onder digital...
Ook hier kun je eens rondsnuffelen <https://playground.arduino.cc/Code/AvoidDelay>
Laatst gewijzigd door Gij Kieken op 13 Mrt 2018, 22:07, in totaal 1 keer gewijzigd.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Delays vervangen in millis()

Berichtdoor nicoverduin » 13 Mrt 2018, 21:18

Nou op 2 forums hetzelfde antwoord van verschillende mensen. Lijkt me duidelijk. En wat tutorials over for... statements als je toch bezig bent
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Delays vervangen in millis()

Berichtdoor Pexy » 13 Mrt 2018, 21:27

Ik ben blink without delay ontzettend vaak tegengekomen en ik begrijp de werking ervan.
Maar ik loop nu echt vast omdat er drukknoppen in het spel zijn
en dat het knipperen niet oneindig door moet gaan zoals dat in blink without delay wel het geval is.
Hoop echt dat jullie mij kunnen helpen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Delays vervangen in millis()

Berichtdoor nicoverduin » 13 Mrt 2018, 21:50

Dan begrijp je de kern van het verhaal nog niet. Wat houdt jou tegen om een bool te maken die bepaalt of de timer moet lopen of niet? Is hij true doe je de controle op millis. Is hij false doe je hem niet en knippert er ook niets
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delays vervangen in millis()

Berichtdoor Koepel » 13 Mrt 2018, 21:54

Bij zo iets vraag ik meestal om een goede beschrijving. Dan haken de meesten af, omdat ze het niet kunnen beschrijven.
Dus ik hoop dat je niet te snel afhaakt :|

Kun je een volledige beschrijving geven ?
Als de ene led knippert, wil je dan dat de andere led uit blijft ?
Wat wil je dat er gebeurt als beide knoppen tegelijkertijd worden ingedrukt ?
Wat wil je doen, als bijvoorbeeld knop 2 wordt ingedrukt, terwijl de led van knop1 nog bezig is met knipperen.
Is het goed als het starten en stoppen van het knipperen zomaar plotseling gebeurt ? Om wil je dat het normaal begint en stopt met een volledige nette knipper aan-tijd van de leds ?
Is het goed wannneer het faden wordt gestart, dat het zomaar willekeurig ergens begint ?

Het faden van de leds met de ruwe waarde van millis() vind ik prima. Dan kan er iedere 50 dagen een glitch ontstaan, maar ach, het zijn maar leds.

Zie je dat de sketch drie verschillende toestanden krijgt ? of in het Engels drie "states".
state 0: alles is relaxed, niets te doen, de leds faden.
state 1: led 1 knippert
state 2: led 2 knippert

O, ja, Nico ik zie het nu ook :shock: dubbel op: https://forum.arduino.cc/index.php?topic=534966.0

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Delays vervangen in millis()

Berichtdoor Pexy » 13 Mrt 2018, 22:23

Koepel schreef:Bij zo iets vraag ik meestal om een goede beschrijving.


Ik zal het proberen ;)

Wanneer er op de knop gedrukt wordt moet 1 led knipperen en moet de andere led inderdaad uit zijn.
Als beide knoppen ingedrukt worden moeten beide leds gaan knipperen.
Als inderdaad bijvoorbeeld knop 2 wordt ingedrukt terwijl de led van knop 1 nog bezig is met knipperen,
moet de led van knop 2 ook gaan knipperen, dat staat los van knop 1 en led 1.
Het knipperen van de leds moet normaal beginnen en netjes stoppen, dus niet plotseling.
De start van het faden van leds begint nu inderdaad willekeurig, het zou beter dat het netjes start.

Het zijn inderdaad drie states, de states die beschrijft zijn goed.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delays vervangen in millis()

Berichtdoor Koepel » 13 Mrt 2018, 23:43

Dankjewel voor de beschrijving, de contouren van de sketch worden nu langzaam zichtbaar voor me.

Wanneer je millis() gebruikt, dan zijn er variabelen nodig om het programma te sturen. Daarom had @nicoverduin het over een 'bool' variabele en ik over een 'state' variabele.

Aangezien de leds onafhankelijk van elkaar knipperen, zijn er geen drie state's, dus die 'state' gaat het raam uit.
Ik stel voor om twee boolean variabelen te namen. Voor elke led één. Die is 'true' als een led knippert. Zijn beide 'false', dan de leds faden.

Wat wil je dat er gebeurt als iemand de knop 10 seconden ingedrukt houdt ?
Wil je beginnen met knipperen zodra iemand de knop indrukt, en nog 3 seconden blijft doorgaan na het loslaten ?

Het faden heb je nu in tegenfase. Wil je dat zo houden of mag dat ook onafhankelijk van elkaar ?

Het is eenvoudiger om de led constant aan te houden zolang iemand de knop ingedrukt blijft houden. Wanneer je meteen wilt gaan knipperen, dan zou ik de Bounce2 library willen gaan gebruiken. Die zit al in the Bibliotheek Beheer in de Arduino IDE.

Je wilt het knipperen onafhankelijk van elkaar. Als je echter het faden in tegenfase wilt, dan moet dat in de code alsnog aan elkaar geknoopt worden. Dat wordt het dus ingewikkelder.

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Delays vervangen in millis()

Berichtdoor Pexy » 14 Mrt 2018, 00:42

Als het eenvoudiger is om de led constant aan de houden wanneer de knop blijvend ingedrukt wordt en met loslaten gaat knipperen, ga ik voor die optie.

Het faden van de leds wil ik graag in tegenfase hebben, niet onafhankelijk van elkaar.

Ik hoop dat het zo nog duidelijker is.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delays vervangen in millis()

Berichtdoor Koepel » 14 Mrt 2018, 01:39

Kun je hier eens naar kijken:

cpp code
const int S1Pin = 2;    // switch P1
const int L1Pin = 10; // led P1

unsigned long L1PreviousMillis;
const int L1Interval = 150; // led blink interval in milliseconds
boolean L1Active = false; // indicates if led L1 is blinking
int L1Count; // count the blinks
int L1State; // the state of the led

int periode = 8000;
int displace = 4000;


void setup()
{
// initialize the digital pins.
// assume switches will wire from ground to input pins
pinMode( S1Pin, INPUT_PULLUP);
pinMode( L1Pin, OUTPUT);
}


void loop()
{
if( digitalRead( S1Pin) == LOW) // low is pressed
{
// start or restart the blinking of L1 led.
L1Active = true;
L1PreviousMillis = millis();
L1Count = 0;
L1State = HIGH;
digitalWrite( L1Pin, HIGH);
}


if( L1Active)
{
if( millis() - L1PreviousMillis >= L1Interval)
{
L1PreviousMillis = millis();

L1Count++;
if( L1Count >= 20)
{
L1Active = false;
}

if( L1State == HIGH)
L1State = LOW;
else
L1State = HIGH;

digitalWrite( L1Pin, L1State);
}
}


if( !L1Active) // if not active
{
// Fade leds using the bare value of millis().
// That might cause a glitch once per 50 days, but it is only for leds.

unsigned long time = millis();
int value1 = 128 + 127 * cos( 2 * M_PI / periode * time); // calculation not checked, could be wrong
int value2 = 128 + 127 * cos( 2 * M_PI / periode * (displace + time));

analogWrite( L1Pin, value2); // sets the value (range from 0 to 255)
}
}


Dit heb ik zelf zomaar opgeschreven, ik weet zelf nog niet wat ik er van zal vinden.
Voor het knipperen van het ledje heb ik opeens 5 variabelen nodig. De code voor het knipperen kan misschien in drie regels met twee variabelen, maar dit vond ik duidelijker. Dan maar met 5 variabelen.

Herken je het deel van de BlinkWithoutDelay ? en zie je hoe ik dat aan een uit zet met 'L1Active' ?

Een digitalWrite() heft een lopende analogWrite() op. Het is ook mogelijk om analogWrite(255) en analogWrite(0) te doen in plaats van de digitalWrite().

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten