Les 9: Lezen van de seriële monitor

Als vervolg op les 8: schrijven in de seriële monitor zien we in deze les de tweede functie van deze monitor. Naast het sturen van data naar deze tool, kunnen we ook data ontvangen! De arduino zal dus de data van de seriële monitor lezen. Deze functie is kritiek voor het maken van programma’s! Het heeft ons namelijk de mogelijkheid om de maker een actieve rol in een werkende code te geven. Naast de passieve, als controleur, rol die we verkregen door het schrijven in de seriële monitor.

De seriële monitor:

We zullen bij het lezen van de seriële monitor uiteraard de seriële monitor moeten gebruiken. Nog even een korte herhaling van waar we deze precies terugvinden:

Seriële monitor
We vinden de monitor bij hulpmiddelen of met de sneltoets ctrl+shift+M

Wanneer we een Arduino aansluiten op onze computer kunnen we altijd de seriële monitor openen. Deze bestaat uit drie delen: De taakbalk, de data-invoer en de instellingen van de seriële monitor. De taakbalk gebruikten we in de vorige les. Met deze balk kunnen we onze computer een observerende functie geven. De data-invoer zullen we gebruiken om data naar de Arduino te sturen. In deze les zullen we de data-invoer dus zeker gebruiken. De instellingen stellen ons in staat om de bandlengte te bepalen en aan te passen. De meest gebruikte en voorkomende bandlengte is 9600. Deze veranderen we niet.

Seriële monitor

Het lezen van de seriële monitor:

We ontvangen data van de computer… Dat wil zeggen dat de computer nu, voor de arduino, een observerende functie heeft! Echter in de vorige les had onze computer een uitvoerende functie… Dit verklaart meteen waarom we niet werken met de traditionele commando’s. Ook in deze les zullen we gebruik maken van de Serial.-commando’s. Met deze nieuwe commando’s zullen we proberen om een zelfgekozen geldbedrag naar onze arduino te schrijven. We zullen dus gebruik maken van de actieve functie. Daarna zullen we controleren, de passieve functie, of deze geldwaarde goed ontvangen werd.

Opbouw:

We declareren onze woorden voor de arduino. In deze les is er wel iets speciaals aan deze woorden… 

float bedrag;

We gebruiken voor het eerst het datatype ‘float’. Er is natuurlijk een reden om voor het zwaarste type te kiezen. We kunnen zeggen dat we zo kunnen kiezen voor zeer grote bedragen, maar dan zouden we wel voor het datatype ‘long’ gekozen hebben. We kiezen wel voor dit datatype omdat deze in staat is kommagetallen op te slaan. Zo kunnen we waarden als €5,39, €9,99 … wel verwerken.

String prijsGelezen;

Toch was het hoogstwaarschijnlijk deze declaratie die jullie deed jullie wenkbrauwen fronsen. We werken hier namelijk voor het eerst met een string! Deze lijst declareren we vanzelfsprekend met ‘String’. Een string kan je het best begrijpen als een lijst met tekens.

Notities:

In essentie is er wel een klein verschil tussen deze declaraties:

String prijsGelezen;

char prijsGelezen[];

Beide zijn lijsten gemaakt uit tekens. Het verschil zit in de laatste byte. De laatste byte in een ‘String’ in een binaire nul, terwijl dit bij ‘char’ niet zo is. Veel belangrijker is dat met een ‘String’ veel meer commando’s zijn!

In de void Setup(); beginnen we de seriële communicatie op bandlengte 9600. We coderen dit in de void setup omdat we doorheen het volledige programma eenzelfde bandlengte zullen gebruiken.

We beginnen onze void loop() met een oproep naar de computer. Deze oproep zal verschijnen in de seriële monitor: “Geef het bedrag in euro’s, eindig met #. Als maker achter de computer zal dit de enigste boodschap zijn. De twee volgende commando’s zijn intern. Deze zal je dus niet zien in de monitor, ondanks het wel Serial.-commando’s zijn. Zichtbaar zijn ze niet, maar deze commando’s zijn wel uiterst belangrijk in deze code.

Serial.setTimeout(200000) ;

