Waar moet ik beginnen??

Alles wat niet past in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Waar moet ik beginnen??

Berichtdoor Gij Kieken » 06 Mei 2021, 18:09

Dit is niet echt de gebruikelijke manier ,maar het was effe om te proberen.
De tijden moet jezelf wat aanpassen.


Code: Alles selecteren
/*
 * Date:    06/05/2021
 * Purpose: Blink a Led on different times
*/

const int ledPin =  13;           // the number of the LED pin
int ledState = LOW;               // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
int elapsed;                      // time since the end of the last cycle

void setup() {
  //Serial.begin(9600);
  pinMode(ledPin, OUTPUT);        // set the digital pin as output:
}
void loop()
{
  unsigned long currentMillis = millis();
  //Here I cast to an int
  elapsed = (int)(currentMillis - previousMillis);// elapsed is the time since the end of the last cycle

  switch (elapsed) {  // Allow a little range in the cases
    case 1000 ... 1002:                        // at time = 1000 the LED is turned on
      ledState = HIGH;
      digitalWrite(ledPin, ledState);
      //Serial.println("case 1000 msec");
      break;
    case 2000 ... 2002:                        // at time = 2000 the LED is turned off
      ledState = LOW;
      digitalWrite(ledPin, ledState);
      //Serial.println("case 2000 msec");
      break;
    case 8000 ... 8002:                       // at time = 8000 the LED is turned on
      ledState = HIGH;
      digitalWrite(ledPin, ledState);
      //Serial.println("case 8000 msec");
      break;
    case 8500 ... 8502:                       // at time = 8500 the cycle starts over again
      ledState = LOW;
      digitalWrite(ledPin, ledState);
      //Serial.println("case 8500 msec");
      previousMillis = currentMillis;
      break;
  }
}

Advertisement

Berichten: 20
Geregistreerd: 28 Apr 2020, 21:24

Re: Waar moet ik beginnen??

Berichtdoor RichardZ » 06 Mei 2021, 22:57

beste gij kieken,

bedankt dat je me wild helpen,

dus als ik het goed begrijp en ik laat bij 8500millis het regeltje previousMillis = currentMillis;

weg dan kan ik gewoon verder met andere waardes in vullen zoals daarboven?

en waar is dit regeltje voor //Serial.println("case 2000 msec");??

en zoals je al zei is dit niet de gebruikelijke manier

is er dan een manier die misschien eenvoudiger is en beter?

gr Richardz

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Waar moet ik beginnen??

Berichtdoor Frits1956 » 06 Mei 2021, 23:16

Wat denk je dat het volgende stukje programma doet.

Code: Alles selecteren
unsigned long Tellertje ; // maakt in het geheugen een variabele aan genaamd Tellertje van het type unsigned long

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);   // initialiseert digital pin LED_BUILTIN als een output.
}


void loop() // the loop function runs over and over again forever
{ Tellertje = millis();
  if (Tellertje = 2000) digitalWrite(LED_BUILTIN, HIGH);
  if (Tellertje = 4567) digitalWrite(LED_BUILTIN, LOW);
  if (Tellertje = 6000) digitalWrite(LED_BUILTIN, HIGH);
}


In mensen taal staat er:

in het geheugen wordt er een plekje gereserveerd om een getal in op te slaan. Dat plekje noemen we Tellertje.

we gebruiken een pootje waar we uitvoer naartoe sturen en dat is pootje LED_BUILTIN

we herhalen steeds het volgende:
... in het gereserveerde plekje Tellertje bewaren we de waarde millis()
... lees de waarde van het plekje Tellertje en als dat 2000 is, dan maken we pootje LED_BUILTIN de maximale spanning (bij een Uno is dat 5V)
... lees de waarde van het plekje Tellertje en als dat 4567 is, dan maken we pootje LED_BUILTIN 0V
... lees de waarde van het plekje Tellertje en als dat 6000 is, dan maken we pootje LED_BUILTIN de maximale spanning (bij een Uno is dat 5V)
ga weer naar het begin van loop()

Hierbij is het van belang dat je weet welke waarde milis() is. Bij het opstarten van de controler gaat er een tellertje lopen wat precies bijhoudt hoeveel milli seconden er is verstreken sinds het starten. millis() leest de waarde van dat tellertje
Dat tellertje blijft heel lang doorlopen dus als je nadenkt kom je een paar problemen tegen. Hoe vaak de loop ook wordt uitgevoerd, er zijn maximaal maar 3 kansen dat Tellertje precies de waarde heeft waarbij pootje LED_BUILTIN een opdracht moet uitvoeren.
Probleem 1: Als Tellertje 1999 is, wordt er niets gedaan, is bij de volgende keer millis() lezen de waarde 2001 wordt er weer niets gedaan ......
Nog een probleem.... stel Tellertje is exact 2000, en op een gegeven moment is Tellertje 4566 en bij de volgende keer lezen 4568. pootje LED_BUITIN zal dan nooit de waarde 0V krijgen. Het maakt daarna dus nooit meer iets uit of Tellerjte ooit de exact de waarde 6000 krijgt. pootje LED_BUILTIN is 5V .....

Begint er al iets te dagen?

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

Re: Waar moet ik beginnen??

Berichtdoor Gij Kieken » 07 Mei 2021, 09:34

Hey Richard,
Frits heeft ea al mooi toegelicht.
De Serial prints waren om vlug even mee te volgen op het scherm of alles wel lekker loopt.
De regels zijn voorzien van de commentaar tags, dus nu worden ze genegeerd door het programma.
m.a.w. je kunt die regels nu gerust verwijderen.
De tweede vraag ,in principe zou je dat kunnen.
Maar moest dit probleem zich voordoen dan moet er misschien een betere oplossing gezocht worden.
Er kan bijvoorbeeld een array aangemaakt worden met de tijdstippen, of een class module, of een State Machine beter uitwerken.
Kortom er zijn veel oplossingen om een bepaalde vraagstelling op te lossen.

