C++ – Claasen-tech https://claasen-tech.nl Sun, 29 Dec 2024 13:55:06 +0000 nl-NL hourly 1 https://wordpress.org/?v=6.7.2 https://claasen-tech.nl/wp-content/uploads/2022/02/cropped-favicon-32x32.gif C++ – Claasen-tech https://claasen-tech.nl 32 32 De Arduino C++ taal https://claasen-tech.nl/c-plus-plus/de-arduino-c-plusplus-taal/ Tue, 25 Jun 2024 20:23:55 +0000 https://claasen-tech.nl/?p=3482 , , , ,

Arduino C++ is een versie van C++ aangepast voor Arduino microcontrollers en andere compatibele microcontroller-systemen. Het bevat speciale functies en bibliotheken om hardware zoals sensoren, motoren en dergelijke gemakkelijk uit te lezen of aan te sturen. Arduino C++ code wordt geschreven in de Arduino IDE. Dit is een eenvoudige programmeer omgeving om te gebruiken. Ze helpt bij het ontwikkelen, compileren en uploaden van de code naar de hardware. Hierdoor is het een goede keuze voor zowel beginners als gevorderden.

Voor installatie-instructies van de Arduino IDE en configuratie-details van het ESP32-DevKitC bord, raadpleeg ‘Installeren Arduino IDE‘ en ‘Configuratie van ESP32-DevKitC in Arduino IDE‘. Deze zijn ook te vinden onder ‘Technische Info’.

We gaan hieronder de Arduino C++ taal uitleggen. Hier wordt niet te diep in de Arduino C++ taal in gegaan, maar genoeg om de workshops te maken en meer. Ik begin met het invoeren van de taal delen die we in de workshops gebruiken. Zodra die klaar zijn, voeg ik ook andere toe.

Als je deze pagina voor het eerst bekijkt, kun je het beste van boven naar onderen werken om zo een goed overzicht te krijgen van Arduino C++. Later kun je rechtstreeks naar het onderwerp gaan wat je nog een keer wil bekijken. Zoeken met de zoekbalk kan natuurlijk ook.

  • Wat is de structuur van een programma
    Hier wordt omschreven waar een programma uit bestaat en hoe dit opgebouwd is.
  • setup()
    Dit is de eerste standaard functie die wordt doorlopen. De commando’s die hier uitgevoerd worden, hoeven en/of mogen maar één keer uitgevoerd te worden.
  • loop()
    Dit is de tweede standaard functie die wordt uitgevoerd. Dit is het hoofd gedeelte dat steeds weer wordt herhaald. Dus wordt het einde van deze functie bereikt, begint deze weer vooraan. Er komt geen einde aan.

Wat zijn variabelen

Bijzondere variabelen

  • Arrays
  • Constanten

Over variabelen

zichtbaarheid (scope)

Logische operatoren
(! && ||)

Vergelijkingsoperatoren
(== != < <= > >=)

Rekenkundige operatoren
(= + / * %)

Samengestelde toewijzingsoperatoren
(+= -= *= /= %= ++ – –)

In- en uitvoer

Zelf gemaakte functies

Tijd

Voorwaardelijke structuren

Herhaal structuren

  • for
  • do…while
  • while

Overige

  • break
  • continue
  • goto
  • return

Onder communicatie verstaan we het praten met andere microcomputers, sensoren, computer en gebruikers. Hier gebruiken we diverse protocollen (manieren) voor. Debuggen is het onderzoeken waarom iets gebeurt of juist niet gebeurt. Dit doe je als het programma niet doet wat jij ervan verwacht.

Serial

SPI

Wire / I2C

WIFI

Bluetooth

Debug

Nog geen gegevens

]]>
Notities https://claasen-tech.nl/c-plus-plus/notities/ Thu, 27 Jun 2024 18:00:22 +0000 https://claasen-tech.nl/?p=3467 ,

Notities in Arduino C++ zijn kleine stukjes tekst die je in je code schrijft om uit te leggen wat de code doet. De computer leest deze notities niet wanneer hij de code uitvoert. Ze helpen je onder andere om je eigen code beter te begrijpen. Er zijn twee soorten Notities:

  1. Enkelregelig notities
    Deze beginnen met ‘//’. Alles wat na ‘//’ op dezelfde regel staat, is een notities.
  2. Meerregelig notities
    Deze beginnen met ‘/*’ en eindigen met ‘*/’. Alles tussen ‘/*’ en ‘*/’ is een notitie, ook als het over meerdere regels gaat.

Waarom gebruik je commentaar?

  • Helderheid
    Notities maken je code gemakkelijker te begrijpen. Als je later terugkomt naar je code, helpen ze je herinneren wat je hebt gedaan.
  • Delen
    Als je je code deelt met anderen, helpt een notities hen te begrijpen wat elk deel van de code doet.
  • Herinneren
    Notities helpen je te herinneren waarom je bepaalde keuzes in je code hebt gemaakt. Of wat een eigen gemaakte functie doet, wat je door moet geven en wat de functie terug geeft.
  • Fouten vinden
    Als je problemen in je code probeert op te lossen, helpen notities je begrijpen waarom je bepaalde stukken code hebt geschreven. Ook kun je code tijdelijk uitschakelen door er een notitie van te maken.

Enkelregelig notitie

// Dit is een enkelregelig notitie.
// int ledPin = 16;
int ledPin = 13;  // Dit betekent dat de groene LED op pin 13 zit.

Meerregelig notitie

/* 
  Dit is een meerregelig notitie.
  Het kan over meerdere regels gaan.
*/
int ledPin = 10; /* Dit betekent dat de rode LED op pin 10 zit */

// onderstaande code tijdelijk uitgeschakeld.
/*
for(int x=0; x<5; x++){
  Serial.println("Print iets 5 keer");
}
*/

In het kort
Notities zijn kleine stukjes tekst die je in je code schrijft om dingen uit te leggen. Ze maken je code makkelijker te begrijpen en zijn handig voor jezelf en voor anderen die naar je code kijken. Maar doen verder niets.

]]>
setup() https://claasen-tech.nl/c-plus-plus/setupfunctie/ Tue, 23 Jan 2024 20:37:02 +0000 https://claasen-tech.nl/?p=2496 ,

Beschrijving
De setup()-functie wordt aangeroepen wanneer een programma begint. Gebruik deze functie om taken eenmalig uit te voeren. De setup()-functie wordt slechts één keer uitgevoerd, dit is na elke inschakeling of herstart (reset) van het microprocessor board. Wat in de setup() functie zit, is alles wat tussen de accolades {} staat. Deze geven het begin en het einde aan.

Syntax
setup() {
functies;
}

Parameters
functies: een of meerdere regels programma code.

Geeft terug
Niets.

Voorbeeld

int pin = 6;

void setup() {
  Serial.begin(115200);
  pinMode(pin, INPUT);
}

void loop() {
  // ...
}

Toelichting voorbeeld
In het voorbeeld zie je 2 functies staan. Deze zijn ‘Serial.begin(115200);’ en ‘pinMode(pin, INPUT);’. Dit zijn functies die je maar éénmaal hoeft uit te voeren. Daarom staan ze in setup()

Opmerkingen en waarschuwingen
De variabelen die in de setup()-functie geïnitieerd worden zijn alleen in de setup()-functie zichtbaar.

]]>
loop() https://claasen-tech.nl/c-plus-plus/loopfunctie/ Thu, 25 Jan 2024 21:24:39 +0000 https://claasen-tech.nl/?p=2549 ,

Beschrijving
Nadat de setup()-functie alle eenmalige taken heeft uitgevoerd, wordt de loop()-functie aangeroepen. De loop()-functie blijft zich herhalen. De functie begint met het eerste commando binnen de loop()-functie en voert daarna alle andere commando’s binnen deze functie uit. Bij het laatste commando gekomen, binnen de loop()-functie, springt het programma weer terug naar het eerste commando van de loop()-functie en gaat daar weer verder. Dit blijft zich herhalen totdat je het microprocessorbord uitzet of een herstart geeft. Wat in de loop() functie zit, is alles wat tussen de accolades {} staat. Deze geven het begin en het einde aan.

Syntax
loop() {
functies;
}

Parameters
functies: een of meerdere regels programma code.

Geeft terug
Niets.

Voorbeeld

int ledPin = 6;

void setup() {
  // ...
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

Toelichting voorbeeld
De loop()-functie bevat vier regels code. Op regel 8 zet de digitalWrite()-functie ledPin op HIGH, bijvoorbeeld om een led te activeren. Vervolgens wacht het programma 1.000 milliseconden (1 seconde). Daarna wordt ledPin op LOW gezet, gevolgd door nog eens 1.000 milliseconden wachten. Dit is het laatste commando in de loop(). Het programma keert terug naar het eerste commando en voert alle commando’s binnen de loop()-functie opnieuw uit: van regel 8 naar 9, 10, 11 en terug naar 8. Dit proces blijft zich herhalen.

Opmerkingen en waarschuwingen
De variabelen die in de loop()-functie geïnitieerd worden zijn alleen in de loop()-functie zichtbaar.

]]>
if https://claasen-tech.nl/c-plus-plus/if/ Sun, 17 Mar 2024 22:53:04 +0000 https://claasen-tech.nl/?p=2793 , ,

Beschrijving
De if-opdracht voert een controle uit. Als deze controle waar is, wordt de programma code binnen de if-opdracht uitgevoerd. Bijvoorbeeld ‘1 == 1’ is waar (true), maar ‘1 == 2’ is onwaar (false).

Syntax
if(vergelijking) {
functies;
}

Parameters
vergelijking: dit is een boolean vergelijking die als resultaat waar (true) of onwaar (false) heeft.
functies: een of meerdere regels programma code.

Enkele voorbeelden van vergelijkingen
1 == 1 (is gelijk aan, true) | 1 == 2 (is gelijk aan, false) | 1 > 2 (is groter dan, false) | 5 > 2 (is groter dan, true)
5 != 6 (is niet gelijk aan, true) | 5 <= 8 (is kleiner of gelijk aan, true) | 5 >= 8 (is groter of gelijk aan, false)

Geeft terug
Niets.

Voorbeeld

int temperatuur = 0;

void setup() {
  // ...
}

void loop() {

  // vul de variabele temperatuur door een temperatuursensor te lezen.

  if(temperatuur > 25){
    // Wordt uitgevoerd als de vergelijking waar is.
    // Geef aan dat het warm is.
  }

}

Toelichting voorbeeld
In de loop()-functie staat op regel 9 bijvoorbeeld een opdracht om een temperatuursensor uit te lezen en deze waarde wordt dan in de variabele ‘temperatuur’ gezet. Op regel 11 staat de if-opdracht en deze controleert of de temperatuur groter is dan 25. Indien de vergelijking true (waar) is, wordt een melding gegeven dat het warm is. De if-opdracht loopt dus van regel 11 t/m 14. Alles wat tussen de accolade ({) op regel 11 en de accolade (}) op regel 14 staat wordt uitgevoerd. Dit kan één regel zijn, maar ook 20 regels of meer.

]]>
else https://claasen-tech.nl/c-plus-plus/else/ Thu, 26 Dec 2024 13:23:31 +0000 https://claasen-tech.nl/?p=4058 , ,

Beschrijving
Else is een uitbreiding van de if-opdracht en heeft 2 vormen. Dit zijn de ‘else {}’ en de ‘else if () {}’.

De ‘else {}’ is de eenvoudigste, als de if controle niet waar is wordt de programma code achter ‘else’ (die tussen de ‘{}’ staat) uitgevoerd.

Met ‘else if () {}’ wordt een nieuwe controle uitgevoerd. als deze waar is, wordt de programma code (die tussen de ‘{}’ staat) uitgevoerd.

Je moet minimaal de ‘if () {}’ gebruiken. Je mag daarna één ‘else {}’ gebruiken. Of je mag een of meerdere ‘else if () {}’ gebruiken. Deze moet altijd na ‘if () {}’ én voor de ‘else {}’ komen. De ‘else {}’ is een optie, dus als je hem niet nodig hebt mag je hem weglaten.

Syntax

Optie 1 (zie ook if)

if (vergelijking) {
functies;
}

Optie 2 (alleen met else)

if (vergelijking) {
functies;
}
else {
functies;
}

Optie 3 (alleen met else if)

if (vergelijking) {
functies;
}
else if (vergelijking) {
functies;
}

Optie 4 (met else if én else)

if (vergelijking) {
functies;
}
else if (vergelijking){
}
else {
functies;
}

Bij optie 4 mogen dus meer dan een ‘else if () {}’ gebruikt worden.

Parameters
vergelijking: dit is een boolean vergelijking die als resultaat waar (true) of onwaar (false) heeft.
functies: een of meerdere regels programma code.

Enkele voorbeelden van vergelijkingen
1 == 1 (is gelijk aan, true) | 1 == 2 (is gelijk aan, false) | 1 > 2 (is groter dan, false) | 5 > 2 (is groter dan, true)
5 != 6 (is niet gelijk aan, true) | 5 <= 8 (is kleiner of gelijk aan, true) | 5 >= 8 (is groter of gelijk aan, false)

Geeft terug
Niets.

Voorbeeld

int leeftijd; // Variabele om de ingevoerde leeftijd op te slaan

void setup() {
  ...
}

void loop() {
  // geef de variabele 'leeftijd' een waarde
  
  // Bepaal de leeftijdsfase
    if (leeftijd < 12) {
      Serial.println("Je zit in de kindertijd.");
    } else if (leeftijd < 18) {
      Serial.println("Je zit in de tienerfase.");
    } else if (leeftijd < 65) {
      Serial.println("Je zit in de volwassenfase.");
    } else {
      Serial.println("Je zit in de seniorenfase.");
    }

  delay(1000); // Wacht 1 seconde
}

Toelichting voorbeeld
In dit voorbeeld wordt de variabele ‘leeftijd’ gevuld met een leeftijd van een persoon en wordt weergegeven in welke leeftijdfase de persoon zich bevindt.

De variabele ‘leeftijd’ wordt met een waarde gevuld.
Op regel 11 wordt door ‘if ()’ bepaald of ‘leeftijd’ kleiner is dan 12. Zo ja, dan wordt de programma code tussen de ‘{}’ uitgevoerd. In dit geval alleen regel 12, daarna gaat het programma verder naar regel 21. Als dit niet waar is gaat het programma verder op regel 13.

Hier wordt door ‘else if ()’ bepaald of leeftijd kleiner is dan 18. Zo ja, dan wordt de programma code tussen de ‘{}’ uitgevoerd. In dit geval alleen regel 14, daarna gaat het programma verder naar regel 21. Als dit niet waar is gaat het programma verder op regel 15.

Hier wordt door ‘else if ()’ bepaald of leeftijd kleiner is dan 65. Zo ja, dan wordt de programma code tussen de ‘{}’ uitgevoerd. In dit geval alleen regel 16, daarna gaat het programma verder naar regel 21. Als dit niet waar is gaat het programma verder op regel 17.

Hier wordt de ‘else {}’ uitgevoerd. Dit betekent dat de programma code tussen de ‘{}’ wordt uitgevoerd. In dit geval alleen regel 18, daarna gaat het programma verder naar regel 21.

Als het programma bij de regel met ‘else {}’ komt, wordt de programma code tussen de ‘{}’ altijd uitgevoerd.

]]>
Float https://claasen-tech.nl/c-plus-plus/float/ Sun, 29 Dec 2024 13:29:46 +0000 https://claasen-tech.nl/?p=3899 ,

Beschrijving
Float is een gegevenstype voor het opslaan van niet gehele (decimale) getallen.

Een float is een datatype dat gebruikt wordt om decimale getallen op te slaan, zoals ‘3.14’ of ‘-0.001’. Het verschil met een integer is dat een float ook waarden kan bevatten tussen hele getallen, wat handig is voor metingen die nauwkeurigheid vereisen, zoals temperatuur of snelheid. Een float neemt 4 bytes aan geheugen in beslag en kan een bereik aan van ongeveer -3.4E38 tot 3.4E38, met een precisie van ongeveer 6-7 cijfers.

  • Opmerkingen en waarschuwingen
    • Let op dat er geen komma wordt gebruikt om de gehele getallen te scheiden van de decimalen, maar een punt. Dus niet ‘3,14’ maar ‘3.14′.
    • Bij het toekennen van een waarde aan een variabele dien je altijd een punt te gebruiken, dus ‘1.0’ en NIET ‘1’.

Syntax
float var = waarde;

Parameters
var: variabelenaam.
waarde: de waarde die je toekent aan die variabele.

Voorbeeld

float Pi = 3.14159;
float temperatuur = 23.5;
float snelheid = 55.5;

Toelichting voorbeeld

Hierboven worden 3 variabelen gedefinieerd en wordt er een begin waarde toegekend. ‘Pi’ krijgt de waarde ‘3.14159’ toegekend, ‘temperatuur’ krijgt de waarde ‘23.5’ en ‘snelheid’ krijgt de waarde ‘55.5’. Neem bijvoorbeeld ‘temperatuur’, elke keer dat een temperatuur sensor uitgelezen wordt die waarde aan de variabele ‘temperatuur’ toegekend. Deze waarde wordt uitgedrukt met 1 of 2 decimalen en kan daardoor dus niet in een integer opgeslagen worden.

Opmerkingen en waarschuwingen
Geen.

]]>
Samengestelde toewijzingsoperatoren https://claasen-tech.nl/c-plus-plus/samengestelde-toewijzingsoperatoren/ Thu, 29 Aug 2024 21:04:49 +0000 https://claasen-tech.nl/?p=3867 , ,

Omschrijving
In Arduino C++ zijn operators speciale tekens die je helpen bij taken zoals rekenen en vergelijken. Je hebt rekenkundige operators zoals ‘+’, ‘-‘, ‘*’, en ‘/’ voor wiskundige berekeningen. Vergelijkingsoperators zoals ‘==’, ‘!=’, ‘>’, en ‘<‘ controleren of waarden gelijk zijn of hoe ze zich tot elkaar verhouden. Logische operators zoals ‘!’, ‘&&’, en ‘||’ voeren logische bewerkingen uit. Met deze operators wordt het makkelijker om berekeningen en vergelijkingen in je code uit te voeren, zodat je programma precies doet wat je wilt. Hier bekijken we de samengestelde toewijzingsoperatoren. Deze zijn vergelijkbaar met de rekenkundige operators, maar compacter. Er zijn er 10, maar we gaan er voor nu 7 bekijken.

Samengestelde toewijzingsoperatoren zijn speciale tekens in programmeertalen die je helpen om snel en efficiënt wiskundige bewerkingen uit te voeren en de resultaten op te slaan in variabelen.

  1. += (samengestelde optelling):
    • Voegt een waarde toe aan een variabele en slaat het resultaat op in dezelfde variabele.
    • Voorbeeld:
      Als x gelijk is aan 10 en je schrijft ‘x += 5’, dan wordt x nu 15.
      De lange versie zou zijn: ‘x = x + 5’
  2. -= (samengestelde aftrekking):
    • Trekt een waarde af van een variabele en slaat het resultaat op in dezelfde variabele.
    • Voorbeeld:
      Als y gelijk is aan 20 en je schrijft ‘y -= 4’, dan wordt y nu 16.
      De lange versie zou zijn: ‘x = x – 4’
  3. *= (samengestelde vermenigvuldiging):
    • Vermenigvuldigt een variabele met een waarde en slaat het resultaat op in dezelfde variabele.
    • Voorbeeld:
      Als z gelijk is aan 3 en je schrijft ‘z *= 2’, dan wordt z nu 6.
      De lange versie zou zijn: ‘z = z * 6’
  4. /= (samengestelde deling):
    • Deelt een variabele door een waarde en slaat het resultaat op in dezelfde variabele.
      Als de resultaat variabele (a) een int is, gaat een deel verloren. Alleen het gedeelte van het gehele deel van het getal wordt opgeslagen.
    • Voorbeeld:
      • Als a een integer is, dus ‘int a = 14’.
        Als a gelijk is aan 14 en je schrijft ‘a /= 4’, dan wordt a nu 3.
        De lange versie zou zijn: ‘a = a / 4’
      • Als a een float is, dus float a =14.
        Als a gelijk is aan 14 en je schrijft ‘a /= 4’, dan wordt a nu 3,5.
        De lange versie zou zijn: ‘a = a / 4’
  5. %= (samengestelde modulo):
    • Berekent de rest van de deling uit, van een variabele die gedeeld wordt door een waarde en slaat het resultaat op in dezelfde variabele.
    • Voorbeeld:
      Als b gelijk is aan 7 en je schrijft ‘b %= 3’, dan wordt b nu 1.
      3 zit 2 keer in 7 (dit is 6), dus houd je 1 over (dit is de rest).
      De lange versie zou zijn: ‘b = b % 3’
  6. — (decrement):
    • Verlaagt de waarde van een variabele met 1.
    • Voorbeeld:
      Als count gelijk is aan 5 en je schrijft ‘count–‘, dan wordt count nu 4.
      De lange versie zou zijn: ‘count = count – 1’
  7. ++ (increment):
    • Verhoogt de waarde van een variabele met 1.
    • Voorbeeld:
      Als score gelijk is aan 8 en je schrijft ‘score++’, dan wordt score nu 9.
      De lange versie zou zijn: ‘score = score +1’

Wat is pre-increment/post-increment en pre-decrement/post-decrement:

Pre-increment en post-increment, evenals pre-decrement en post-decrement, zijn manieren om een getal in programmeertalen zoals C++ te verhogen (incrementeren) of te verlagen (decrementeren). Bij pre-increment wordt het getal eerst verhoogd voordat het in een berekening wordt gebruikt, bijvoorbeeld ‘++x’. Bij post-increment wordt het getal eerst gebruikt in een berekening en daarna verhoogd, bijvoorbeeld ‘x++’. Hetzelfde geldt voor pre-decrement (–x) en post-decrement (x–), waarbij ‘–x’ eerst verlaagt en dan gebruikt, en ‘x–‘ eerst gebruikt en dan verlaagt. Deze operatoren zijn handig bij het tellen of bij lussen in programma’s.

  • Pre-increment (++) en pre-decrement (–): Eerst wordt de waarde van de variabele verhoogd of verlaagd, en daarna wordt deze nieuwe waarde gebruikt in de rest van de uitdrukking. Voorbeeld:
  int x = 5;
  int result = ++x; // result wordt 6, x wordt 6
  • Post-increment (++) en post-decrement (–): Eerst wordt de huidige waarde van de variabele gebruikt in de rest van de uitdrukking, en daarna wordt de waarde van de variabele verhoogd of verlaagd. Voorbeeld:
  int y = 5;
  int result = y++; // result wordt 5, y wordt 6

Deze operatoren zijn handig bij het schrijven van code omdat ze je helpen om sneller en efficiënter basis-wiskundige bewerkingen uit te voeren en variabelen te wijzigen.

Voorbeeld
Een veel gebruikte situatie de for-lus:

int ledPin = 13;  // Verbind de LED met pin 13

void setup() {
  pinMode(ledPin, OUTPUT);  // Stel de LED-pin in als uitgang
}

void loop() {
  for (int i = 0; i < 15; i++) {
    digitalWrite(ledPin, HIGH);  // Zet de LED aan
    delay(500);                  // Wacht 500 milliseconden
    digitalWrite(ledPin, LOW);   // Zet de LED uit
    delay(500);                  // Wacht 500 milliseconden
  }
  
  // Als de loop is voltooid, wacht het programma 10 seconden en begint weer opnieuw op regel 7.
  delay(10000); // wacht 10 seconden
}

Hier gebruiken we het ‘++’ teken om x elke keer met 1 te verhogen.

]]>
Vergelijkingsoperatoren https://claasen-tech.nl/c-plus-plus/vergelijkingsoperatoren/ Thu, 27 Jun 2024 20:45:26 +0000 https://claasen-tech.nl/?p=3689 , ,

Omschrijving
In Arduino C++ zijn operators speciale tekens die je helpen bij taken zoals rekenen en vergelijken. Je hebt rekenkundige operators zoals ‘+’, ‘-‘, ‘*’, en ‘/’ voor wiskundige berekeningen. Vergelijkingsoperators zoals ‘==’, ‘!=’, ‘>’, en ‘<‘ checken of dingen gelijk zijn of hoe ze zich tot elkaar verhouden. Logische operators zoals ‘!’, ‘&&’, en ‘||’ voeren logische bewerkingen uit. Met deze operators wordt het makkelijker om berekeningen en vergelijkingen in je code te doen, zodat je programma precies doet wat je wilt. Hier bekijken we de Vergelijkingsoperatoren.

Vergelijkingsoperatoren in Arduino C++ zijn speciale tekens die je kunt gebruiken om dingen met elkaar te vergelijken. Ze helpen je om te kijken of iets waar is of niet waar is in je programma. Hier zijn de belangrijkste:

  1. Gelijk aan
    ‘==’ (twee gelijke tekens naast elkaar). Dit gebruik je om te kijken of twee dingen precies hetzelfde zijn.
    • Bijvoorbeeld: ‘if (leeftijd == 10)’ betekent “als de leeftijd precies 10 is”.
  2. Niet gelijk aan
    ‘!=’ (uitroepteken en gelijkteken naast elkaar). Hiermee kijk je of twee dingen niet hetzelfde zijn.
    • Bijvoorbeeld: ‘if (kamer != “slaapkamer”)’ betekent “als de kamer niet de slaapkamer is”.
  3. Kleiner dan
    ‘<‘ (kleiner teken). Dit gebruik je om te zien of iets kleiner is dan iets anders.
    • Bijvoorbeeld: ‘if (aantalAppels < 5)’ betekent “als het aantal appels minder dan 5 is”.
  4. Kleiner dan of gelijk aan
    ‘<=’ (kleiner teken en gelijkteken naast elkaar). Hiermee kijk je of iets kleiner is dan of gelijk aan iets anders.
    • Bijvoorbeeld: ‘if (temperatuur <= 25)’ betekent “als de temperatuur 25 graden of minder is”.
  5. Groter dan
    ‘>’ (groter teken). Dit gebruik je om te kijken of iets groter is dan iets anders.
    • Bijvoorbeeld: ‘if (tijd > 12)’ betekent “als de tijd groter is dan 12 uur”.
  6. Groter dan of gelijk aan
    ‘>=’ (groter teken en gelijkteken naast elkaar). Hiermee kijk je of iets groter is dan of gelijk aan iets anders.
    • Bijvoorbeeld: ‘if (punten >= 100)’ betekent “als het aantal punten 100 of meer is”.

Waarom zijn Vergelijkingsoperatoren Handig?

  • Ze helpen je om beslissingen te nemen in je programma’s, zoals of je een lampje moet aanzetten als het donker is, of een bericht moet laten zien als iemand iets goed heeft gedaan.
  • Vergelijkingsoperatoren maken het makkelijker om te bepalen wat er moet gebeuren op basis van wat er gebeurt in je programma.

Voorbeeld
Stel je voor dat je een programma hebt dat controleert of het buiten regent. Je zou het kunnen schrijven als:

int regenSensor = 1;  // Stel in dat er regen is (1 betekent ja, 0 betekent nee)

if (regenSensor == 1) {
  Serial.println("Het regent buiten! Neem je paraplu mee.");
} else {
  Serial.println("Het regent niet buiten. Je kunt zonder paraplu gaan.");
}

Hier gebruiken we het ‘==’ teken om te kijken of regenSensor gelijk is aan 1. Als dat zo is, printen we een bericht om te zeggen dat het regent. Anders, als regenSensor niet gelijk is aan 1 (wat zou betekenen dat het niet regent), printen we een ander bericht.

Vergelijkingsoperatoren maken programmeren leuk omdat ze je helpen om je programma’s te laten weten wat ze moeten doen, net zoals je beslissingen maakt in het dagelijks leven!

]]>
Rekenkundige operatoren https://claasen-tech.nl/c-plus-plus/rekenkundige-operatoren/ Tue, 25 Jun 2024 20:04:10 +0000 https://claasen-tech.nl/?p=3468 , ,

Omschrijving
In Arduino C++ zijn operators speciale tekens die je helpen bij taken zoals rekenen en vergelijken. Je hebt rekenkundige operators zoals ‘+’, ‘-‘, ‘*’, en ‘/’ voor wiskundige berekeningen. Vergelijkingsoperators zoals ‘==’, ‘!=’, ‘>’, en ‘<‘ checken of dingen gelijk zijn of hoe ze zich tot elkaar verhouden. Logische operators zoals ‘!’, ‘&&’, en ‘||’ voeren logische bewerkingen uit. Met deze operators wordt het makkelijker om berekeningen en vergelijkingen in je code te doen, zodat je programma precies doet wat je wilt. Hier bekijken we de rekenkundige operators.

Rekenkundige operators
Dit zijn speciale tekens in programma’s waarmee je wiskundige berekeningen kunt doen. Hier zijn wat voorbeelden:

  1. Optellen (+): Met dit teken tel je twee getallen bij elkaar op. Bijvoorbeeld, 3 + 5 = 8.
  2. Aftrekken (-): Met dit teken trek je het ene getal van het andere af. Bijvoorbeeld, 7 – 4 = 3.
  3. Vermenigvuldigen (*): Met dit teken vermenigvuldig je twee getallen met elkaar. Bijvoorbeeld, 2 * 6 = 12.
  4. Delen (/): Met dit teken deel je het ene getal door het andere. Bijvoorbeeld, 10 / 2 = 5.

Deze tekens maken het makkelijker om ingewikkelde berekeningen te doen in je programma’s, net zoals je op een rekenmachine zou doen!

Volgorde van rekenkundige operators
Het is ook belangrijk om te weten dat de volgorde waarin je deze tekens gebruikt, de uitkomst van je berekeningen kan veranderen:

  1. Haakjes: Berekeningen tussen haakjes worden altijd als eerste gedaan. Bijvoorbeeld, in ‘(4 + 5) * 3’ reken je eerst ‘4 + 5’ uit tot ‘9’, en dan ‘9 * 3′, wat ’27’ oplevert.
  2. Vermenigvuldigen en delen: Deze worden eerst gedaan voordat je optellen en aftrekken doet. Bijvoorbeeld, in ‘4 + 5 * 3’, eerst ‘5 * 3’ uitrekenen geeft 15, en dan ‘4 + 15′ geeft ’19’.
  3. Optellen en aftrekken: Deze worden van links naar rechts uitgevoerd als er geen haakjes zijn. Bijvoorbeeld, in ’10 – 3 + 2′, eerst ’10 – 3′ geeft ‘7’, en dan ‘7 + 2’ geeft ‘9’.

Deze regels zorgen ervoor dat je de juiste antwoorden krijgt in je berekeningen, net zoals bij het gebruik van een rekenmachine!

Als een berekening ingewikkelder wordt, maak dan gebruik van haken. Dit vereenvoudigt de berekening, maakt hem overzichtelijker en zodoende minder fout gevoelig.

Voorbeeld
Bijvoorbeeld ‘x = 5 + 16 * 3 / 3 – 2’, wat is de waarde van x nu?

Om de waarde van ( x ) te vinden in de berekening ( x = 5 + 16 * 3 / 3 – 2 ), moeten we de volgorde van de rekenkundige operatoren volgen:

  1. Eerst wordt vermenigvuldigen en delen uitgevoerd van links naar rechts:
  • ( 16 * 3 / 3 )
  • ( 16 * 3 = 48 )
  • ( 48 / 3 = 16 )
  1. Vervolgens wordt optellen en aftrekken van links naar rechts uitgevoerd:
  • ( 5 + 16 = 21 )
  • ( 21 – 2 = 19 )

Dus, ( x = 19 ).

Verklaring:

  • Eerst wordt ( 16 * 3 = 48 ) berekend.
  • Vervolgens wordt ( 48 / 3 = 16 ).
  • Dan wordt ( 5 + 16 = 21 ) berekend.
  • Tot slot wordt ( 21 – 2 = 19 ).

De volgorde van bewerkingen wordt bepaald door de rekenkundige regels waarbij vermenigvuldigen en delen voorrang hebben op optellen en aftrekken, en bewerkingen van links naar rechts worden uitgevoerd als ze dezelfde prioriteit hebben.

]]>
for https://claasen-tech.nl/c-plus-plus/for/ Sun, 16 Jun 2024 12:58:29 +0000 https://claasen-tech.nl/?p=3453 , , ,

Omschrijving
De ‘for’-lus in Arduino is een manier om een stuk code meerdere keren achter elkaar uit te voeren zonder dat je die code steeds opnieuw hoeft te schrijven. Het werkt door eerst een startpunt in te stellen (zoals ‘i = 0’), dan te bepalen hoe lang de herhalingen doorgaan (bijvoorbeeld zolang ‘i’ minder is dan 5), en ten slotte te bepalen hoe de variabele verandert na elke herhaling (meestal door ‘i’ met 1 te verhogen). Dit is handig om bijvoorbeeld een LED meerdere keren te laten knipperen. In plaats van vijf keer dezelfde code te schrijven, gebruik je een ‘for’-lus om te zeggen: “Doe deze actie vijf keer”. Het maakt je programma korter en makkelijker te begrijpen.

Syntax
for(a;b;c){functies}

Parameters
a: hier geef je de begin waarde op, bijvoorbeeld ‘int i=1’
b: hier geef je aan hoe lang het uitgevoerd moet worden, bijvoorbeeld ‘i<11’
c: hier geef je aan hoe ‘i’ dient te veranderen, bijvoorbeeld ‘i=i+1’ (de verkorte schrijfwijze is: ‘i++’)
functies: dit zijn de commando regels die uitgevoerd dienen te worden zolang er aan de voorwaarde die bij b is opgegeven. Bijvoorbeeld zolang i kleiner is dan 11.

Geeft terug
Niets.

Voorbeeld

void setup() {
  Serial.begin(115200);
}

void loop() {
  for(int i=1 ; i<11 ; i=i+1 ){
    Serial.print("i = ");
    Serial.println(i);
  }
  Serial.println("Klaar.");
  Serial.println();
  delay(20000); // wacht 20 seconden
}

Toelichting voorbeeld

setup()
De seriële poort wordt geopend om gegevens naar de seriële monitor te schrijven.

loop()
Op regel 6 wordt gebruik gemaakt van de ‘for’-lus. Hier krijgt ‘i’ de begin waarde ‘1’, wordt de lus uitgevoerd zolang ‘i’ kleiner is dan 11 en ‘i’ wordt elke keer met 1 verhoogt.

Dus regel 6 wordt uitgevoerd en gaat dan de lus uitvoeren (indien i kleiner is dan 11), dit zijn de regels 7 en 8. Daarna gaat hij weer naar regel 6 en ‘i’ wordt met 1 verhoogt. Er wordt gecontroleerd of ‘i’ nog altijd kleiner is als 11. Zo ja, de regels 7 en 8 worden weer uitgevoerd. Dit gaat zo verder totdat het ‘i’ 11 wordt, de controle wordt uitgevoerd en ‘i’ is dus NIET meer kleiner dan 11. De lus wordt nu niet meer herhaald.

Regels 10, 11 en 12 worden uitgevoerd en het programma gaat weer naar regel 6. De ‘for’-lus begint weer opnieuw. Hier krijgt ‘i’ de begin waarde ‘1’, wordt de lus uitgevoerd zolang ‘i’ kleiner is dan 11 en ‘i’ wordt elke keer met 1 verhoogt.

Dit herhaald zich totdat je de microprocessorboard uitzet.

Uitvoer

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
Klaar.

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
Klaar.

Bovenstaand blijft zich herhalen totdat de microcontrollerboard uitgezet wordt.

Notities en waarschuwingen
Je kunt hier verschillende type variabelen gebruiken voor ‘i’.

]]>
Scope https://claasen-tech.nl/c-plus-plus/scope/ Mon, 22 Apr 2024 20:08:35 +0000 https://claasen-tech.nl/?p=2995 ,

De scope van een variabele verwijst naar het deel van een programma waar de variabele toegankelijk is en gebruikt kan worden. In programmeren bepaalt de scope dus waar een variabele bekend en beschikbaar is voor bewerkingen. Dit is belangrijk voor het beheren van gegevens en het voorkomen van fouten in code.

Er zijn verschillende soorten scopes:

  1. Globale scope: Een variabele die globaal is gedefinieerd, is overal in het programma toegankelijk. Zodra een variabele buiten alle functies en blokken wordt gedefinieerd, wordt deze beschouwd als globaal.
  2. Lokale scope: Een lokale variabele wordt gecreëerd binnen een functie of een blok en is alleen toegankelijk binnen die functie of dat blok. Als je de functie of het blok verlaat, wordt de variabele niet meer herkend en kun je er niet meer mee werken.
  3. Blok scope: Binnen programmeertalen die dit ondersteunen (zoals C++ met de {} haakjes), is een variabele die binnen een blok (zoals een lus of een if-statement) wordt gedefinieerd, alleen binnen dat specifieke blok toegankelijk.

De scope van een variabele helpt bij het organiseren van de code en voorkomt conflicten tussen variabelen die mogelijk dezelfde naam hebben maar in verschillende delen van het programma worden gebruikt. Het zorgt ook voor efficiënt geheugengebruik, omdat lokale variabelen vrijgegeven worden wanneer hun scope eindigt.

Voorbeeld code

int x = 10; // Globale scope

void setup(){
  Serial.begin(115200);
  
  int y = 5; // Lokale scope
  Serial.println(y);
  Serial.println(x);
  Serial.println(k); // niet zichtbaar hier
  Serial.println(z); // niet zichtbaar hier
  Serial.println(j); // niet zichtbaar hier
}

void loop(){
  int k = 8; // Lokale scope
  Serial.println(y); // niet zichtbaar hier
  Serial.println(x);
  Serial.println(k);
  Serial.println(z); // niet zichtbaar hier
  Serial.println(j); // niet zichtbaar hier

  for (int j = 0; j < 100; j++) { // j heeft een blok scope
    Serial.println(y); // niet zichtbaar hier
    Serial.println(x);
    Serial.println(k);
    Serial.println(z); // niet zichtbaar hier
    Serial.println(j);
  }
  
  mijnFunctie();
}

void mijnFunctie(){
  int z = 0; // Lokale scope
  Serial.println(y); // niet zichtbaar hier
  Serial.println(x);
  Serial.println(k); // niet zichtbaar hier
  Serial.println(z);
  Serial.println(j); // niet zichtbaar hier
}

Toelichting voorbeeld
Serial.begin(115200) en Serial.println() zijn functies die het mogelijk maken gegevens op het scherm te zetten binnen het Arduino IDE programma.

Op de regels: 9, 10, 11, 16, 19, 20, 23, 26, 35, 37, 39 gaat het fout. Hier zijn de variabelen NIET zichtbaar en kun je ze dus ook niet gebruiken. Zou je dit programma in de Arduino IDE laden en compileren, geven deze regels errors.

Alle variabelen die buiten de setup()-functie en loop()-functie gemaakt worden, zoals x in het voorbeeld, zijn overal zichtbaar. Deze noemt men ook wel globale variabelen.

]]>
Logische operatoren https://claasen-tech.nl/c-plus-plus/booleaanse-operatoren/ Thu, 28 Mar 2024 20:42:06 +0000 https://claasen-tech.nl/?p=2880 ,

Omschrijving
In Arduino C++ zijn operators speciale tekens die je helpen bij taken zoals rekenen en vergelijken. Je hebt rekenkundige operators zoals ‘+’, ‘-‘, ‘*’, en ‘/’ voor wiskundige berekeningen. Vergelijkingsoperators zoals ‘==’, ‘!=’, ‘>’, en ‘<‘ checken of dingen gelijk zijn of hoe ze zich tot elkaar verhouden. Logische operators zoals ‘!’, ‘&&’, en ‘||’ voeren logische bewerkingen uit. Met deze operators wordt het makkelijker om berekeningen en vergelijkingen in je code te doen, zodat je programma precies doet wat je wilt. Hier bekijken we de logische operators.

Omschrijving
De ! operator, ook bekend als de logische NOT-operator, verandert de waarheidswaarde van iets. In programmeertalen betekent dit dat als je de ! operator gebruikt, het omgekeerde resultaat krijgt: als iets waar (true) is, wordt het onwaar (false); en als iets onwaar (false) is, wordt het waar (true). Dit wordt vaak gebruikt in programma’s om te controleren of iets wel of niet gebeurt. Bijvoorbeeld, als a een booleaanse variabele is (een variabele die alleen true of false kan zijn), dan is ‘!a’ true als ‘a’ false is, en false als ‘a’ true is.

Voorbeeld

bool var1 = true;
int x1 = 6;
int x2 = 10;

Serial.print("var1 = ");
Serial.println(var1);
Serial.print("!var1 = ");
Serial.println(!var1);

if ( var1 ){
    Serial.println("Regel 1");
}

if ( !var1 ){
     Serial.println("Regel 2");
}

if ( x1 == x2 ){
     Serial.println("Regel 3");
}

// '==' vergelijkt het linker deel met het rechter deel, als ze gelijk zijn geeft dit waar
if ( !(x1 == x2) ){
     Serial.println("Regel 4");
}

Uitvoer

-- Begin --

var1 = 1
!var1 = 0
Regel 1
Regel 4
var1 = 1
!var1 = 0
Regel 1
Regel 4