prijsGelezen = Serial.readStringUntil(‘#’) ;

Beide commando’s horen samen en vullen elkaar aan. Het eerste commando zorgt ervoor dat de arduino pauzeert in het programma. Het getal geeft de duur van die pauze, in milliseconden, weer. Deze periode is zelf te bepalen. In deze code kiezen we voor een lange pauze, zodat we zeker tijd genoeg hebben om onze waarde in te geven. 

Door dit commando weet de arduino dat hij bij het volgende Serial.read-commando zal moeten pauzeren. Serial.read komt echter in vele vormen voor. Telkens begint deze uiteraard met Serial.read, maar er kan gespecificeerd worden. In ons commando zien we dat er twee specificaties zijn, namelijk ‘String’ en ‘Until’. De ‘String’ slaat op het gedeclareerde type waarin de informatie zal worden opgeslagen. Bij ons is dit dus onze ‘String’ prijsGelezen. 

Onze tweede specificatie, ‘Until’, heeft als gevolg dat er een voorwaarde wordt gegeven waardoor hij de eerder bepaalde pauze mag doorbreken. Zo zal Arduino wachten tot ofwel de pauze doorlopen is ofwel hij het bepaalde teken tegenkomt. In ons geval zal de Arduino dus de pauze doorbreken wanneer hij het #-teken tegenkomt in de doorgestuurde data.

Notities:

Waarom gebruiken we niet gewoon het €-teken als voorwaarde? Wel, dat zou het inderdaad eenvoudiger maken. Spijtig genoeg werkt dit niet! 

Serial.readStringUntil();

Dit commando zet de geschreven input van de seriële monitor om naar ASCII-code om deze op te slaan in een lijst. Jammer genoeg kent Arduino slechts de basiscodes. Dit zijn de ASCII-codes van 1 tot en met 127. Het €-teken heeft 128 als ASCII-code en is dus niet gekend door arduino. Het teken kan wel geprint worden, met ‘ Serial.print’, maar kan niet als ASCII-code geschreven worden, met ‘Serial.write’. Een overzicht van de ASCII-codes vindt je in deze ASCII-tabel.

De kommagetallen maken gebruik van een punt als scheidingsteken. De input 5,31 zal dus niet geaccepteerd worden, terwijl 5.31 wel geaccepteerd zal worden.

Serial.println (” geaccepteerd”);

Wanneer de ‘String’ gevormd is stuurt de Arduino ‘geaccepteerd’ terug naar de computer. Echter het bedrag is nog steeds opgeslagen als een een ‘String’! Hier kunnen we niet mee rekenen en is dus, in deze vorm, waardeloos. Uiteraard is er een manier om de ‘String’ om te vormen naar een ‘Float’.

bedrag = prijsGelezen.toFloat();

Hier stellen we onze ‘Float’ bedrag gelijk aan de output van het commando. 

[onze ‘String’].toFloat();

Dit is de algemene vorm van dit commando. Dit commando gebruiken we om een ‘String’ om te vormen naar een ‘Float’. Deze declaratie is wel een getal en hier kan dus mee gerekend worden.

Notities:

Een soortgelijk commando kunnen we ook gebruiken om bijvoorbeeld een ‘String’ om te vormen naar een ‘integer’.

Serial.println ( bedrag,2);

We sturen het kommagetal, afgerond op twee cijfers, naar de seriële monitor.

  // Eerst zetten we onze woorden om in taal die Arduino begrijpt.

  String prijsGelezen;

  float bedrag;

void setup() {

  // Aangezien dat deze “loop” slechts eenmaal doorlopen wordt, declareer je hier jouw poorten.

  Serial.begin ( 9600);

}

void loop() {

  // Vervolgens zetten we hier de opdrachten die uitgevoerd moeten worden. Deze “loop” wordt dus steeds herhaald.

  Serial.println ( ” Geef bedrag in euro’s , eindig met #.”);

  Serial.setTimeout(200000) ;

  prijsGelezen = Serial.readStringUntil(‘#’) ;

  Serial.println (” geaccepteerd”);

  bedrag = prijsGelezen.toFloat();

  delay  (2000);

  Serial.println ( bedrag,2);

}

Schakeling:

schakeling bij lezen van seriële monitor
Basislessen Arduino 75%

Voor het lezen van de seriële monitor hoeft er geen schakeling gemaakt worden. Zolang de arduino verbonden is met de pc, kan je deze code maken.

We maakten in deze les gebruik van de algemene commando’s om data binnen te lezen. Toch zijn er ook commando’s om alleen getallen te verwerken, iets wat hier wel van pas kan komen! Probeer dus zeker eens de andere manier te coderen. Tip : het commando is Serial.parseFloat();.

Als je deze code vlotjes beheerst, ga dan over naar les 10!

Geplaatst in Programmeren Arduino voor dummies.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *