Doel:€250.00
Donaties:€90.00

Per saldo:€-160.00

Steun ons nu!

Laatst bijgewerkt
op 15-02-2019
Algemeen

De stichting

Recente berichten

"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door St00mboy
Vandaag om 23:01:51
Artitec / REE 1300 de eerste foto' s door ZwolsBas
Vandaag om 22:59:14
01TREFF Maarn, 16 &17 februari door Martin Welberg
Vandaag om 22:57:59
Digikeijs DR4088RB-CS geeft kortsluiting bij bezetmelding in Rocrail. door San-Markos
Vandaag om 22:52:07
Een Elotrains 1500 zelf bouwen uit parts door duikeend
Vandaag om 22:51:22
's-Heer Heinkenspolder door Niekleair
Vandaag om 22:49:35
Oersik etsplaat spoor 0, bouwverslag door ronald1956
Vandaag om 22:47:52
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
Vandaag om 22:47:27
Nieuwe versie van 6400 van Rocky Rail, zonder radiologo;) door Bartje81
Vandaag om 22:45:05
Projekt 083-338 door Hlv53
Vandaag om 22:44:25
Sluiting traject Geldermalsen-Elst? door Modellbahnwagen
Vandaag om 22:40:00
NS 5500 / HSM 700 spoor 0 / 1 door roadster36
Vandaag om 22:23:54
M.s.v. De Percee bouwt aan nieuwe clubbaan door J. Moors
Vandaag om 22:20:50
Kappen DH1 Wadloper door Chris
Vandaag om 22:14:26
Toon hier je nieuwe (model-) spooraanwinst(en)... door Jelmer
Vandaag om 22:11:27
Een Biertrein in schaal G door Jan-Peter
Vandaag om 22:09:09
Onlangs gespot - gefotografeerd, de foto's door Erjen89
Vandaag om 21:52:17
Mijn eerste H0 modeltreinbaan in aanbouw door Wim Vink
Vandaag om 21:46:02
Pfarrerwinkel bahn door Jelmer
Vandaag om 21:33:46
NS modelbaan Hoekdam H0 door Eric B
Vandaag om 21:27:13
Cushman Oregon, voorheen Project Unnamed door Ronald Halma
Vandaag om 21:03:02
Even voorstellen / tips voor niet-vaste baan door SpoorJijWel
Vandaag om 20:53:08
Fleischmann "Prima-Lux" constante treinverlichting door Calimero
Vandaag om 20:48:59
Lelijk eendje ontwaakt.......'FYRA' op Italiaanse sporen.. door Thom
Vandaag om 20:33:13
EC2 'Rembrandt' door VictorPM
Vandaag om 19:57:34
3D/RM: HTM 21-101 - De Ombouwer door Henk Boshuyzen
Vandaag om 19:10:18
Modelspoorbeurs in Emmen, 2 maart 2019, Fletcher hotel door Ric
Vandaag om 19:01:01
Kortkoppelmechanieken, welke alternatieven? door Sander.
Vandaag om 18:30:50
Schwarzwald boerderij door Wim Vink
Vandaag om 18:22:18
Geluiden op de baan :) door duikeend
Vandaag om 17:44:29
  

Auteur Topic: Pret met Arduino  (gelezen 5897 keer)

PieterHa

  • Offline Offline
  • Berichten: 35
Re: Pret met Arduino
« Reactie #60 Gepost op: 11 februari 2019, 09:59:43 »

PreviousMillis heeft hetzelfde probleem met de overflow als de verkeerde variabele definitie wordt toegepast. In beide codes worden de verstreken aantal millis bijgehouden.

Groeten, Pieter
« Laatst bewerkt op: 11 februari 2019, 12:25:18 door Bert van Gelder »

Jeroen Vreeken

  • Offline Offline
  • Berichten: 208
Re: Pret met Arduino
« Reactie #61 Gepost op: 11 februari 2019, 11:29:27 »
Nee, het werkt wel aangezien millies en previousmillis allebei overflowen op 32bit. Door ze eerst van elkaar af te trekken krijg je echt het verschil.
Wanneer je echter eerst de nieuwe waarde uit rekent (deze krijgt een overflow) en vergelijkt met de actuele millis waarde (heeft nog geen overflow) gaat de timer te vroeg af.

Stel millis (en onze variabele) zijn maar 4 bit en overflowen van 15 terug naar 0.
Als je nu op tijdstip 13 een timeout van 5 wilt, dan krijg je het volgende:

millies previous delta
13 13 0
14 13 1
15 13 2
0   13 (-13 maar bij een 4 bit type underflowed dat naar:)3
1   13 (-12 ) 4
2   13 (-11) 5
En dan gaat je alarm af

Had je het vergeleken op de foute manier: en eerst timeout berekend krijg je dit:
millis timeout
13  5
En deze gaat dus onmiddelijk af want millis is duidelijk groter dan timeout.

PieterHa

  • Offline Offline
  • Berichten: 35
Re: Pret met Arduino
« Reactie #62 Gepost op: 11 februari 2019, 11:42:11 »

Bedankt voor de uitleg.

Groeten, Pieter
« Laatst bewerkt op: 11 februari 2019, 12:25:40 door Bert van Gelder »

Bert van Gelder

  • Team forummoderators
  • Offline Offline
  • Berichten: 3296
Re: Pret met Arduino
« Reactie #63 Gepost op: 11 februari 2019, 12:27:04 »
Pieter,

Vriendelijk verzoek om niet op de CITAAT-knop te drukken als je wilt reageren op het laatste bericht. Want daarmee kopieer je dat laatste bericht in jouw bericht, en staan dus alle berichten dubbel op het forum. Gebruik daarvoor in de plaats de REAGEER-knop.

Met dank!

Gr, Bert
Team moderatoren

bask185

  • Offline Offline
  • Berichten: 117
Re: Pret met Arduino
« Reactie #64 Gepost op: 11 februari 2019, 13:18:32 »
2^32 / (1000 x 60 x 60 x 24) = 49,7 dagen voordat millis() overflowt.

Voor de eind gebruikers, de arduino beginnelingen, is de overflow niet erg relevant, maar ben het wel eens dat je het beter meteen goed kan aanleren.

Een nadeel van millis() is dat je hem nooit kan resetten. Althans niet zonder een functie aan de arduino sourcecode toe te voegen.
Een andere mogelijkheid is een functie te maken die continu checkt of millis() van waarde verandert en daar op in te spelen.


void updateTimers()    // continu in void loop aanroepen
{
  if(millis() != previousMillis) {   // als millis() is veranderd
    previousMillis = millis() ;

    counter1++;                         // hoog 3 counters op die je vrij kan gebruiken in je programma.
    counter2++;
    counter3++;
}

Nu kan je counter1 t/m counter3 gebruiken om je timing dingen te regelen. En je kan er nog meer bijmaken ook.
Als je een van deze counters wilt gebruiken, zet je hem op nul en dan wacht je af wanneer hij groter of gelijk is dan een bepaalde waarde.

In mijn werk software maak ik gebruik van downcounters, structs en arrays en lijkt op:
void updateTimers()
{
  if(millis() != previousMillis) {   // als millis() is veranderd
    previousMillis = millis() ;

    for(int i = 0; i < nCounters; i++){
      if(counter[i].isActive == 1) {     // als counter aanstaat
        if(counter[i].interval > 0) counter[i].interval--;   // decrementeer interval als hij groter is dan 0
        if(counter[i] == 0) {                                         // als interval 0 is
          counter.func();                                                // voer de functie uit
          counter[i].interval = counter[i].reload;              // laadt een nieuwe waarde in interval
        }
      }
    }
  }
}

// dan bedien ik ze met
start(COUNTER1, foo, 500);    // functie foo() wordt nu elke 0,5s uitgevoerd   COUNTER1 is een #define als index voor het struct arrray
// en
stop(COUNTER1);             // stopt de functies         
/*
Toevoegend maak ik ook nog gebruik van een simpel up countertje, is gewoon rete handig
*/

Als je het echt goed wilt doen, wordt de code misschien te ingewikkeld voor de 'intented users'. De volgende stap zou zijn om een array van structs aan te maken ongeveer zoals ik laat zien. Maar voor de doelgroep is mijn 1e voorbeeld misschien praktischer omwille de simpelheid.

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4306
Re: Pret met Arduino
« Reactie #65 Gepost op: 11 februari 2019, 13:33:30 »
@Jeroen Vreeken, bedank, inderdaad dat (y)

Een nadeel van millis() is dat je hem nooit kan resetten.
Waarom zou je dat willen ??? Dan ben je allemaal extra variabelen aan het aanmaken die hetzelfde doen als millis()... Waardoor je elke tik tig variabelen moet aanpassen en previousMillis bijhouden. Kan je het net zo goed direct van millis() afleiden.

En ja, je kunt er strucs of objecten voor maken. Laatste zijn genoeg libraries voor te vinden. Niet allemaal even goed maar idee is duidelijk ;D


Timo
Verzonden vanaf mijn desktop met Firefox

bask185

  • Offline Offline
  • Berichten: 117
Re: Pret met Arduino
« Reactie #66 Gepost op: 12 februari 2019, 08:17:54 »
Goed voor die counter kan je makkelijk array maken icm met constantes. Met 2kb ram heb je toch genoeg geheugen. Ik vind het voordeel van deze counters dat je ook unsigned int kan gebruiken als je process korter is dan 65 seconden en je hebt nooit last van overflows.

Ik vind het namelijk zelf overkill om een unsigned long te gebruiken per knipper functie. Die atmega is ook maar een 8 bit microcontroller. En ik ben zelf sws tegen het gebruik van time stamps zoals we die icm millis() gebruiken.

Maar even iets anders.  Ik bedacht me opeens dat het voor de gemiddelde modelbouwer die met arduino wat lichtjes laat knipperen een resolutie van 1ms misschien een beetje overkill is. Dus ik zat na te denken en schreef dit ff:

bool PIGS_CAN_FLY = true;
byte counter;

void updateTimers()
{
if(PIGS_CAN_FLY) {
if(millis() & NINTH_BIT_MASK){
PIGS_CAN_FLY = false;
}
}

else {
if((millis() & NINTH_BIT_MASK) == 0){
PIGS_CAN_FLY = true;
counter++;                     // elke 1024ms wordt counter opgehoogd
}
}
}

Ik heb het niet getest, maar het zou volgens mij moeten werken ???. Ik test telkens het 9e bitje van millis(). Deze klapt elke 512ms om. Met de boolean PIGS_CAN_FLY zorg ik er alleen voor dat ik op de neergaande 'puls' van dat bitje een of meerdere counters in/de-crementeren. Dat gebeurt elke 1024ms.

Voordelen zijn dat je geen unsigned long variabelen meer hoeft te gebruiken. Je kan je counter(s) met bytes uit kan voeren voor processen niet langer dan ~262 secondes. (256*1024/1000). Je kan ook andere bits testen voor nog grotere intervallen zoals een dag/nacht overgang.

Nadeel is dat je niet op precies een seconde zit.

Beste blijft nog altijd wat ik eerder zei, maak je eigen library of kies er een uit! Dan is de eindgebruiker het beste af.
Die code die ik nu uitpoep is misschien ook te ingewikkeld voor de doelgroep.

Waar je nu nog steeds mee zit, is dat je void loop nu blijft groeien met 5 regels voor elke knipperende led.

Als we nu met les 14 leren hoe functies werken...  (y) (y) (y)  :angel:

Bas

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4306
Re: Pret met Arduino
« Reactie #67 Gepost op: 12 februari 2019, 08:54:56 »
Goed voor die counter kan je makkelijk array maken icm met constantes. Met 2kb ram heb je toch genoeg geheugen. Ik vind het voordeel van deze counters dat je ook unsigned int kan gebruiken als je process korter is dan 65 seconden en je hebt nooit last van overflows.
Grappig, meeste mensen vinden 2k juist weinig ;D Maar ook zonder counters kan je prima uint16 gebruiken ;) En overflows zijn niets slechts ::)

Beste blijft nog altijd wat ik eerder zei, maak je eigen library of kies er een uit! Dan is de eindgebruiker het beste af.
Zoek dan wel een goede. Er zijn namelijk heeeel veel tenenkrommende slechte timing libraries. Maar aan de andere kant, denk eigenlijk niet dat de doelgroep er beter af mee is. Timing en het niet blokkeren / uit zijn neus laten vreten van de processor is een van de meest essentiële aspecten als je mensen microcontrollers wilt laten programmeren. En denken in een continue flow blijkt één van de meest voorkomende problemen op het Arduino forum. En mensen de klok kijken analogie geven werkt meestal aardig goed.


Timo

PS Geen persoonlijke kritiek! Gewoon hoe ik het ervaar / over denk. Wil hier geen wellus-nietus discussie / ruzie :police:
« Laatst bewerkt op: 12 februari 2019, 08:59:37 door Timo »
Verzonden vanaf mijn desktop met Firefox

meino

  • Offline Offline
  • Berichten: 337
Re: Pret met Arduino
« Reactie #68 Gepost op: 12 februari 2019, 12:33:17 »
Stel millis (en onze variabele) zijn maar 4 bit en overflowen van 15 terug naar 0.
Als je nu op tijdstip 13 een timeout van 5 wilt, dan krijg je het volgende:

millies previous delta
13 13 0
14 13 1
15 13 2
0   13 (-13 maar bij een 4 bit type underflowed dat naar:)3
....

Misschien had je ook even moeten vermelden dat dit werkt omdat millis() een unsigned long retourneert. Dat is erg essentieel, voor ons, gepokt en gemazeld, - is dat vanzelfsprekend. Maar voor degenen waarvoor dit bedoeld is, is dat waarschijnlijk niet zo vanzelfsprekend.

Groet Meino
 
A clean desk is a sign of an empty mind

RudyB

  • Offline Offline
  • Berichten: 494
  • EMV
    • RudysModelRailway
Pret met Arduino 14 Day Night Cycle with millis(), no Delay, Direct Feedback
« Reactie #69 Gepost op: 14 februari 2019, 10:32:09 »
Nu we in video 13 gezien hebben hoe we de delay() kunnen vervangen door de millis() klok krijgen we directe on screen feedback wanneer de cycle time door de gebruiker wordt aangepast. Ook zal de cycle nu direct stoppen en het licht uigaan wanneer de aan/uit schakelaar op uit gezet wordt.

We kunnen we onze Automatische Dag Nacht Verlichting Unit nu afronden. Voor het feit dat we pas gestart zijn met Arduino heeft onze unit heel aardige specificaties:
- Configureerbare timing, keyboard of analoog in, met on screen display
- Een optie om random tijd toe te voegen om het wat 'levendiger' te maken
- On screen weergave van de aan/uit en dag/nacht status met de actuele cyclustijd.

Link naar Fun with Arduino 14 Day Night Cycle with millis(), no Delay, Direct Feedback