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

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

doomslu

Citaat van: Karel A.J. op 15 maart 2021, 17:13:57 PM
Dirk, evenzeer met alle respect, maar is dit forum daarvoor de aangewezen plaats?
Gaat het hier over treintjes of gaat het hier over arduino's?
Nu, er is niks verkeerds aan om alhierover Arduino's te klappen, maar het moet (nmbm) een nevenzaak blijven.

...
Sorry Karel, maar hier ben ik het toch niet mee eens.
Arduino is aan een opmars bezig in onze hobby, net als lasersnijden en 3D-printen, welke we hier ook regelmatig op dit forum zien passeren.

En dan vind ik de vraag van Dirk terecht. Je leert het meest als er een volledige 'sketch' wordt gepost.
luc    * MODEL RAILROADING IS FUN *

Alberke

Citaat van: Dirky op 15 maart 2021, 17:25:20 PM
't is ik niet die het ingewikkeld wou maken. Ik heb het draadje in twee gesplitst omdat er enkele mensen die het veel beter weten hun ding wouden doen omdat het mijne te eenvoudig was en veeeeeeel beter kon. >:( Ge wou mij wijsmaken dat het beter kon! Maar blijkbaar is jullie oplossing ook niet zo gemakkelijk. Het mijne werkt en ik ben tevreden. Mijn klant ook!

Van mij mag heel dienen boel op slot...


en ik denk echt dat ik hier in alle stilte ga verdwijnen en alles ga overlaten aan "de specialisten"!
neenee, blijf maar hier.
Dit is tenminste bruikbaar en interessant; er zijn al genoeg van die eindeloze zeurdraadjes waar niemand iets aan heeft behalve de bezitters van een peperdure loc (om een voorbeeld te geven  ;) )
Ja, ik ben de plezantste thuis, als de vuilbak buiten staat! ;D

Karel A.J.

#62
CiteerJe leert het meest als er een volledige 'sketch' wordt gepost.
En daarmee ben ik het dan weer helemaal oneens, beste Luc. Nog steeds met alle respect, uiteraard :)
Een volledige sketch die wordt alleen maar overgenomen, knip & plak & uit.
Als het werkt dan hoort men niets meer.
Werkt het voor iemand niet dan komt er "dat werkt niet" - waarmee niemand iets vooruit kan, uiteraard.

Ik sta helemaal achter de opsplitsing "basis" vs. "ten gronde" - maar in een "ten gronde" moet men bereid zijn tot eigen inzet, en dus geen hapklare brokken verlangen. In het "basis"-draadje zijn er die al aangeboden, en ik heb er mijn volle steun bij betuigd.

Wie echt wil leren, die begint met iets uitermate simpels, breit daarop verder naar beste godsvrucht en vermogen, en naar eigen inzicht; en post hier (of elders, uiteraard) vragen en resulaten en problemen. Lieden die zoveel inzet betonen zal ik graag ondersteunen.

En verder begin ik ook te overwegen om het hier maar voor bekeken te houden - ook om andere redenen, overigens.


deevie

Een mogelijke variant waarbij LEDs willekeurig aan en uit gaan volgens een willekeurige tijd. De tijd bevindt zich steeds tussen mintijd en maxtijd.

// vrij aan te passen parameters
unsigned long mintijd = 3000; // in milliseconden
unsigned long maxtijd = 10000; // in milliseconden
int aantalLEDs = 12;  //max 12 LEDS op een Arduino UNO, nl pin 2 tem pin 13. Pin 0 en 1 kunnen niet gebruikt worden als output.

// hulpvariabelen, niet aanpassen
unsigned long timer;
int pinLED;

void setup() {
  // overloopt alle pins die zullen gebruikt worden en zet deze als output. Bvb bij 12 LEDS dus tellen vanaf 2 zolang de waarde van i kleiner is dan 2 + 12.
  for (int i=2; i < aantalLEDs+2; i++){
    pinMode(i, OUTPUT);
  }

  // dit is nodig voor de random functie omdat de Arduino geen random generator aan boord heeft. Een zwevende ingang (analoge pin 0 inlezen levert steeds een willekeurige waarde op.
  randomSeed(analogRead(0));
}

void loop() {
  // als de timerwaarde kleiner wordt dan de millis()-waarde, alles binnen de accolades uitvoeren.
  if (timer <= millis()){
    // willekeurige pin nemen. Random-Functie heeft 2 parameters: min waarde (dit is inclusief) en een max waarde (deze is exclusief) en geeft een waarde in dat interval terug
    pinLED = random(2,aantalLEDs+3); 

    // de waarde van de pin inlezen en het omgekeerde van de waarde uitsturen dmv '!'
    digitalWrite(pinLED,!digitalRead(pinLED));

    // nieuwe waarde voor timer zetten
    timer = millis() + random(mintijd,maxtijd+1);
  }
}

Havoc

Citaat van: Karel A.J. op 15 maart 2021, 18:26:54 PM
CiteerJe leert het meest als er een volledige 'sketch' wordt gepost.
En daarmee ben ik het dan weer helemaal oneens, beste Luc. Nog steeds met alle respect, uiteraard :)
Een volledige sketch die wordt alleen maar overgenomen, knip & plak & uit.
Als het werkt dan hoort men niets meer.
Werkt het voor iemand niet dan komt er "dat werkt niet" - waarmee niemand iets vooruit kan, uiteraard.

Ik sta helemaal achter de opsplitsing "basis" vs. "ten gronde" - maar in een "ten gronde" moet men bereid zijn tot eigen inzet, en dus geen hapklare brokken verlangen. In het "basis"-draadje zijn er die al aangeboden, en ik heb er mijn volle steun bij betuigd.

Wie echt wil leren, die begint met iets uitermate simpels, breit daarop verder naar beste godsvrucht en vermogen, en naar eigen inzicht; en post hier (of elders, uiteraard) vragen en resulaten en problemen. Lieden die zoveel inzet betonen zal ik graag ondersteunen.

En verder begin ik ook te overwegen om het hier maar voor bekeken te houden - ook om andere redenen, overigens.

Probleem met zo'n stukje code zoals perk hierboven heeft geschreven is dat het op zich niet bruikbaar is. Je moet ook aangeven dat je al die variabelen bvb ergens moet declareren. Wat deevie hier net boven schrijft is al heel wat bruikbaarder EN het legt ook nog uit wat alles doet. Zo leer je bij.
Met vakantie voor onbepaalde duur.

Dirky

Bedankt Davy,

Voor zover ik het (al) begrijp overlappen de "aan" periodes van de ene LED niet die van andere? Het is elk om beurt, niet?

perk

volledig akkoord met het commentaar van Havoc, mijn stukje was maar om aan te geven dat ik het niet met delay zou doen maar met timers.
Ik had geen tijd deze middag om het verder uit te werken.

Je kan dit ongelofelijk 'moeilijker' maken met de lengte van de dag, uren voor stop en start en allemaal herschalen naar modeltijd. 

Dirky, als de klant tevreden is - dan is het toch prima?   Vele wegen leiden naar Rome, zoals sommigen onder ons (ikke) dus tevreden zijn met een groen treintje dat wat Belgisch lijkt en sommige anderen het laatste detail juist willen.  Niks mis mee.

Ik heb ook Arduino code met delays voor simpele dingen, maar echt simpel blijft het meestal niet.   Want met die ene arduino die je nu hebt kan ook een deur laten opengaan, en een geluidje maken, en een laspost laten bliksemen, de sequentie laten veranderen of pauzeren met een knopje ... allemaal met dezelfde arduino maar dan niet meer met 'delay'.  En zo bouw je stukje voor stukje verder en na een tijdje zitten alle pinnen vol :-)

Het is ook een stukje hobby op zich, zoals sommigen zich laten gaan met 3D printers ook.

Ik vind het allemaal wel leuk, niet als doel op zich maar ter ondersteuning van onze hobby.





Havoc