Omschrijving
De && operator staat voor “logische EN” en wordt gebruikt om te controleren of twee condities tegelijkertijd waar zijn. In een uitdrukking als conditie1 && conditie2, wordt het geheel alleen true (waar) als zowel ‘conditie1’ als ‘conditie2’ waar zijn. Als een van beide of beide condities onwaar (‘false’) zijn, dan resulteert de uitdrukking in ‘false’. Deze operator is essentieel in programmering en logica voor het combineren van meerdere voorwaardelijke checks in één statement, waardoor striktere controle mogelijk is over de flow van de code.

var1var2Resultaat
true&&true=true
true&&false=false
false&&true=false
false&&false=false

Voorbeeld

bool var1 = true;
bool var2 = true;
bool var3 = false;
bool var4 = false;
int x1 = 6;
int x2 = 10;
int x3 = 6;

if ( var1 && var2 ){
    Serial.println("Regel 1");
}

if ( var1 && var3 ){
     Serial.println("Regel 2");
}

if ( var3 && var4 ){
     Serial.println("Regel 3");
}

// '==' vergelijkt het linker deel met het rechter deel, als ze gelijk zijn geeft dit waar
if ( (x1 == x2) && var1 ){
     Serial.println("Regel 4");
}

// '==' vergelijkt het linker deel met het rechter deel, als ze gelijk zijn geeft dit waar
  if ( (x1 == x3) && var2 ){
     Serial.println("Regel 5");
}

Uitvoer

-- Begin --

Regel 1
Regel 5

Omschrijving
De || operator, bekend als “logische OF”, wordt gebruikt om te checken of ten minste één van twee condities waar is. In een uitdrukking als ‘conditie1 || conditie2′, resulteert het geheel in ‘true’ (waar) als óf ‘conditie1’, óf ‘conditie2’, óf beide waar zijn. Het wordt alleen ‘false’ (onwaar) als beide condities onwaar zijn. Deze operator is handig voor situaties waarin je wilt dat een stuk code wordt uitgevoerd als aan ten minste één van meerdere criteria is voldaan, waardoor je meer flexibiliteit hebt in je controlestructuren.

var1var2Resultaat
true||true=true
true||false=true
false||true=true
false||false=false

Voorbeeld

bool var1 = true;
bool var2 = true;
bool var3 = false;
bool var4 = false;
int x1 = 6;
int x2 = 10;
int x3 = 6;

if ( var1 || var2 ){
    Serial.println("Regel 1");
}

if ( var1 || var3 ){
     Serial.println("Regel 2");
}

if ( var3 || var4 ){
     Serial.println("Regel 3");
}

// '==' vergelijkt het linker deel met het rechter deel, als ze gelijk zijn geeft dit waar
if ( (x1 == x2) || var1 ){
     Serial.println("Regel 4");
}

// '==' vergelijkt het linker deel met het rechter deel, als ze gelijk zijn geeft dit waar
  if ( (x1 == x3) || var2 ){
     Serial.println("Regel 5");
}

Uitvoer

-- Begin --

Regel 1
Regel 2
Regel 4
Regel 5
]]>
Bool https://claasen-tech.nl/c-plus-plus/bool/ Sun, 24 Mar 2024 17:47:13 +0000 https://claasen-tech.nl/?p=2870 ,

Beschrijving
Een bool bevat één van twee waarden, ‘true’ (waar) of ‘false’ (onwaar). (Elke bool variabele neemt één byte geheugen in beslag.).

Syntax
bool var = waarde;

Parameters
var: variabelenaam.
waarde: de waarde die je toekent aan die variabele.

Voorbeeld

// Hier maak je een variabele die aangeeft op welke pin het ledje aangesloten zit.
int pin1 = 22; // GPIO22

// Deze pin lees je de status van de drukknop uit
int pin3 = 36; // GPIO36

// status van de drukknop wordt in deze bool variabele opgeslagen
bool statusPin = false;

// de setup functie wordt een keer uitgevoerd als je het Single Board Computer start of reset.
void setup() {
   // initializeert de digital pinnen 'pin1' en 'pin2' als uitvoer.
   pinMode(pin1, OUTPUT);
   pinMode(pin3, INPUT);
}

// de loop functie loopt keer op keer opnieuw, het is een eindeloze lus.
void loop() {

  // de status van de drukknop wordt opgeslagen in statusPin
  statusPin = digitalRead(pin3); // statusPin krijgt hier de waarde 0 of 1.

  digitalWrite(pin1, statusPin ); // led brandt als statusPin een waarde '1', 'true' of 'HIGH' heeft.

  delay(100);
}

Toelichting voorbeeld
In het voorbeeld hierboven wordt op regel 8 de variabele ‘statusPin’ als bool gedefinieerd en krijgt de waarde ‘false’. Op regel 21 krijgt deze een nieuwe waarde toegekend door het uitlezen van de drukknop met de functie digitalRead. Op regel 23 wordt deze waarde gebruikt door de functie digitalWrite om een led aan of uit te zetten. Lees de opmerking hieronder.

Opmerking

bool waarden en constanten
In de Arduino IDE C++ zijn een aantal constanten (dit zijn variabelen die niet gewijzigd kunnen worden) gedefinieerd. Enkele van die constanten zijn ‘true’, ‘false’, ‘HIGH’ en ‘LOW’. Deze hebben een waarde 0 of 1. Dus de bool-waarden ‘true’, ‘HIGH’ of ‘1’ zijn gelijk. En de bool-waarden ‘false’, ‘HIGH’ en ‘0’ zijn ook gelijk. Hieruit kun je afleiden dat een bool variabele maar 2 waardes kan hebben, 0 of 1.

Hieronder een voorbeeld waar je kunt zien dat ‘1’, ‘true’ en ‘HIGH’ hetzelfde zijn. Daaronder staat de uitvoer van dit programma.

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(5000);
  Serial.println("-- Begin --");
  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
  bool x = false;
  bool y = LOW;
  bool z = 0;
  int waarde = 10;

  Serial.println("De volgende variabelen zijn als volgt gedefinieerd:");
  Serial.println("bool x = false;");
  Serial.println("bool y = LOW;");
  Serial.println("bool z = 0;");
  Serial.println("waarde = 10;");
  Serial.println("--------------------------------------------------");
  Serial.println();

  Serial.print("x: ");
  Serial.println(x);

  Serial.print("y: ");
  Serial.println(y);

  Serial.print("z: ");
  Serial.println(z);

  Serial.print("Waarde: ");
  Serial.println(waarde);

  waarde = x;
  Serial.print("Waarde = x: ");
  Serial.println(waarde);

  waarde = y;
  Serial.print("Waarde = y: ");
  Serial.println(waarde);

  waarde = z;
  Serial.print("Waarde = z: ");
  Serial.println(waarde);
  Serial.println();
  Serial.println();
  Serial.println();


  x = true;
  y = HIGH;
  z = 1;
  waarde = 15;

  Serial.println("De variabelen zijn opnieuw als volgt gedefinieerd:");
  Serial.println("bool x = true;");
  Serial.println("bool y = HIGH;");
  Serial.println("bool z = 1;");
  Serial.println("waarde = 15;");
  Serial.println("--------------------------------------------------");
  Serial.println();

  Serial.print("x: ");
  Serial.println(x);

  Serial.print("y: ");
  Serial.println(y);

  Serial.print("z: ");
  Serial.println(z);

  Serial.print("Waarde: ");
  Serial.println(waarde);

  waarde = x;
  Serial.print("Waarde = x: ");
  Serial.println(waarde);

  waarde = y;
  Serial.print("Waarde = y: ");
  Serial.println(waarde);

  waarde = z;
  Serial.print("Waarde = z: ");
  Serial.println(waarde);
  Serial.println();

  delay(240000);
}
-- Begin --

De volgende variabelen zijn als volgt gedefinieerd:
bool x = false;
bool y = LOW;
bool z = 0;
waarde = 10;
--------------------------------------------------

x: 0
y: 0
z: 0
Waarde: 10
Waarde = x: 0
Waarde = y: 0
Waarde = z: 0



De variabelen zijn opnieuw als volgt gedefinieerd:
bool x = true;
bool y = HIGH;
bool z = 1;
waarde = 15;
--------------------------------------------------

x: 1
y: 1
z: 1
Waarde: 15
Waarde = x: 1
Waarde = y: 1
Waarde = z: 1
]]>
digitalRead() https://claasen-tech.nl/c-plus-plus/digitalread/ Mon, 18 Mar 2024 20:00:54 +0000 https://claasen-tech.nl/?p=2818 ,

Omschrijving
Het digitalRead() functie wordt gebruikt in het programma gebruikt om de status van een digitale pin op een microcontroller (zoals de Arduino / ESP32) te lezen. De pin die gelezen wordt, moet wel eerst als invoer gedefinieerd worden. Dit doe je met de functie pinMode(). Daarna kan met de functie digitalRead() een digitale pin gelezen worden. Dit resulteert in een waarde ‘hoog’ (HIGH) of ‘laag’ (LOW). Deze waarde wordt door de functie terug gegeven en kan in een variabele opgeslagen worden voor later gebruik.

Syntax
digitalRead(pin)

Parameters
pin: is het GPIO nummer dat je uit wil lezen. Dus voor bijvoorbeeld GPIO1 voer je hier ‘1’ in.

Geeft terug
HIGH of LOW.

Voorbeeld

int knopPin = 16;
int retourWaarde = 0;

void setup() {
  pinMode(knopPin, INPUT); // Stel de pin in als een invoerpin
}

void loop() {
  retourWaarde = digitalRead(knopPin); // leest de waarde uit van de invoer pin en kent deze toe aan de variabele retourWaarde
  delay(1000); // Wacht 1 seconde
  // rest van het programma
}

Toelichting voorbeeld
Eerst worden 2 variabelen gedefinieerd. Een bevat een waarde die aangeeft om welke pin het gaat (knopPin). Dit is handig omdat je tijdens de ontwikkeling van het programma deze waarde overal moeten wijzigen als deze tijdens het ontwikkelen wijzigt. In de andere variabele zetten we de waarde die uitgelezen wordt. Hier onthoud het programma wat de status is van de invoer pin als deze uitgelezen wordt. Anders zou je elke keer dat je deze waarde nodig hebt de pin opnieuw moeten uitlezen. Deze waarde zou intussen best anders kunnen zijn. In de setup() wordt de pin als invoer (INPUT) gedefinieerd. In de eerste regel van de loop() wordt de waarde van de invoer pin gelezen en toegekend aan de variabele ‘retourWaarde’ om ergens anders in het programma gebruikt te worden.

Notities en waarschuwingen
Kies wel een pin die een digitaal signaal aan kan en voor invoer geschikt is.

]]>
Unsigned integer (unsigned int) https://claasen-tech.nl/c-plus-plus/unsigned-int/ Tue, 16 Jan 2024 22:46:51 +0000 https://claasen-tech.nl/?p=2466 ,

Beschrijving
Unsigned integer zijn gegevenstypen voor het opslaan van gehele getallen. Een unsigned int is een integer die niet alleen maar hele getallen opslaat, maar ook alleen maar positieve getallen.

Een unsigned int wordt als een 16-bits (2-byte) waarde opgeslagen. Dit geeft een bereik van 0 tot 65.535. Dit is de kleinste en grootste waarde die een unsigned int kan opslaan. Een unsigned int kan ook alleen maar hele getallen opslaan. Bij een getal met een komma slaat hij alleen het deel op dat links van de komma staat, de rest vergeet hij gewoon. Dus als je een waarde van 7,75 aan een unsigned int toekent, slaat hij alleen 7 op. Houd hier rekening mee bij rekenkundige functies. Dus 7 gedeeld door 2 is 3 en niet 3,5. Als je deze uitkomst weer met 2 zou vermenigvuldigen, krijg je 6 in plaats van 7.

Bij een ESP32-DevKitC bord wordt een unsigned int als een 32-bits (4 byte) waarde opgeslagen. Dit geeft een bereik van 0 tot 4.294.967.295.

Syntax
unsigned int var = waarde

Parameters
var: variabelenaam.

waarde: de waarde die je toekent aan die variabele.

Voorbeeld

unsigned long pin1 = 22;
unsigned long tijd = 36453723456;
unsigned long teller = 0;

Toelichting voorbeeld

Hierboven worden 3 variabelen gedefinieerd en wordt er een begin waarde toegekend. ‘pin1’ krijgt de waarde 22 toegekend, ‘tijd’ krijgt de waarde 36453723456 en ‘teller’ krijgt de waarde 0. Neem bijvoorbeeld ‘teller’, deze zou elke keer als er een knop wordt ingedrukt met 1 opgehoogd worden. Zo weet je hoe vaak een knop ingedrukt is.

Opmerkingen en waarschuwingen
Wanneer unsigned int variabelen hun maximale of minimale waarde overschrijden, treedt er overflow op. Als dit gebeurt is de uitkomst onzeker en kan het programma zelfs vastlopen. Dus je moet er wel voor zorgen dat deze situatie zich niet voordoet.

Het ESP32-DevKitC bord behandelt overflow goed. Het gaat van 4.294.967.295 naar 0 (en anders om). Dit is iets om rekening mee te houden.

]]>
Unsigned long integer (unsigned long) https://claasen-tech.nl/c-plus-plus/unsigned-long/ Sun, 14 Jan 2024 15:01:13 +0000 https://claasen-tech.nl/?p=2431 ,

Beschrijving
Unsigned long integer zijn gegevenstypen voor het opslaan van gehele getallen. Een unsigned long is een integer die niet alleen maar hele getallen opslaat, maar ook alleen maar positieve getallen.

Een unsigned long wordt als een 32-bits (4-byte) waarde opgeslagen. Dit geeft een bereik van 0 tot 4.294.967.295. Dit is de kleinste en grootste waarde die een unsigned long kan opslaan. Een unsigned long kan ook alleen maar hele getallen opslaan. Bij een getal met een komma slaat hij alleen het deel op dat links van de komma staat, de rest vergeet hij gewoon. Dus als je een waarde van 7,75 aan een unsigned long toekent, slaat hij alleen 7 op. Houd hier rekening mee bij rekenkundige functies. Dus 7 gedeeld door 2 is 3 en niet 3,5. Als je deze uitkomst weer met 2 zou vermenigvuldigen, krijg je 6 in plaats van 7.

Een unsigned long en unsigned int hebben bij een ESP32-DevKitC bord hetzelfde bereik.

Syntax
unsigned long var = waarde

Parameters
var: variabelenaam.

waarde: de waarde die je toekent aan die variabele.

Voorbeeld

unsigned long pin1 = 22;
unsigned long tijd = 36453723456;
unsigned long teller = 0;

Toelichting voorbeeld

Hierboven worden 3 variabelen gedefinieerd en wordt er een begin waarde toegekend. ‘pin1’ krijgt de waarde 22 toegekend, ‘tijd’ krijgt de waarde 36453723456 en ‘teller’ krijgt de waarde 0. Neem bijvoorbeeld ‘teller’, deze zou elke keer als er een knop wordt ingedrukt met 1 opgehoogd worden. Zo weet je hoe vaak een knop ingedrukt is.

Opmerkingen en waarschuwingen
Wanneer unsigned long variabelen hun maximale of minimale waarde overschrijden, treedt er overflow op. Als dit gebeurt is de uitkomst onzeker en kan het programma zelfs vastlopen. Dus je moet er wel voor zorgen dat deze situatie zich niet voordoet.

Het ESP32-DevKitC bord behandelt overflow goed. Het gaat van 4.294.967.295 naar 0 (en anders om). Dit is iets om rekening mee te houden.

]]>
Serial https://claasen-tech.nl/c-plus-plus/template-functie/ Sat, 13 Jan 2024 23:57:44 +0000 https://claasen-tech.nl/?p=2347 ,

Omschrijving
Serial verwijst niet naar een enkele functie, maar naar een verzameling functies die communicatie tussen een computer en een microcontrollerbord mogelijk maken. Over het algemeen is er ten minste één poort beschikbaar voor deze communicatie. Bovendien kan een microcontrollerbord ook met andere apparaten communiceren via deze poorten.

Hieronder bespreek ik enkele basis functies die het mogelijk maken om waarden vanaf het microcontrollerbord weer te geven in de seriële monitor van de Arduino IDE, en om gegevens vanuit de Arduino IDE (via de seriële monitor) naar het microcontrollerbord te sturen. Deze functionaliteit wordt vaak gebruikt voor het debuggen van een programma.

Seriële monitor in Arduino IDE gebruiken

Hoe maak je de seriële monitor zichtbaar in de Arduino IDE?
Dit kan op drie manieren, door:

  • in het menu te kiezen voor de opties ‘Hulpmiddelen’ en vervolgens ‘Seriële monitor’.
  • de toetsen combinatie Ctrl+Shift+M.
  • op het vergrootglas icoontje, rechtsboven te klikken

Zie de drie oranje pijlen in afb. 1

Afb. 1

Overzicht seriële monitor
In afbeelding 2 zie je het volledige venster van de seriële monitor. Linksboven wordt de poort getoond die door de seriële monitor wordt gebruikt, welke overeenkomt met de poort van het microcontrollerbord (in afb.2 is dit ‘COM4’). Direct daaronder bevindt zich het invoerveld (dit gebruik je voor de communicatie van de computer naar het microcontrollerbord), met rechts de ‘Verzenden’ knop. Onder het invoerveld vind je het uitvoergedeelte van het venster, waar de gegevens die van het microcontrollerbord naar de computer worden gestuurd, worden weergegeven.

Op de onderste regel staan de opties:

  • Autoscroll
    Als het vinkje is ingeschakeld, wordt de laatste uitvoer op het scherm weergegeven en worden oudere regels naar boven geschoven, waardoor na verloop van tijd de bovenste regels niet meer zichtbaar zijn. Telkens wanneer er een nieuwe regel wordt toegevoegd, herhaalt dit proces zich. Aan de rechterkant verschijnt een scrollbalk waarmee je de bovenste regels weer zichtbaar kunt maken.
  • Toon tijdstempel
    Als deze optie is aangevinkt, wordt bij elke regel een tijdstempel weergegeven in de vorm van ’17:02:11.787 ->’, wat staat voor ‘uur : minuut : seconden . milliseconden ->’. Na de pijl wordt de data weergegeven.
  • Einde regel (afb. 3)
    Zet deze optie op ‘Geen regeleinde’. Ik heb alle mogelijkheden geprobeerd, maar de uitvoer verandert niet. Dit is waarschijnlijk gerelateerd aan specifieke microcontrollerborden van Arduino.
  • Snelheid seriële poort (afb. 4)
    Dit is de snelheid waarmee gecommuniceerd wordt over de seriële poort. Deze snelheid hoort overeen te komen met wat in het programma is gedefinieerd (bijvoorbeeld: ‘Serial.begin(115200)’). Daarom moet je in de lijst ook voor deze waarde kiezen, zoals in afbeelding 4 is gedaan. Mocht er onleesbare tekst verschijnen in het uitvoergedeelte van de seriële monitor, dan betekent dit dat de waarden niet overeenkomen.
  • Knop ‘Uitvoer wissen’ (afb. 4)
    Als je op deze knop klikt, wordt alle uitvoer van het uitvoer venster verwijderd.

Afb. 2

Afb. 3

Afb. 4

Serial

Een microcontrollerboard kan meerdere seriële poorten hebben. De ESP32 die in deze workshop wordt gebruikt, heeft drie seriële poorten, ook wel UART’s genoemd. UART staat voor Universal Asynchronous Receiver/Transmitter. In je programma worden deze aangeduid als Serial, Serial1 en Serial2. Serial is verbonden met de USB-poort, waardoor het mogelijk is om te communiceren met de seriële monitor van de Arduino IDE. In deze ga ik allen in uitleg licht ik alleen Serial toe.

Serial.begin()

Omschrijving
De Serial.begin() functie start de communicatie tussen je Arduino en de computer via de seriële monitor. Bij het gebruik van deze functie geef je aan hoe snel de gegevens verstuurd moeten worden. Deze snelheid moet hetzelfde zijn als de snelheid die je instelt in de seriële monitor op je computer. Normaal gesproken zet je deze functie één keer in het begin van je code, meestal in het blokje dat setup() heet, zodat je Arduino weet dat hij klaar is om te beginnen met het verzenden en ontvangen van informatie.

Syntax
Serial.begin(snelheid);

Parameters
Serial: seriële poort object. Mogelijke waarden voor de ESP32 zijn: Serial, Serial1 en Serial2.
snelheid: Dit is de snelheid waarmee de seriële poort van de computer en de microcontroller met elkaar communiceren. Mogelijke waardes zijn: 300, 1200, 2400, 4800, 9600, 192000, 38400, 57600, 74880, 115200, 230400, 250000, 500000, 1000000 en 2000000 baud. De vetgedrukte zijn de meest gebruikelijke. Hiervan wordt 115200 in de workshops gebruikt.

Geeft terug
Niets

Voorbeeld

void setup() {
  Serial.begin(115200); // opent seriële poort en zet de snelheid op 115200 baud
}

void loop() {
  Serial.print("Hallo!");
}

Toelichting voorbeeld

void setup()
Serial.begin(115200);
Start de communicatie met de seriële poort op een snelheid van 115200 baud. Dit betekent dat je deze snelheid ook moet kiezen in het venster van de seriële monitor op je computer.

void loop()
Serial.print(“Hallo!”);
Stuurt informatie van het microcontrollerbord naar de computer.

Notities en waarschuwingen
Zorg ervoor dat de snelheid die je in je programma instelt hetzelfde is als de snelheid die je kiest in de seriële monitor. Als deze niet hetzelfde zijn, werkt het niet goed en zie je misschien gekke tekens op je scherm.

Let op dat je ‘Serial.begin()’ met een hoofdletter ‘S’ schrijft.

Serial.print() / Serial.println()

Omschrijving
Met de functies Serial.print() en Serial.println() kun je gegevens van je microcontrollerbord naar de seriële monitor op je computer sturen. Als je Serial.println() gebruikt, stuurt het de gegevens en gaat daarna automatisch naar de volgende regel. Als je Serial.print() gebruikt, blijft de cursor op dezelfde regel staan, en wat je daarna stuurt, komt direct achter de vorige gegevens te staan.

Syntax
Serial.print(gegevens)
Serial.println(gegevens)

Parameters
Serial: seriële poort object. Mogelijke waarden voor de ESP32 zijn: Serial, Serial1 en Serial2.
gegevens: zijn teksten, getallen of variabelen (bij variabelen de inhoud ervan) die je naar de seriële monitor wil sturen.

Geeft terug
Niets

Voorbeeld

void setup() {
  Serial.begin(115200); // opent seriële poort en zet de snelheid op 115200 bps
}

void loop() {
  Serial.println("Eerste regel.");
  Serial.println("Tweede regel.");
  Serial.print("Begin derde regel ");
  Serial.print("en het vervolg van de derde regel, ");
  Serial.println("het einde van de derde regel.");
  Serial.println("Vierde regel.");
  Serial.println();
  int getal = 10;
  Serial.print("Het getal is: ");
  Serial.println(getal);
  Serial.print("Het tweede getal is: ");
  Serial.println(5);
  delay(300000);
}

Uitvoer van het programma:

Eerste regel.
Tweede regel.
Begin derde regel en het vervolg van de derde regel, het einde van de derde regel.
Vierde regel.

Het getal is: 10
Het tweede getal is: 5

Elk gebruik van println() zorgt ervoor dat je naar een nieuwe regel gaat na het versturen van de tekst, terwijl print() je op dezelfde regel houdt.

Toelichting voorbeeld
In het stukje code hierboven, worden verschillende dingen verstuurd van je microcontroller naar de seriële monitor op je computer. Hier is wat er stap voor stap gebeurt:

void setup()
Serial.begin(115200);
Dit initialiseert de seriële communicatie met een baud rate (snelheid) van 115200 bits per seconde. Het zorgt ervoor dat de Arduino kan communiceren met een computer via de seriële monitor.

void loop()
Serial.println(“Eerste regel.”);
Dit stuurt de tekst “Eerste regel.” naar de seriële monitor en gaat daarna naar de volgende regel.

Serial.println(“Tweede regel.”);
Dit stuurt de tekst “Tweede regel.” en gaat naar de volgende regel.

Serial.print(“Begin derde regel “);
Dit stuurt de tekst “Begin derde regel ” naar de monitor, maar blijft op dezelfde regel.

Serial.print(“en het vervolg van de derde regel, “);
Dit voegt de tekst “en het vervolg van de derde regel, ” direct achter de vorige tekst toe en blijft op dezelfde regel.

Serial.println(“het einde van de derde regel.”);
Dit voegt “het einde van de derde regel.” toe aan het einde van de derde regel en gaat daarna naar de volgende regel.

Serial.println(“Vierde regel.”);
Dit stuurt “Vierde regel.” en gaat naar de volgende regel.

Serial.println();
Deze opdracht verstuurd geen gegevens naar de computer, maar zorgt er wel voor dat de uitvoer naar de volgende regel gaat. Er ontstaat een lege regel. Dit is gemakkelijk om gegevens die je naar de computer stuurt van elkaar te scheiden en houdt het overzichtelijk.

int getal = 10;
Maakt een variabele van het soort integer (int) en geeft deze een waarde van 10.

Serial.print(“Het getal is: “);
Dit stuurt de tekst ‘Het getal is: ‘ naar de monitor en blijft op dezelfde regel.

Serial.println(getal);
Dit stuurt de inhoud van de variabele getal naar de computer, in dit geval ’10’, en gaat naar de volgende regel.

Serial.print(“Het tweede getal is: “);
Dit stuurt de tekst ‘Het tweede getal is: ‘ naar de monitor en blijft op dezelfde regel.

Serial.println(5);
Dit stuurt het getal 5 naar de monitor en gaat naar de volgende regel.

delay(300000);
Het programma wacht 300.000 milliseconden. Dit is 5 minuten en gaat dan verder. Omdat dit de laatste regel in het programma is, gaat het programma verder bij de eerste regel van loop(). Dit is regel 6 in het voorbeeld.

Notities en waarschuwingen
Let op dat je ‘Serial.print()’ en ‘Serial.println’ met een hoofdletter ‘S’ schrijft.

Serial.readString()

Omschrijving
Leest een tekens uit de serial buffer en geeft die inhoud terug aan een variabele. Maar voordat je dit kunt doen, moet je de seriële poort aanzetten met de functie Serial.begin(115200). Zonder dit werkt de seriële poort niet en kun je geen gegevens lezen en schrijven.

Syntax
Serial.readString()

Parameters
Serial: seriële poort object. Mogelijke waarden voor de ESP32 zijn: Serial, Serial1 en Serial2.

Geeft terug
Een string (alle tekens) die uit de buffer van serial gelezen zijn.

Voorbeeld

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Geef een kleur in:");
  while (Serial.available() == 0) {}     //wacht totdat er gegevens aanwezig zijn
  String teststr = Serial.readString();  //Lees gegevens uit de serial buffer
  teststr.trim();                        // Verwijder alle '\r', '\n' en spaties aan het einde van de gegevens
if (teststr == "rood") {
    Serial.println("Een primaire kleur");
  } else {
    Serial.println("Andere tekst");
  }
}

Toelichting voorbeeld

void setup()
Serial.begin(115200);
Dit initialiseert de seriële communicatie met een baud rate (snelheid) van 115200 bits per seconde. Het zorgt ervoor dat de Arduino kan communiceren met een computer via de seriële monitor.

void loop()
Serial.println(“Geef een kleur in: “);
Dit stuurt de tekst “Geef een kleur in: ” naar de seriële monitor als een prompt voor de gebruiker om gegevens in te voeren.

while (Serial.available() == 0) {}
Dit is een wachtlus die zich blijft herhalen totdat er gegevens beschikbaar zijn in de seriële buffer. Serial.available() retourneert het aantal bytes dat beschikbaar is om te lezen. Als dit aantal 0 is, wacht de lus totdat er gegevens beschikbaar zijn. Serial.available() geeft dan een aantal dat groter is dan 0.

String teststr = Serial.readString();
Deze regel leest de beschikbare gegevens uit de seriële buffer als een string en slaat deze op in de variabele teststr. In deze regel wordt ook ‘teststr’ gedefinieerd als string.

teststr.trim();
Dit verwijdert eventuele witruimten, inclusief carriage return (\r) en line feed (\n), aan het einde van de string teststr (dit zijn tekens die automatisch meegestuurd worden door de computer). Dit zorgt ervoor dat de string nauwkeurig kan worden vergeleken zonder extra spaties of nieuwe regels.

if (teststr == “rood”) { Serial.println(“Een primaire kleur”); } else { Serial.println(“Andere tekst”); }
Dit is een voorwaardelijke structuur.
Als de string teststr gelijk is aan “rood”, dan print het programma “Een primaire kleur” naar de seriële monitor.
Anders, print het programma “Andere tekst” naar de seriële monitor.

Notities en waarschuwingen
Let op!!!
Dat je Serial.readString() met de letters ‘S’ als hoofdletters schrijft. Doe je dit niet, krijg je een foutmelding.

Serial.read()

Omschrijving
Serial.read() is een functie die je gebruikt om informatie te lezen die naar je Arduino wordt gestuurd via de seriële poort. Maar voordat je dit kunt doen, moet je de seriële poort aanzetten met de functie Serial.begin(115200). Zonder dit werkt de seriële poort niet en kun je geen gegevens lezen en schrijven.

Syntax
Serial.read()

Parameters
Serial: seriële poort object. Mogelijke waarden voor de ESP32 zijn: Serial, Serial1 en Serial2.

Geeft terug
Geeft het eerste teken terug van de seriële buffer. Deze waarde is van type integer.

Voorbeeld

void setup() {
  Serial.begin(115200); // Start de seriële communicatie met 115200 baud
  Serial.println("Type iets en druk op Enter:");
}

void loop() {
  if (Serial.available() > 0) { // kijkt of er data beschikbaar is om te lezen
    int incomingByte = Serial.read(); // Lees het binnenkomende byte (is een teken)
    Serial.print("Ontvangen: ");
    Serial.println(incomingByte, DEC); // Print de ontvangen byte als decimaal getal
  }
}

Toelichting voorbeeld

void setup()
Serial.begin(115200);
Hierin start je de seriële communicatie met Serial.begin(115200);, wat betekent dat de communicatie op een snelheid van 115200 baud plaatsvindt.

Serial.println(“Type iets en druk op Enter:”);
Vervolgens print je een bericht om de gebruiker te laten weten dat ze iets moeten typen.

void loop()
if (Serial.available() > 0) {}
Deze functie kijkt of er een of meerdere tekens in de invoer buffer staan, dit doet het deel ‘Serial.available’. De functie geeft een waarde terug en de if-functie kijkt of die waarde groter is dan 0. Als dat waar is, worden de commando’s die tussen de accoladen ‘{}’ staan uitgevoerd. Als dit niet het geval is gaat het programma verder achter de afsluit accolade ‘}’.

int incomingByte = Serial.read();
Als er data is, wordt deze gelezen met Serial.read(), wat één byte data van de seriële buffer leest en in de variabele ‘incomingByte’ wordt gezet. Als het teken gelezen is, wordt deze uit de buffer gehaald.

Serial.print(“Ontvangen: “);
De tekst ‘Ontvangen: ‘ wordt naar de seriële monitor gestuurd.

Serial.println(incomingByte, DEC);
Deze byte wordt vervolgens geprint als decimaal getal met Serial.println(incomingByte, DEC); en gaat vervolgens naar de volgende lijn.

Notities en waarschuwingen

Serial.available()

Omschrijving
De functie Serial.available() in de Arduino programmeertaal wordt gebruikt om te controleren hoeveel bytes er beschikbaar zijn om te lezen van de seriële buffer. Het wordt gebruikt in een programma om te controleren voorafgaand aan Lezen van de seriële buffer. Het is gebruikelijk om Serial.available() te gebruiken voordat je seriële gegevens leest met functies zoals Serial.read() of Serial.readString(). Dit voorkomt dat je probeert te lezen als er geen gegevens zijn, wat fouten kan voorkomen.

Syntax
Serial.available()

Parameters
Serial: seriële poort object. Mogelijke waarden voor de ESP32 zijn: Serial, Serial1 en Serial2.

Geeft terug
Retourneert een Integer
De functie retourneert een integer die aangeeft hoeveel bytes er beschikbaar zijn in de seriële buffer. Als er geen gegevens beschikbaar zijn, retourneert het 0.

Voorbeeld

void setup() {
  Serial.begin(115200); // Initialiseer seriële communicatie op 115200 bps
}

void loop() {
  if (Serial.available() > 0) {  // Controleer of er gegevens beschikbaar zijn
    int incomingByte = Serial.read();  // Lees de inkomende byte
    Serial.print("Ontvangen: ");
    Serial.println(incomingByte, DEC);  // Print de ontvangen byte als decimaal getal
  }
} 

Toelichting voorbeeld

void setup()
Serial.begin(115200);
Dit initialiseert de seriële communicatie met een baud rate (snelheid) van 115200 bits per seconde. Het zorgt ervoor dat de Arduino kan communiceren met een computer via de seriële monitor.

void loop()
if (Serial.available() > 0)
De if-voorwaarde Serial.available() > 0 controleert of er minstens één byte beschikbaar is in de seriële buffer.
Als er gegevens beschikbaar zijn, wordt de eerste byte gelezen met Serial.read() en opgeslagen in de variabele ‘incomingByte’. Het teken dat gelezen is wordt uit de seriële buffer verwijdert.

Serial.println(incomingByte, DEC);
De ontvangen byte wordt vervolgens geprint naar de seriële monitor.

Notities en waarschuwingen
Geen.

]]>
Integer (int) https://claasen-tech.nl/c-plus-plus/int/ Sat, 13 Jan 2024 22:59:31 +0000 https://claasen-tech.nl/?p=2383 ,

Beschrijving
Integers zijn gegevenstypen voor het opslaan van gehele getallen.

Deze slaat een int als een 16-bits (2-byte) waarde op. Dit geeft een bereik van -32.768 tot 32.767. Dus dit is de kleinste en grootste waarde die een int kan opslaan. Een int kan ook alleen maar hele getallen opslaan. Bij een getal met een komma slaat hij alleen het deel op dat links van de komma staat, de rest vergeet hij gewoon. Dus als je een waarde van 7,75 aan een int toekent, slaat hij alleen 7 op. Houd hier rekening mee bij rekenkundige functies. Dus 7 gedeeld door 2 is 3 en niet 3,5. Als je deze uitkomst weer met 2 zou vermenigvuldigen, krijg je 6 in plaats van 7.

Het ESP32-DevKitC bord dat ik in de workshops gebruik, slaat een int op als een 32-bits (4-byte) waarde. Dit resulteert in een bereik van -2.147.483.648 tot 2.147.483.647.

Syntax
int var = waarde;

Parameters
var: variabelenaam.

waarde: de waarde die je toekent aan die variabele.

Voorbeeld

int pin1 = 22;
int pin2 = 23;
int duur = 1000;
int teller = 0;

Toelichting voorbeeld

Hierboven worden 4 variabelen gedefinieerd en wordt er een begin waarde toegekend. ‘pin1’ krijgt de waarde 22 toegekend, ‘pin2’ krijgt de waarde 23, ‘duur’ krijgt de waarde 1000 en ‘teller’ krijgt de waarde 0. Neem bijvoorbeeld ‘teller’, deze zou elke keer als er een knop wordt ingedrukt met 1 opgehoogd worden. Zo weet je hoe vaak een knop ingedrukt is.

Opmerkingen en waarschuwingen
Wanneer int variabelen hun maximale of minimale waarde overschrijden, treedt er overflow op. Dit wil zeggen dat als je bij een int variabele met 0 zou beginnen en telt er elke keer 1 bij op. Uiteindelijk bereik je de waarde 32.767 en als je probeert hier 1 bij op te tellen is het resultaat onbekend. Het kan zomaar zijn dat je programma niet meer werkt. Dit geldt ook wanneer je bij 0 begint en er elke keer 1 van af telt. Je bereikt de waarde -32.768 en als je hier 1 van af telt, is het ook onbekend wat er gaat gebeuren. Dus je moet wel controleren of deze situatie zich voordoet.

Het ESP32-DevKitC bord behandelt overflow goed. Het gaat van 2.147.483.647 naar -2.147.483.648 (en anders om). Dit is iets om rekening mee te houden.

]]>
delay() https://claasen-tech.nl/c-plus-plus/delay/ Sat, 13 Jan 2024 16:57:50 +0000 https://claasen-tech.nl/?p=2353 ,

Omschrijving
Het delay() commando wordt gebruikt om een pauze in te voegen in de uitvoering van het programma. Het commando vertraagt de uitvoering van verdere instructies voor opgegeven hoeveelheid milliseconden. 1000 milliseconden is 1 seconde.

Syntax
delay(waarde)

Parameters
waarde: is de waarde in milliseconden die gewacht moet worden. De waarde is een unsigned long variabele.

Geeft terug
Niets.

Voorbeeld

void setup() {
  // initialisaties
}

void loop() {
  // doe iets hier

  delay(2000);  // wacht 2 seconden voordat de volgende instructie wordt uitgevoerd
}

Toelichting voorbeeld
In dit voorbeeld wordt de loop() functie herhaaldelijk uitgevoerd, en elke keer dat het programma delay(2000); bereikt, wacht het gedurende 2 seconden voordat het verder gaat met de volgende instructie.

Het delay() commando wordt vaak gebruikt voor timing, om bijvoorbeeld sensoren te lezen met tussenpozen, LED’s te laten knipperen of om een bepaalde tijd te wachten voordat een andere actie wordt uitgevoerd in een programma.

Notities en waarschuwingen
Niets.

]]>
pinMode() https://claasen-tech.nl/c-plus-plus/pinmode/ Sat, 13 Jan 2024 16:49:09 +0000 https://claasen-tech.nl/?p=2350 ,

Omschrijving
Configureert voor een bepaalde pin of deze gebruikt wordt voor in- of uitvoer. Kijk bij de pinbezetting van de ESP32-DevKitC Bord welke pinnen je kunt gebruiken voor in- of uitvoer.

Syntax
pinMode(pin, modus)

Parameters
pin: is het GPIO nummer dat je als invoer of uitvoer wil zetten. Dus voor bijvoorbeeld GPIO1 voer je hier ‘1’ in.
modus: hier bepaal je of de pin invoer ( ‘INPUT’ ) of uitvoer ( ‘OUTPUT’ ) wordt. De derde mode is ‘INPUT_PULLUP’. Deze mode is dus ook invoer, maar nu wordt een interne weerstand ingeschakeld die zorgt voor een constant signaal. Deze pin moet wel een interne pullup weerstand ondersteunen. Zie pinbezetting.

Geeft terug
Niets.

Voorbeeld

int ledPin = 13; // Definieer de pin waarop de LED is aangesloten

void setup() {
  pinMode(ledPin, OUTPUT); // Stel de pin in als een uitvoerpin
}

void loop() {
  // Andere code hier
}

Toelichting voorbeeld
Op regel 1 krijgt de variabele ‘ledPin’ de waarde 13, dit is de pin die in dit voorbeeld gebruikt wordt.
In regel 4 wordt deze pin ingesteld als een uitvoer (OUTPUT) pin.

Notities en waarschuwingen
Kies wel een pin die een digitaal signaal aan kan en voor uitvoer geschikt is.

]]>
digitalWrite() https://claasen-tech.nl/c-plus-plus/digitalwrite/ Sat, 13 Jan 2024 11:28:19 +0000 https://claasen-tech.nl/?p=2326 ,

Omschrijving
De digitalWrite() functie wordt gebruikt in het programma om de status van een digitale pin op een microcontroller (zoals de Arduino / ESP32) te wijzigen. De pin waar naar geschreven wordt, moet wel eerst als uitvoer gedefinieerd worden. Dit doe je met de functie pinMode(). Daarna kan met de functie digitalWrite() een digitale pin als ‘hoog’ (HIGH) of ‘laag’ (LOW) ingesteld worden.

Syntax
digitalWrite(pin, waarde)

Parameters
pin: is het GPIO nummer waar je de status van wil wijzigen. Dus voor bijvoorbeeld GPIO1 voer je hier ‘1’ in.
waarde: hier bepaal je of de pin ‘HIGH’ of ‘LOW’ wordt gezet. Dit houdt in aan (‘HIGH’) of uit (‘LOW’) wordt gezet.

Geeft terug
Niets.

Voorbeeld

int ledPin = 13; // Definieer de pin waarop de LED is aangesloten

void setup() {
  pinMode(ledPin, OUTPUT); // Stel de pin in als een uitvoerpin
}

void loop() {
  digitalWrite(ledPin, HIGH); // Zet de LED aan door de pin op HIGH te zetten (5V)
  delay(1000); // Wacht 1 seconde
  digitalWrite(ledPin, LOW); // Zet de LED uit door de pin op LOW te zetten (0V)
  delay(1000); // Wacht weer 1 seconde
}

Toelichting voorbeeld
Op regel 8 en 10 wordt pin 13 ingesteld. Op regel 8 wordt deze ingesteld op ‘HIGH’ en gaat het ledje aan. Op regel 10 wordt deze ingesteld op ‘LOW’ en gaat het ledje uit.

Notities en waarschuwingen
Kies wel een pin die een digitaal signaal aan kan en voor uitvoer geschikt is.

]]>