Willekeurig kiezen uit een lijst Loops.

algemene C code
Berichten: 3
Geregistreerd: 26 Mei 2016, 16:39

Willekeurig kiezen uit een lijst Loops.

Berichtdoor Tha_Rotiart » 26 Mei 2016, 16:53

Hoi allemaal,

Ik ben dus Rotiart, nieuw op het forum en meteen al een gekke vraag.
Mijn ervaring is trouwens 1 week met het programmeren van een arduino. Ik volg nu ook een online cursus over het programmeren in Unity (C Sharp).

Ik heb dus een vraag. Is het mogelijk om vanuit een aantal verschillende "Loops" er door de arduino 1 willekeurig uit te laten kiezen? Ik weet al hoe ik dit moet doen bij de verschillende pins met de RandomSeed die je vanaf pin 0 pakt als input, maar ik vraag me af dus of het mogelijk is om bijvoorbeeld een getal toe te wijzen aan een loop of om een willekeurige loop te laten selecteren.

Als klein voorbeeld:


------------------------------------------------------------------------------------
Ik activeer alle pins, wijs namen daaraan toe met 'int' en maak 3 loops.;

void setup() {

Pin 2->8 op output.;
}
void loop() {
!!Willekeurige keuze tussen de 3 verschillende loops!!;
}
}
void loop1() {
Doe iets leuks met pin 4, 6 en 7;
}

void loop2() {
Doe iets anders leuks met pin 3, 5 en 8;
}

void loop3() {
Doe alles uit;
}
------------------------------------------------------------

(Heel slecht voorbeeld, maar dan hebben jullie een idee.)

Advertisement

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

Re: Willekeurig kiezen uit een lijst Loops.

Berichtdoor nicoverduin » 26 Mei 2016, 17:02

Ik begrijp dat je het niet over loops (lussen) hebt maar eerder over het random aanroepen van verschillende functies. En ja dat kan.
De meest eenvoudige (maar ook voor jou complexe) is een array te maken met function pointers naar de verschillende functies. De index in de array wordt random gegenereerd.
Een wat eenvoudigere manier die waarschijnlijk eerder behapbaar is, is om de verschillende functies te maken. Dan in de arduino loop() genereer je een random getal (maak er een int oid van) en dan het switch case statement gebruiken.
Voor de seed van random generator heb je een onvoorspelbare waarde nodig anders zal random altijd dezelfde reeks genereren door de tijd heen. Als je nu een analoge read doet op een zwevende pin (dus nergens aan verbonden)(a0 -- a5) dan heb je al een aardige seed generator.

Enne Welkom in de wondere wereld van kleine computertjes en controllers
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 26 Mei 2016, 16:39

Re: Willekeurig kiezen uit een lijst Loops.

Berichtdoor Tha_Rotiart » 26 Mei 2016, 21:15

Hey! Bedankt voor je antwoord! Het is gelukt :)


cpp code
//                                   PinNumber    2    3     4       5       6       7     8
byte Numbers[11][7] = { { LOW,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH }, // = 0
{ LOW, LOW, LOW,HIGH, LOW, LOW,HIGH }, // = 1
{ HIGH, LOW,HIGH,HIGH,HIGH,HIGH, LOW }, // = 2
{ HIGH, LOW,HIGH,HIGH, LOW,HIGH,HIGH }, // = 3
{ HIGH,HIGH, LOW,HIGH, LOW, LOW,HIGH }, // = 4
{ HIGH,HIGH,HIGH, LOW, LOW,HIGH,HIGH }, // = 5
{ HIGH,HIGH,HIGH, LOW,HIGH,HIGH,HIGH }, // = 6
{ LOW, LOW,HIGH,HIGH, LOW, LOW,HIGH }, // = 7
{ HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH }, // = 8
{ HIGH,HIGH,HIGH,HIGH, LOW,HIGH,HIGH }, // = 9
{ LOW, LOW, LOW, LOW, LOW, LOW, LOW } // = UIT

};
void setup() {

Serial.begin(9600);
randomSeed(analogRead(0));
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}

void Schrijf(int Row) {
for (int i = 0; i < 7; i++){
digitalWrite(i+2, Numbers[Row][i]);
}
}
void loop() {
Schrijf(random(0,10));
delay(1000);
Schrijf(10);
delay(1000);
}

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

Re: Willekeurig kiezen uit een lijst Loops.

Berichtdoor nicoverduin » 26 Mei 2016, 21:35

Geweldig dat het kwartje snel gevallen is. Dan is de tijd gelijk rijp voor een paar verbeter tips :mrgreen:
a) gebruik meer commentaar. Uiteindelijk moet een programma een verhaal vertellen. De code is de implementatie van het verhaal (zei deze oude rot)
b) Je random patroon is nu iedere keer hetzelfde. Omdat het algoritme hetzelfde is. Er is ook een random functie die een seed (start parameter geeft). Als je nu bijv een analogRead(A0) voor de seed gebruikt dan is de volgorde elke keer anders.
c) je gebruikt nu delay(). Een goede reden om die weer heel snel te vergeten. Gebruik een timer als volgt:
cpp code
uint32_t timer;
boolean schrijfAan = false;

in de setup()
timer =millis();

in de loop()
//
// check of timer is verlopen
//
if (millis() - timer > 1000} {
//
// loopt de schrijf functie?
//
if (schrijfAan) {
//
// hij loopt dus alles uitzetten
//
Schrijf(10);
schrijfAan = false;
} else {
Schrijf(random(0,10)); // hier zou je dus die seed kunnen toevoegen
SchrijfAan = true;
}
//
// en start de timer opnieuw
//
timer = millis();
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3
Geregistreerd: 26 Mei 2016, 16:39

Re: Willekeurig kiezen uit een lijst Loops.

Berichtdoor Tha_Rotiart » 26 Mei 2016, 22:10

Ok, voor mij is dit weer een half uur puzzelen hoe alles zit, maar wat is het grote voordeel aan een 'timer functie' tegenover een 'delay()'? De randomSeed had ik later al toegevoegd toen ik telkens dezelfde nummers kreeg :D

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

Re: Willekeurig kiezen uit een lijst Loops.

Berichtdoor nicoverduin » 27 Mei 2016, 06:11

Bij een delay doet de processor niets anders dan stil staan totdat de tijd verstreken is. In dit geval is dat niet echt relevant. Maar de verleiding groot is om steeds vaker delay(0 te gaan gebruiken waardoor je uiteindelijk bij grotere programma's vastloopt omdat er bijvoorbeeld te laat gereageerd wordt op de periferie. Bij gebruik van een timer loopt de processor gewoon door en doet alleen iets als er iets gebeuren moet. Een slechte gewoonte is moeilijker af te leren dan aan te leren.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten