verlichting huisjes aansturen met Arduino - hoe kan het anders/beter/...

Gestart door Dirky, 04 maart 2021, 11:55:03 AM

Dirky

Arduino, iets waar veel over gepraat wordt maar waar duidelijk ook veel mee "gespeeld" wordt.

Voor zij die er nog aan twijfelen, de instap is zeer simpel, en als voorbeeld geef ik het volgende programma'tje dat maar 2 commando's gebruikt :

Ik ben er steevast van overtuigd dat de "kenners" direct een oplossing zullen vinden om een ander programma te schrijven dat net hetzelfde doet.

Je koopt een Arduino en je installeert de gratis Arduino-software op je PC. Je doet dan de moeite om de "beginselen" van het Arduino-gebeuren te lezen zodat je beseft dat er wel enkele regeltjes zijn zoals bijvoorbeeld het gebruik van verschillende tekens.

Je opent de file die ik als voorbeeld geef en je kan die uploaden naar je Arduino.

Wat zegt die file:

In een eerste lijst wordt bepaald wat je met de "poorten" wil doen en je geeft hier eenvoudig aan dat je elke pin wil beschouwen als digitale uitgang. Aan of uit dus. Meer niet...

void setup() {  // initialize digital pins as an output.
   pinMode(1, OUTPUT);
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);

}

// the loop function runs over and over again forever

En nu begint het spelleke: Je geeft aan wat je verwacht van die "outputs".
Eerste lijn zegt: Zet uitgang 1 hoog (aan)
Tweede lijn zegt: wacht 10000 millisekonden (10 seconden)
Enz...
En als ie op 't einde komt, herbegint die gewoon weer.

Voor alle duidelijkheid; als je het programma er in pomp hangt de Arduino aan je PC (+5V). Als je hem op je baan gebruikt geef je hem een aparte voeding van 7-12V. Van zodra er spanning opkomt begint de cyclus

void loop() {
   digitalWrite(1, HIGH);
   delay(10000);
   digitalWrite(2, HIGH);
   delay(10000);
   digitalWrite(8, HIGH);
   delay(5000);
   digitalWrite(4, HIGH);
   delay(10000);
   digitalWrite(7, HIGH);
   delay(10000);
   digitalWrite(10, HIGH);
   delay(8000);
   digitalWrite(3, HIGH);
   delay(12000);
   digitalWrite(2, LOW);
   delay(15000);
   digitalWrite(9, HIGH);
   delay(15000);
   digitalWrite(8, LOW);
   delay(18000);
   digitalWrite(5, HIGH);
   delay(10000);
   digitalWrite(4, LOW);
   delay(15000);
   digitalWrite(11, HIGH);
   delay(18000);
   digitalWrite(10, LOW);
   delay(18000);
   digitalWrite(4, HIGH);
   delay(15000);
   digitalWrite(10, HIGH);
   delay(12000);
   digitalWrite(3, LOW);
   delay(15500);
   digitalWrite(9, LOW);
   delay(18000);
   digitalWrite(5, LOW);
   delay(10000);
   digitalWrite(11, LOW);
   delay(12000);
   digitalWrite(4, LOW);
   delay(15000);
   digitalWrite(10, LOW);
   delay(18000);
   digitalWrite(2, HIGH);
   delay(12000);
   digitalWrite(5, HIGH);
   delay(15000);
   digitalWrite(11, HIGH);
   delay(5000);
   digitalWrite(2, LOW);
   delay(15000);
   digitalWrite(8, HIGH);
   delay(18000);
   digitalWrite(1, LOW);
   delay(15000);
   digitalWrite(5, LOW);
   delay(5000);
   digitalWrite(11, LOW);
   delay(16000);
   digitalWrite(8, LOW);
   delay(20000);
   digitalWrite(7, LOW);
   delay(12000);
   digitalWrite(6, HIGH);
   delay(12000);
   digitalWrite(12, HIGH);
   delay(18000);
   digitalWrite(6, LOW);
   delay(5000);
   digitalWrite(12, LOW);
   delay(20000);

}

Ik heb me dus in Excel een grafiekje gemaakt om de sequences in beeld te brengen.

sequences by Dirky dyniMo, on Flickr

Het leuke is dat je meteen een werkende toepassing hebt voor het ding dat onbekend was. Nu kan je jezelf verder verdiepen en zaken aanpassen, uitbreiden,...

Ik post straks nog een foto van het printje dat ik me samengebokst heb om de LED's aan te sluiten.

Karel A.J.

Prachtig werk, Dirk. Vooral kan het helpen om de instapdrempel te verlagen voor lieden die twijfelen. Proficiat!

svvander

Top Dirk! Dit is ook het soort zaken waar wij als club naar op zoek zijn, voor onze artikels rond Arduino. Je kan heel veel vinden op het net, maar het verstaanbaar maken voor iederen? Dat is helaas andere koek. Wat jij hier juist post is heel duidelijk en goed verstaanbaar.
Sven Vandersmissen HO - AC - Belgisch (en al wat op het Belgische net verschijnt) - Tijdperk IV - V -VI
Voorzitter MSC De Locloods VZW (https://www.de-locloods.be/) - info@de-locloods.be

Havoc

Citaat van: Dirky op 04 maart 2021, 11:55:03 AM
Arduino, iets waar veel over gepraat wordt maar waar duidelijk ook veel mee "gespeeld" wordt.

Voor zij die er nog aan twijfelen, de instap is zeer simpel, en als voorbeeld geef ik het volgende programma'tje dat maar 2 commando's gebruikt :

Ik ben er steevast van overtuigd dat de "kenners" direct een oplossing zullen vinden om een ander programma te schrijven dat net hetzelfde doet.

Je koopt een Arduino en je installeert de gratis Arduino-software op je PC. Je doet dan de moeite om de "beginselen" van het Arduino-gebeuren te lezen zodat je beseft dat er wel enkele regeltjes zijn zoals bijvoorbeeld het gebruik van verschillende tekens.

Je opent de file die ik als voorbeeld geef en je kan die uploaden naar je Arduino.

Ok, ik heb hier nu al bijna 1 jaar een koppel Arduino's liggen. En heb er nog niks mee gedaan. Maar als je mensen er toe wil aanzetten om het te proberen, kan je dan aub nog de volgende dingen aangeven:
- welk bordje gebruik je? Er zijn er zoveel ...
- die file, ik veronderstel dat daar dan het volgende instaat. Ik ken van arduino zelf echt niks maar ik heb gewoon je stukjes bij elkaar geplakt en een stukje van je uitleg er als commentaar in gelaten Dus ik hoop dat het klopt.:

void setup() {  // initialize digital pins as an output.
   pinMode(1, OUTPUT);
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);

}

// the loop function runs over and over again forever

// En nu begint het spelleke: Je geeft aan wat je verwacht van die "outputs".
// Eerste lijn zegt: Zet uitgang 1 hoog (aan)
// Tweede lijn zegt: wacht 10000 millisekonden (10 seconden)
// Enz...

void loop() {
   digitalWrite(1, HIGH);
   delay(10000);
   digitalWrite(2, HIGH);
   delay(10000);
   digitalWrite(8, HIGH);
   delay(5000);
   digitalWrite(4, HIGH);
   delay(10000);
   digitalWrite(7, HIGH);
   delay(10000);
   digitalWrite(10, HIGH);
   delay(8000);
   digitalWrite(3, HIGH);
   delay(12000);
   digitalWrite(2, LOW);
   delay(15000);
   digitalWrite(9, HIGH);
   delay(15000);
   digitalWrite(8, LOW);
   delay(18000);
   digitalWrite(5, HIGH);
   delay(10000);
   digitalWrite(4, LOW);
   delay(15000);
   digitalWrite(11, HIGH);
   delay(18000);
   digitalWrite(10, LOW);
   delay(18000);
   digitalWrite(4, HIGH);
   delay(15000);
   digitalWrite(10, HIGH);
   delay(12000);
   digitalWrite(3, LOW);
   delay(15500);
   digitalWrite(9, LOW);
   delay(18000);
   digitalWrite(5, LOW);
   delay(10000);
   digitalWrite(11, LOW);
   delay(12000);
   digitalWrite(4, LOW);
   delay(15000);
   digitalWrite(10, LOW);
   delay(18000);
   digitalWrite(2, HIGH);
   delay(12000);
   digitalWrite(5, HIGH);
   delay(15000);
   digitalWrite(11, HIGH);
   delay(5000);
   digitalWrite(2, LOW);
   delay(15000);
   digitalWrite(8, HIGH);
   delay(18000);
   digitalWrite(1, LOW);
   delay(15000);
   digitalWrite(5, LOW);
   delay(5000);
   digitalWrite(11, LOW);
   delay(16000);
   digitalWrite(8, LOW);
   delay(20000);
   digitalWrite(7, LOW);
   delay(12000);
   digitalWrite(6, HIGH);
   delay(12000);
   digitalWrite(12, HIGH);
   delay(18000);
   digitalWrite(6, LOW);
   delay(5000);
   digitalWrite(12, LOW);
   delay(20000);

// En als ie op 't einde komt, herbegint die gewoon weer.

}


Dus moest je dat in de online omgeving plakken en in je arduino bordje downloaden, zonder iets in die omgeving in te stellen dan werkt het?

Citeer
Ik post straks nog een foto van het printje dat ik me samengebokst heb om de LED's aan te sluiten.
Dat gaat ook helpen.

PS: begrijp me niet verkeerd hé. Ik vind het goed dat zoiets eens op het forum komt. Zelf heb ik leren "programmeren" 35 jaar geleden en het daarna nooit gedaan. Dus ik snap je programma wel. Maar eerlijk gezegd, ik zou dit niet in een arduino krijgen. Zou eerst eens zo'n step-by-step willen kunnen doorlopen.
Met vakantie voor onbepaalde duur.

svvander

Citaat van: Havoc op 04 maart 2021, 13:20:09 PM
Ok, ik heb hier nu al bijna 1 jaar een koppel Arduino's liggen. En heb er nog niks mee gedaan. Maar als je mensen er toe wil aanzetten om het te proberen, kan je dan aub nog de volgende dingen aangeven:
- welk bordje gebruik je? Er zijn er zoveel ...


Nano, Uno... maakt voor dit eigenlijk niet zoveel uit.
Sven Vandersmissen HO - AC - Belgisch (en al wat op het Belgische net verschijnt) - Tijdperk IV - V -VI
Voorzitter MSC De Locloods VZW (https://www.de-locloods.be/) - info@de-locloods.be

dani

2 tips :

1. gebruik eens een "for" lus voor opeenvolgende dingen zoals de pinMode commando's
2. maak een subroutine  "aan" en "uit" en stur die dan met parameters aan (1 voor de pin nr en 1 voor de brandduur)
De kruik is te water gegaan...
De kruik is niet meer.

Dirky

Inderdaad correct Johan, zo zou het moeten werken!

Het printje dat bijna de naam print niet waardig is:

IMG_20210304_140932_resized_20210304_020953931 (002) by Dirky dyniMo, on Flickr

IMG_20210304_141024_resized_20210304_021044341 (002) by Dirky dyniMo, on Flickr

Ik gebruik 3K9 weerstanden omdat naar mijn mening, de meeste huisjes die verlicht worden op modelbanen, de indruk geven dat de eigenaar met een supertrooper aan 't verlichten is.

De bovenste rij van de header waar ik de LED's in plug is de gemeenschappelijke GND.

Is hier dus idd een UNO.

En Dani:

Toen ik zowat een jaar geleden mijn eerste Arduino kocht - je hebt me toe ook de nodige tips gegeven - ben ik als een zot in de boeken gedoken en kon ik, voor mezelf althans, al serieuze dingen programmeren. Nu, na een jaar stilte ben ik meer dan de helft vergeten en zakt de moed in mijn schoenen als ik een fout moet zoeken.
En da's nu het leuke aan dit heeeeel simpel programma'tje. 2 commando's, meer niet, en 't werkt. Iedereen verstaat het en in ons wereldje kan je het voor heel veel zaken gebruiken. Verlichting in huisjes, verkeerslichten, spoorwegovergangen,...
Ik zou heel graag jouw kennis hebben ivm programmeren maar vrees dat het voor een ander leven zal zijn.

Desalniettemin probeer ik in 't korte wel weer eens met een "for" lus...

dani

De kruik is te water gegaan...
De kruik is niet meer.

Frank_N

Groet van Frank

Havoc

Citaat van: dani op 04 maart 2021, 14:05:14 PM
2 tips :

1. gebruik eens een "for" lus voor opeenvolgende dingen zoals de pinMode commando's
2. maak een subroutine  "aan" en "uit" en stur die dan met parameters aan (1 voor de pin nr en 1 voor de brandduur)

Ook een optie, maar dan moet je je al zekerder voelen. Ik vind het hele simpele programma van Dirky perfect om iemand die nog nooit zo'n ding vastgepakt heeft de moed te geven te beginnen. Eenmaal dat kan je verder gaan.

Als je met zo'n aparte routines begint ga je ook de data anders moeten schikken (welke output en welke brandduur). Moest ik nu met dat basis programma van Dirky voortgaan, het eerste dat ik zou proberen is om de tijden een random stuk te geven. Dus ipv een vaste "delay(xxxx)" iets zoals "delay (xxxxx +/- iets random)". Wat variatie in het patroon zonder dat je dat moet programmeren als een ander patroon.

Als je met aan/uit routines werkt, dan kan je naar random lichtjes gaan. En zo verder...

Citaat van: Dirky op 04 maart 2021, 14:23:15 PM
Ik gebruik 3K9 weerstanden omdat naar mijn mening, de meeste huisjes die verlicht worden op modelbanen, de indruk geven dat de eigenaar met een supertrooper aan 't verlichten is.

De bovenste rij van de header waar ik de LED's in plug is de gemeenschappelijke GND.

Zelf gebruik ik 3k3 voor witte leds op 5V, inderdaad meer dan genoeg. Ik zal eens een Uno of Nano moeten bestellen. Wat ik hier heb zijn Himalaya (Mini Leonardo). Ergens vanachter in een schuif liggen nog ATMega128A1U's. Of eens voortdoen met mijn IO borden voor de pc...  :-[
Met vakantie voor onbepaalde duur.

Dirky

Er is iets vreemd met de random functie van Arduino. Blijkbaar kiest hij een random-lijst bij de eerste opstart en bij elke nieuwe start loopt hij diezelfde lijst af. Dus niet echt super random...

Een andere reden dat ik het op die simpele manier gedaan heb is om er ergens wat logica achter te steken; als het donker wordt gaat er in de meeste huizen beneden wel een licht aan. Dan volgt een wisseling beneden/boven. In het station gaat het licht eerst aan in de wachtzaal... en fantaseer maar verder... :-)

en b.t.w., ik schrijf het programma via excel. Daar kan je gemakkelijk een input veld maken en via "tekst samenvoegen" het geheel juist schrijven...

doomslu

Citaat van: Havoc op 04 maart 2021, 16:47:49 PM

Moest ik nu met dat basis programma van Dirky voortgaan, het eerste dat ik zou proberen is om de tijden een random stuk te geven. Dus ipv een vaste "delay(xxxx)" iets zoals "delay (xxxxx +/- iets random)". Wat variatie in het patroon zonder dat je dat moet programmeren als een ander patroon.

Als je met aan/uit routines werkt, dan kan je naar random lichtjes gaan. En zo verder...

Random zou ik ook gebruiken, maar gecombineerd met een patroon:
- als het begint te duisteren gaat hier en daar een lampje aan, meestal in de woonkamer/keuken
- af en toe gaan er ook lichtjes aan in andere ruimtes, de hal, de berging, toilet of een of meerdere kamer 'boven'
- vaak blijven die minder constant aan dan in de woonkamer.
- in veel huizen zal het redelijk donker worden terwijl men tv kijkt. Je ziet dan gekleurd geflikker...
- als de nacht valt gaan de lichten in slaapkamer(s) en badkamers even aan terwijl beneden alles donker wordt
- en dan gaat zo goed als iedereen slapen en wordt het donker.
- en dan komt de zon weer op... en is er weer een ander patroon.

Je ziet, er kan heel veel met het aansturen van lichten gedaan worden.  :)
luc    * MODEL RAILROADING IS FUN *

eve

Dat is niet zo vreemd.
Rond 1980 was vooral BASIC populair. De functie RANDOM() bestond ook. Om te vermijden dat na elke opstart telkens eenzelfde volgorde werd afgewerkt bestond ook RANDOMIZE(), waarbij de lijst van de RANDOM() getallen willekeurig herschikt werd...
Zo bekwam men een echte willekeurige volgorde.

Misschien zit er voor de ARDUINO ook ergens zoiets in.

Mvg, Erik

Karel A.J.

@Dirk: een Arduino bevat (van huis uit, toch) geen klok, waar kan hij dan al  van uitgaan om een toeval te genereren? [toevoeging: maar de opmerking van Erik @eve hierboven klinkt wel erg zinnig - te bekijken!)
@Luc Dooms: in die richting gingen mijn gedachten ook, maar ze waren nog niet zozeer gecondenseerd :)

doomslu

luc    * MODEL RAILROADING IS FUN *