Berichten: 20
Geregistreerd: 28 Apr 2020, 21:24

Re: Waar moet ik beginnen??

Berichtdoor RichardZ » 07 Mei 2021, 21:21

Beste Frits,

Als ik het goed begrijp wil je duidelijk maken dat de loop alles herhaald , en dat millis gewoon doorloopt
tot die aan zijn max zit en dan weer opnieuw begint al is wel heel lang.

en van die problemen die je aangeeft maak ik op dat die teller niet zo nauwkeurig de waardes kan aangeven
zodat hij soms 1999 millis aangeeft en de volgende keer als ik het programmatje laat lopen geeft hij 2001 aan, zodat er dus eigenlijk geen opdracht wordt uitgevoerd, zit ik juist.

is dat misschien wat gij kieken aangeeft met case 2000 ... 2002:

omdat probleem voor te zijn?

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Waar moet ik beginnen??

Berichtdoor Frits1956 » 07 Mei 2021, 23:26

RichardZ schreef:Beste Frits,

Als ik het goed begrijp wil je duidelijk maken dat de loop alles herhaald , en dat millis gewoon doorloopt
tot die aan zijn max zit en dan weer opnieuw begint al is wel heel lang.
Inderdaad

RichardZ schreef:en van die problemen die je aangeeft maak ik op dat die teller niet zo nauwkeurig de waardes kan aangeven.
Dat is niet helemaal de juist conclusie. De interne teller loopt heel nauwkeurig maar het moment dat je ernaar kijkt kan zijn dat de teller al verder is.

RichardZ schreef:is dat misschien wat gij kieken aangeeft met case 2000 ... 2002:
Dit ondervangt inderdaad een deel van het vorige probleem maar levert wellicht ook weer een volgend probleem. Kijken en precies 2000, volgende keer kijken en dan 2001 of 2002, dan wordt de opdracht namelijk 2x uitgevoerd terwijl dat mogelijk niet de bedoeling is.

Wat ik ook duidelijk probeer te maken, probeer heel analytisch te denken en alle mogelijkheden (gewenst en ongewenst) zodanig te vertalen naar de taal die de computer begrijpt. In het geval van de arduino IDE is dat C / C++
De woorden die je daarbij gebruikt en de syntax kan je vinden in de help

Berichten: 20
Geregistreerd: 28 Apr 2020, 21:24

Re: Waar moet ik beginnen??

Berichtdoor RichardZ » 08 Mei 2021, 09:21

goeie morgen Frits,

Dat is denk wel het grootste probleem dat ik niet de computertaal machtig ben.
en als je dan door zo code scrolled je heel veel informatie lees waar je ik nog de helft niet
van snap.

maar ik ga me verdiepen in de computertaal , ben al begonnen met de basis lesjes.
dus het begin is er.

Ik dacht van hoe moeilijk kan het nou zijn van nu lampje aan en dan lampje uit.
maar ik ondervind nu dat er toch wat haken en ogen aan zitten.

gr Richardz

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Waar moet ik beginnen??

Berichtdoor Frits1956 » 08 Mei 2021, 16:52

Een heel kort programma:

Code: Alles selecteren
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);  // Hiermee zeg je dat de controller het poortje met de ingebouwde led voor output moet gebruiken
}

void loop()                                      // Dit is de naam van de procedure. De procedure loop() wordt elke keer opnieuw uitgevoerd
{                                                    // Dit is het begin van de statements in de procedure
  digitalWrite(LED_BUILTIN, HIGH);   // Hiermee zeg je dat er de maximale spanning op het poortje gezet moet worden
  delay(1000);                                 // hiermee zeg je 1000 milliseconde niets te doen.
  digitalWrite(LED_BUILTIN, LOW);    // Hiermee zeg je dat d spanning op het poortje 0V moet worden
  delay(1000);                                 // hiermee zeg je 1000 milliseconde niets te doen.
}                                                    // Dit is het eind van deze procedure omdat het de procedure loop() is begint deze hierna opnieuw


Suc7 (meer dan 6) bij deze super leuke hobby als je de eerste beginselen een beetje onder de knie hebt.

Berichten: 20
Geregistreerd: 28 Apr 2020, 21:24

Re: Waar moet ik beginnen??

Berichtdoor RichardZ » 08 Mei 2021, 17:12

beste Frits,

Dit is toch gewoon de Blink code met delay.
Volgens mij als ik later meerdere leds op andere tijden wil laten branden via andere poorten
kan het niet omdat je met een delay de hele arduino stil legt.

Mijn eerste projectje was ook met de blink code en die snapte ik wel.
tot dat ik er een led bij zetten en het niet meer deed wat ik wilde.

maar bedank voor het meedenken

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Waar moet ik beginnen??

Berichtdoor shooter » 08 Mei 2021, 20:01

Ja richard heb je helemaal gelijk in, de volgende les is blink without delay, dat werkt met millis()
dat is een teller die elke milliseconde automatisch 1 ophoogt, zit gewoon standaard in de arduino.
De waarde van die teller kun je dus in een variabele zetten en dan trek je die af van de huidige stand van de teller dus millis - bewaarde stand >= wachttijd.
Dan is dus de tijd om en kun je van alles doen zoals een ledje aanzetten. Dan kun je ook de bewaarde stand weer op millis zetten en dan gaat je ledje bijvoorbeeld knipperen, maar je kunt ook een array vullen met tijden en daar op wachten.
paul deelen
shooter@home.nl

VorigeVolgende

Terug naar Theekransje

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten