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

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

gardevil

Citaat van: Karel A.J. op 07 maart 2021, 12:13:39 PM
Alsmaar zoekend naar vergelijkingen die kunnen verduidelijken: ik bedacht me dat

Iemand die vragen heeft bij het vermenigvuldigen van 7 maal 24
weinig gebaat is met suggesties over logaritmes of over cosinussen of zo.

Nu kan men aanvoeren dat logaritmes best wel relevant kunnen zijn als het over vermenigvuldigen gaat - wie weet nog met een rekenlineaal om te gaan :) ? - maar waar het eigenlijk op aan komt:

Zal men antwoorden aan de vraagsteller?
Of zal men antwoorden aan allen die, nu of later, belang stellen in het onderwerp?

In het tweede geval kan een antwoord dat verder gaat dan de neuslengte van de vraagsteller zinnig en verantwoord zijn.
Ik denk, maar wie ben ik, antwoorden op de vraagsteller, want dat is de reden dat hij de vraag stelde.Verder uitweiden kan daarna nog altijd, zolang men maar in gedachte houdt dat de vraagsteller misschien niet hetzelfde kennisniveau heeft als diegene die de vraag beantwoord.

Als liefde blind is, waarom is lingerie dan zo belangrijk?

Alberke

Citaat van: Dirky op 07 maart 2021, 16:17:57 PM
En heb ik gelijk? we zijn nog geen bladzijde ver en er begint al eenen over cosinussen te rammelen. Het oorspronkelijke onderwerp is al heeeeeeeel ver weg.
Het is lastig om zich in de denkwereld van een ander te verplaatsen. Men reageert soms op iets totaal irrelevant en dan ontspoort het. Bij de zaak blijven op een forum is lastig. In een klas is er de leraar die alles in goede banen kan lij(ei)den. Op een forum heb je de moderator(s), maar ja, wie heeft daar tijd voor. Tegen dat die kan ingrijpen is het kwaad geschied. En als de (on)bewuste zondaar dan last heeft van het lange tenen syndroom is het mot, zoals ze in het noorden zeggen.
Ik heb me trouwens een tijd geleden ook in de Arduinowereld gestort, geleidt door het internet, want daar zijn heel goede voorbeelden en richtlijnen te vinden. Ergens op dit forum zijn mijn prestaties misschien nog terug te vinden, en het ging om een digitale besturing zonder Ecossen en andere dure dingen.
Je kunt het eenvoudig houden, maar voor sommigen zijn begrippen als compileren en uploaden al te veel.
Met mijn sorry aan Dirk voor de vervuiling  ;)
Ja, ik ben de plezantste thuis, als de vuilbak buiten staat! ;D

Havoc

Probleem is de vorm van het forum (nu wijken we wel ver af). Als je 1-op-1 met iemand zo bezig bent, dan kan je de snelheid van vooruitgaan aanpassen aan wie je voor jou hebt. "De leraar" in de post van Hugo hierboven. Maar hier op het forum gaat dat niet want iedereen stuurt maar een antwoord op wat hij ziet ifv wat hij weet/wil weten, zonder dat hij rekening kan houden met de anderen. Dat legt ook wat bij diegene die meeleest. Je moet gewoon nog geen rekening houden met de gevorderde uitleg en de vragen op jouw tempo stellen en verder gaan op jouw tempo. Probleem is dat het overzicht snel zoek is. En eerlijk gezegd ik weet daar ook geen oplossing voor.

Om even terug te gaan op het begin: er is de simpele sketch van Dirky. Dan komt er de post van Dani met de tips "waarom niet met een "for" lus? en je kan ook een functie aan/uit gebruiken". Er is niets mis mee met die opmerking/vraag/tips. Als je als lezer nog met die eerste sketch bezig bent, doe rustig voort tot je daar door bent. Laat de rest maar gaan. Als je daar door bent kan je ofwel zelf naar die "for lus" gaan, of er vragen over stellen. En je moet dat zelfs niet doen, er is geen examen op het einde.
Met vakantie voor onbepaalde duur.

Karel A.J.

CiteerEn heb ik gelijk? we zijn nog geen bladzijde ver en er begint al eenen over cosinussen te rammelen.

Okee, heb dan maar gelijk, als ge daar op uit zijt. (volgens mij kan men "gelijk" niet tussen zijn boterham leggen, en is het dus niet veel waard - maar ik weet wel dat er ook dikkere ego's rondgaan in de wereld).

@Dirky, ik heb u vanaf de eerste reactie alle lof en steun gegeven, het stemt me bijzonder bitter om zo laffelijk te worden aangevallen op de cosinus die ik enkel als voorbeeld aanhaalde.

Salut en de kost.

Havoc

Soit, waarom dan niet gewoon wat verder doen...

We hadden de simpele sketch van Dirky:
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.

}


We kunnen nu voor dat eerste stuk een "for" lus gebruiken. Dan wordt de sketch:

void setup() {  // initialize digital pins as an output.
   int x; // we gaan een teller gebruiken die enkel gehele getallen voorstelt en die we x noemen

   for (x=1;x<13;x++) {
      // deze lus begint met x=1 en gaat door de lus, aan het einde wordt x eentje groter gemaakt (x++) en we doen dat zolang x kleiner dan 13 is
      pinMode(x,OUTPUT); // zet pin met nummer x als 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.

}


Dit is identiek het zelfde als de hele simpele versie. Wat zijn de voordelen:
- je moet minder schrijven
- als je de volgende versie er maar 10 nodig hebt, dan moet je 1 getal veranderen (13 wordt 11)
- als je volgende keer er 24 nodig hebt moet je ook 1 getal veranderen (13 wordt 25)

Maar er zijn ook nadelen:
- dit werkt enkel als je alle opeenvolgende pinnen dezelfde functie wil geven. Als pin 5, 7 en 9 een INPUT zijn dan werkt dit niet.
- je moet goed opletten dat het begin en einde goed zit. Je wil alle pinnen van 1 tot en met 12 configureren. Dus tel je van 1 tot (kleiner dan 13) want de test gebeurt bovenaan en de teller x een verhogen aan het einde van de lus.
Met vakantie voor onbepaalde duur.

perk

in de mate dat dit nog relevant is ...


---


ik wil niet beleerd overkomen maar heb toch een paar opmerkingen die interessant kunnen zijn voor iedereen.

Ik raad je ten stelligste het gebruik van 'delay' af in deze context.   Met die functie stopt je arduino voor een momentje en wacht... ondertussen kan je niets meer doen.  Dus ook geen andere led meer opzetten of afzetten.  Pas je ergens 1 delay aan, rimpelt het de rest van je timers in de 'soep'.

Veel beter is een soort timer te maken met start en eind momenten, te checken voor elke led of je daar tussen valt en actie te nemen.
Dit kan je in een loop doen, kost een fractie van een secondje en daarna kan je iets anders doen.   Vb, een input van een schakelaar lezen.

een voorbeeld van een soort timer :


       if (millis()-lastchangeblink  >= blinkinterval)
            {
              led_out=!led_out;  // invert blink status -> time to change LEDs if they need to be blinking
              Driveleds();
              lastchangeblink=millis();   
            }

dit inverteert de output (dus een led) na een bepaalde tijd.   Je kan dit gewoon aanpassen naar het op/af zetten van leds.   
Het is een fractie van een sec om hierdoor te lopen voor een arduino en direct daarna kan je andere stukjes van programma zetten.    Met een array kan je meerdere leds in 1 keer doen.
je neemt het moment 'nu' (=millis()) en vergelijkt dat met je laatste actie, is die groter dan een interval, doe je iets.
Maar even makkelijk kan je tijden vergelijken door start / stop momenten PER led.

ik heb dit ook gebruikt om 1 keer per aantal seconden de temperatuur te meten :

       // take temp every set interval + display on tft
         if (millis()-lasttemptaken  >= temptakeninterval)
            {
              sampletemp();
              lasttemptaken=millis();           
            }

Nog een andere manier om een hele hoop leds aan te sturen is door gebruik te maken van speciale leds : neopixels.

Mijn oude controlepaneel was zo gemaakt : https://www.youtube.com/watch?v=vXrFzWfWMDM
Dit zijn een 3 tal series van leds in lijn gezet.

Met neopixels kan je met 1 pin en 1 commando een hele hele lange lijn LEDS gaan aansturen.  En elke LED een aparte kleur geven.
De kring is in 1 keer te dimmen (niet individueel) zonder telkens een andere weerstand te moeten solderen.  Gewoon in software.

https://www.tweaking4all.nl/hardware/arduino/adruino-led-strip-effecten/

Dit klinkt moeilijker dan het is, denk gewoon aan een effect dat je elke huisje een lichtjes andere kleur kan geven en elk ledje indivudueel kan afzetten met paar 1 draadje uit je arduino.  Allemaak in een fractie van een seconde voor de hele lijn aan te passen.

EN ... in dit soort schakelingen haal je de voeding van de leds niet uit de arduino maar uit een aparte simpele voeding.   Want je moet ook opletten dat je de arduino niet overbelast, vooral als je veel leds gaat doen om een MEGA gebruikt met veel pinnen.

Er zijn trouwens ook andere libraries die toelaten meerdere pinnen van de arduino te gebruiken voor leds en te dimmen.

Ik vind je printje dat je gesoldeerd hebt trouwens heel netjes, ik zou het niet zo proper kunnen.  Ik klodder meestal maar wat aan.

Patrick



Dirky

maar hoe bepaal je dan hoe lang een bepaalde LED aan blijft? Ik wil de volgorde en de tijden respecteren van het grafiekje dat ik in excel heb gemaakt...

raf

Dirk in basic zou het eenvoudig zijn

PORTB = %11111111            'nu staan alle leds uit
for a = 1 to b :next               'waarvan b bepaald word in je setup
PORTB = %11111110           'je tweede regel
for a = 1 to 1000 +b :next
  PORTB = %01111100          'je derde regel
for a = 1 to 1500 + b :next
PORTB = %11011101        zo maar een regel

door nu steeds de het bit van een  poort terug 1 te maken gaat de led terug uit terwijl je met een bit 0 te maken een andere terug aan zet

onder elk huisje zit van mij een processor die zich alleen met de ledjes bezig houd
alle processoren zitten aan een dag nacht schakeling maar het kan even goed een schakelaar zijn die manueel je op een bord bedient
je kunt max 15 ledjes sturen met een 16f628 processor omdat er een poort alleen maar ingang kan zijn (door ingeniering bepaald kun je niets aan veranderen)
zolang die poort 0 (massa)krijgt blijft de verlichting werken
staat er op die poort 5 volt (een 1) dan stoppen alle verlichting processors met wat ze bezig zijn

of die truk ook met een  arduino kan gedaan worden met zo een volledige poort te schakelen heb ik geen idee
dus al je gele vlakjes worden een 0 en de rest een 1
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Dirky

Ik ben er echt niet van overtuigd dat wat ik wil, sneller kan geschreven worden dan hoe ik het nu doe:

Excel is voor mij zo een beetje "het" programma waarmee ik dingen "automatisch" schrijf.

Wat ik nu laat lopen op die Arduino wordt geschreven aan de hand van een tabel die bestaat uit "LEDNUMMER", "DELAY AAN", "DUUR AAN", "DELAY2 AAN", "DUUR2 AAN".
Met een beetje rekenwerk en de functie "TEKST.SAMENV" laat ik alle lijntje schrijven en met copy/paste gaan die in de sketch. Moet ik iets aanpassen, dan verander ik een cijfertje en her-copy/paste...

Het probleem voor de beginner is dat er direct met woorden gegooid wordt die wij gewoon niet begrijpen wat ze in het programma betekenen.

@Patrick; mocht je eens op jouw manier een volledige sketch schrijven die ervoor zorgt dat een Arduino doet wat wij willen zou het misschien duidelijker zijn... of kunnen we gerichtere vragen stellen.

Karel A.J.

Ik sluit me graag aan bij Patrick @perk : om het echt proper te doen in Arduino is de functie "millis" de grote max. Maar het is niet zo eenvoudig te doorgronden, vooral moet men er het voordeel van inzien. Ik doe maar een poging:

{{ voorbeeld zo moet het niet }}
[ check voorwaarde1 ] [actie1] [vertraag tijd 1]
[ check voorwaarde2 ] [actie2] [vertraag tijd 2]
...

{{ voorbeeld dit is beter }}
[check voorwaarde 1] [actie 1]
[check voorwaarde 2] [actie 2]
...
[vertraag (zoveel milli's als er nog overschieten)

Dirky

Met alle respect Karel maar daar leer ik niets mee bij.

Je schrijft enkele lijntjes uit een geheel waarnaar we allemaal moeten gissen wat het zou kunnen zijn. Dat zegt dus helemaal niets!

Schrijf eens een complete werkende sketch, desnoods voor "maar" 3 LEDjes, zodat we het geheel zien.

Karel A.J.

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.

Zeer opzettelijk wilde ik, nu we toch niet meer in het "eenvoudig"-draadje zitten, een aanzet geven tot eigen onderzoek.
Als ik ooit motivatie heb om hapklare brokken te posten dan zal ik dat wel in het "eenvoudig"-draadje doen - die opsplitsing is er niet zomaar gekomen. Want "eenvoudig" en "anders/beter" gaan niet zo licht samen.

gardevil

Citaat van: Dirky op 15 maart 2021, 16:59:47 PM
Met alle respect Karel maar daar leer ik niets mee bij.

Je schrijft enkele lijntjes uit een geheel waarnaar we allemaal moeten gissen wat het zou kunnen zijn. Dat zegt dus helemaal niets!

Schrijf eens een complete werkende sketch, desnoods voor "maar" 3 LEDjes, zodat we het geheel zien.
Dirky, sluit me hierbij volledig aan.

Als liefde blind is, waarom is lingerie dan zo belangrijk?

Dirky

'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"!

bollen neus

Bennekik content dak mi alleen mor schaokeleirtjes waerk, geen punthoofd en een zachte nachtrust. 8)
En gelukkig bennekik oak genen specialist.
Den Eric.