Les 12: Arduino willekeurig laten kiezen

Wat is nu juist een Arduino willekeurig laten kiezen? Vorige lessen kozen we steeds zelf de bewerkingen. We volgende steeds eenzelfde structuur: als deze variabele gelijk is aan dit, doe dat. De uitvoerende actie codeerden we echter steeds handmatig! De poort die moest worden geactiveerd kozen we steeds voordien, als een vast commando in de code. In deze les zullen we Arduino zelf laten kiezen welke poort er wordt geactiveerd! Arduino zal zo willekeurig kiezen en actie ondernemen… De ongewone toepassing komen we dagelijks aantallen keren tegen!

Arduino willekeurig laten kiezen:

Deze les zal zicht toespitsen op het Arduino-commando ‘random’. Zoals het commando zich laat zeggen zal arduino bij het uitvoeren van dit commando het recht in eigen handen nemen. Met andere woorden: de output van dit commando hebben we zelf niet in de hand!

Opbouw:

Nog steeds zullen we eerst onze woorden duiden aan de Arduino. In deze les werken we met 3 ledjes: een groene, rode en een oranje led. We schakelen ze respectievelijk op poorten 12, 11 en 10. We gebruiken in deze les geen PWM-signalen, dus we mogen de ledjes op elke digitale poort schakelen.

We schakelen ook een knop op poort 9 die we zullen gebruiken om het programma te starten. Ook declareren we naast de knop ook een variabele om de status van de knop in op te slaan: ‘knopStatus’.

Tot slot maken we nog een extra variabele: ‘nummer’. Deze zal de output van de Arduino na het commando ‘random’ opslaan.

Het programma:

In de void setup declareren we de poorten van onze ledjes ( 12, 11 en 10) als uitvoerende poorten. Poort 9, waaraan onze knop is geschakeld, is een observerende poort. 

knopStatus = digitalRead ( knop ); 

if ( knopStatus == HIGH ){ 

De knop gebruiken we als starter van ons programma. We zullen dus beginnen met het controleren van de status van de knop. Hierna polsen we of de knop al dan niet ingedrukt werd.

nummer = random ( 10,13);

Dit is de kern van onze code. Hier laten we Arduino willekeurig kiezen tussen de nummers 10 en 13. De Arduino zal dus zijn waarde kiezen in het interval [10,13[. Dit wil zeggen dat 10 wel nog een mogelijkheid is, maar 13 niet. De output van dit commando zijn altijd natuurlijke getallen. 12,1 en 11,3 zijn bijvoorbeeld getallen die nooit gekozen zullen worden! De mogelijke output van dit commando is dus ofwel 10 ofwel 11 ofwel 12. Deze getallen 10, 11 en 12 zijn ook de 3 poorten waarop we eerder onze ledjes schakelden…

digitalWrite ( nummer , HIGH );

Na het kiezen van van het getal, zal de Arduino de overeenkomstige poort activeren. De led die aan die poort geschakeld is zal dan beginnen branden. 

Notie:

We mogen het commando ‘random’ zo gebruiken omdat we ons interval zorgvuldig gekozen hebben! 

random ( 1, 20 );

Wanneer we dit commando gebruiken, dan zouden we dit niet mogen doen! Er is namelijk een kans dat de output groter dan 13 is. Als dit gebeurt, dan krijgen we een conflict in ons ‘digitalWrite();’ commando! Er is namelijk geen poort met, bijvoorbeeld nummer 18.

We declareerden in het begin van onze code onze woorden aan de Arduino. Deze woorden gebruikten we dan om de poorten als OUTPUT te declareren. Normaal gebruiken we dan ook deze woorden om de poort te activeren… Maar dit is hier niet het geval! De Arduino zal steeds een getal als output genereren na random();. Zo zal de Arduino steeds één van deze commando’s verwerken:

digitalWrite ( 10, HIGH);

digitalWrite ( 11, HIGH);

digitalWrite ( 12, HIGH);

De gedeclareerde poorten zijn in deze code dus eigenlijk niet nodig. Toch is het aan te raden om deze toch te declareren. Zo kan je steeds controleren welke led er op welke poort geschakeld, zonder steeds de draadjes in je schakeling te moeten volgen…

delay ( 1500);
digitalWrite ( nummer, LOW );

Nadat de poort geactiveerd werd, wachten we anderhalve seconde. Nadien wordt de led weer gedoofd, het variabele ‘nummer’ is namelijk niet meer verandert in waarde.

Zo zal er telkens wanneer er op de knop geduwd wordt een ledje gaan branden. Deze ledjes zullen zonder vaste volgorde branden aangezien de Arduino willekeurig zal kiezen welke led hij eerst aanstuurd.

Code:

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

const int ledGroen = 12;
const int ledRood = 11 ;
const int ledOranje = 10;

const int knop =9 ;
int knopStatus ;

int nummer ; 
void setup() {
// Aangezien dat deze “loop” slechts eenmaal doorlopen wordt, declareer je hier jouw poorten.

pinMode ( ledGroen , OUTPUT);
pinMode ( ledRood , OUTPUT);
pinMode ( ledOranje , OUTPUT);

pinMode ( knop , INPUT);

}

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

knopStatus = digitalRead ( knop ); 

if ( knopStatus == HIGH ){ 

nummer = random ( 10,13); // kies een willekeurig nummer tussen 10 en 12
digitalWrite ( nummer , HIGH ); // activeer de gekozen poort 
delay ( 1500);
digitalWrite ( nummer, LOW );

}

}

Schakeling:

We schakelen 3 ledjes op poorten 12,11 10. In serie schakelen we een weerstand van 200 ohm. We schakelen ook een knop die verbonden is met de 5V, de ground door een weerstand van 100000 ohm en poort 9.

Arduino random

Doe eens gek, ondertussen heb je al voldoende bagage om zelf te experimenteren. Je kan eventueel eens proberen deze code te maken met meerder ledjes of andere componenten.

Basislessen Arduino 100%

Na het succesvol doorlopen van de vorige lessenreeks ben je helemaal klaar en genoeg voorbereid om aan het projectwerk te beginnen. Laat het echte werk beginnen!

Geplaatst in Programmeren Arduino voor dummies.

Geef een reactie

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