Citaat van: perk op 15 maart 2021, 21:05:42 PMWant met die ene arduino die je nu hebt kan ook een deur laten opengaan, en een geluidje maken, en een laspost laten bliksemen, de sequentie laten veranderen of pauzeren met een knopje ... allemaal met dezelfde arduino maar dan niet meer met 'delay'.  En zo bouw je stukje voor stukje verder en na een tijdje zitten alle pinnen vol :-)

Hierbij heb ik zoiets van: KISS. Niemand lijkt de post van raf gelezen te hebben? "Onder elk huisje zit een processor". Als je ziet van die dingen kosten waarom dan elke pin willen gebruiken? Waarom niet iets simpel doen doen en dan hop, een volgende voor het volgende effect? Ok, onder elk huisje een processor is misschien overdreven, maar onder een rijtje een processor voor de lichtjes. En dan een andere om de rolluiken te bedienen... (ok, maar een voorbeeld).
Met vakantie voor onbepaalde duur.

deevie

Citaat van: Dirky op 15 maart 2021, 20:58:24 PM
Voor zover ik het (al) begrijp overlappen de "aan" periodes van de ene LED niet die van andere? Het is elk om beurt, niet?
Ze overlappen eigenlijk. De eerste random-functie binnen de loop selecteert een willekeurige pin. Die willekeurige pin wordt getoggled (dus als die uit is, wordt die aan gezet of omgekeerd). Als laatste wordt dan via de random-functie een bepaalde wachttijd bepaald. Eenmaal de wachttijd voorbij is (via die if statement) begint de routine opnieuw met random pin.

Het is dus mogelijk dat pin2 eerst wordt ingeschakeld, daarna pin 3 en misschien vervolgens wordt pin2 terug uitgeschakeld.

Alberke

Citaat van: Havoc op 15 maart 2021, 21:09:38 PM
Citaat van: perk op 15 maart 2021, 21:05:42 PMWant met die ene arduino die je nu hebt kan ook een deur laten opengaan, en een geluidje maken, en een laspost laten bliksemen, de sequentie laten veranderen of pauzeren met een knopje ... allemaal met dezelfde arduino maar dan niet meer met 'delay'.  En zo bouw je stukje voor stukje verder en na een tijdje zitten alle pinnen vol :-)

Hierbij heb ik zoiets van: KISS. Niemand lijkt de post van raf gelezen te hebben? "Onder elk huisje zit een processor". Als je ziet van die dingen kosten waarom dan elke pin willen gebruiken? Waarom niet iets simpel doen doen en dan hop, een volgende voor het volgende effect? Ok, onder elk huisje een processor is misschien overdreven, maar onder een rijtje een processor voor de lichtjes. En dan een andere om de rolluiken te bedienen... (ok, maar een voorbeeld).
...en daarom was ik op zoek naar dat item over die bouwdoos van Modelbouwled. Moet ge zelfs niet voor kunnen solderen als ge de geassembleerde versie koopt.
Ja, ik ben de plezantste thuis, als de vuilbak buiten staat! ;D

patrick smout

Citaat van: deevie op 15 maart 2021, 20:19:43 PM
Een mogelijke variant waarbij LEDs willekeurig aan en uit gaan volgens een willekeurige tijd. De tijd bevindt zich steeds tussen mintijd en maxtijd.

// vrij aan te passen parameters

  // als de timerwaarde kleiner wordt dan de millis()-waarde, alles binnen de accolades uitvoeren.
  if (timer < millis()){
    // willekeurige pin nemen. Random-Functie heeft 2 parameters: min waarde (dit is inclusief) en een max waarde (deze is exclusief) en geeft een waarde in dat interval terug
......
    // nieuwe waarde voor timer zetten
    timer = millis() + random(mintijd,maxtijd+1);

De code in het voorbeeld heeft toch een vervelend neveneffect dat deze na enige tijd tot gevolg heeft dat het heel lang zal duren vooraleer de LED's nog eens toggle.
Het moment dat dit optreed is namelijk als na het berekenen van een nieuwe waarde voor "timer", millis() overgaat van maximale waarde naar minimale waarde ( een zogenaamde overflow).

Op te lossen door de berekening even te herschikken zoals correct gedaan een paar antwoorden terug (antwoord van Perk/Patrick) maar nu met een variant.
Ik ben geen Arduino expert noch gebruiker maar de variabelen moeten unsigned / unsigned long zijn (kan zijn dat dit zo is op dit platform)


...ergens in setup
    starttijd = millis();
    randomtijd = random(mintijd,maxtijd+1);
....

... in loop()

  // als de timerwaarde kleiner wordt dan de millis()-waarde, alles binnen de accolades uitvoeren.
  if (millis()-starttijd > randomtijd){
    // willekeurige pin nemen. Random-Functie heeft 2 parameters: min waarde (dit is inclusief) en een max waarde (deze is exclusief) en geeft een waarde in dat interval terug
......
    // nieuwe waarde voor timer zetten
    starttijd = millis();
    randomtijd = random(mintijd,maxtijd+1);


Onder het motto, hoe kan het anders  ;) ...

Een nog universelere aanpak is om alle data in arrays of structs te zetten, zowel patroon, schakeltijden, de te gebruiken uitgangen, state, starttijd en duurtijd. (1 array of structs per kanaal voor het patroon binnen één kanaal en 1 array of pointers to arrays of structs om over de kanalen te itereren)
Het voordeel van deze datadriven aanpak is dat je enkel maar tabellen moeten editeren om patronen aan te passen en de code universeel is.
Maakt niet uit welke uitgang je wil schakelen en in welke volgorde en /of duurtijd. Alles info zit in de data/tabellen.
Op dat ogenblik ben je aan het configureren i.p.v. programmeren en tabellen kan je ook automatisch aanmaken / opladen via seriële poort/usb poort etc.

Jammer genoeg heb ik geen Arduino bij de hand maar ongetwijfeld is hier wel een Arduino expert die een voorbeeld(je) kan posten.

mvg, Patrick Smout
Met vriendelijke groeten,

Patrick Smout

deevie

De overflow doet zich voor na ongeveer 50 dagen. Het effect dat beschreven wordt waarbij heel lang zal moeten gewacht worden klopt eigenlijk niet. Integendeel zelfs want na ongeveer 50 dagen zal er uitzonderlijk iets sneller een LED getoggled worden. De reden is eigenlijk heel simpel. De tijd die de Arduino nodig heeft om na de laatste statement in de IF-statement terug de IF-statement zelf te valideren is veeeeeeel korter dan de min tijd die normaal ingesteld wordt. Ook de timer-variabele zal overflowen.

De opmerking ivm unsigned variabelen begrijp ik niet?

patrick smout

Heb je dat getest ?  ;)
Wat als millis + random ( timer) bijna op max waarde staat en de volgende keer de loop doorlopen wordt millis terug naar de min waarde gevallen is. Kan voorkomen als ergens in de loop iets langer duurt en random kleine waarden geeft.

In dat geval gebeurt er 50 dagen niets meer ... Of je moet de spanning uitzetten.

Unsigned .... Variabele zonder tekenbit om de berekening te doen in de gewijzigde code.

Mvg, Patrick
Met vriendelijke groeten,

Patrick Smout

stoomlokje


svvander

Tip voor de beginner en leek, die nog geen of weinig kennis heeft van Arduino: laat dit draadje nog even voor wat het is. Begin bij basis zaken die je op het net kan vinden (of op de website van VMSC De Locloods Arduino bijvoorbeeld).


Het hoeft ook absoluut niet heel duur te zijn. Bij de Chinees (Ali), kan je al een kitje kopen met enkele basiszaken om aan de slag te gaan voor rond de €10 (Ali ) of als je weet wat je allemaal nodig hebt, kan je een losse UNO kopen voor nog geen €4 (nog eens Ali), een breadboard voor €0,90, de jumpers €2,5 , de LEDS €6,5 (100 stuks) en de weerstandjes €5,5 (Allen verzending inbegrepen). Uren leer- en speelplezier


Het leuke is dat het relatief eenvoudig is en dat je er heel veel mee kan. Het meeste is zo terug te vinden op het internet en met een beetje oefening geraak je heel ver.
Veel succes ermee.

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