Hamster kilometer teller

Hallo,

Ik ben bezig met het maken van een kilometerteller voor een hamsterwiel.
De afstand lukt wel maar ik loop vast tegen de snelheid.
Ik gebruik millis om de tijd te bepalen en een reed magneet sensor om de rondjes te bepalen.
Ik moet dus de tijd van de huidige ronde en de tijd van de ronder ervoor van elkaar aftrekkken. Dit tijdsverschil kan omgerekend worden in km/uur.

Mijn vraag is hoe ik de tijd van de ronde ervoor kan opvragen?

magneetsensor_en_led_tijd.ino (759 Bytes)

Ik zou die magneet sensor aan een interrupt hangen. Verplaats huidige millis naar vorige millis in de interrupt service routine. In de loop kan je dan altijd het verschil bepalen.
Let wel op dat beide millis getallen volatile unsigned long zijn of volatile uint32_t

die had je vorige ronde even in een variabele moeten zetten, als je dus een puls krijgt dan kijk je hoe lang het geduurd heeft door die variabele af te trekken van millis() en daarna op te slaan in dezelfde variabele.

Met 1 sensor kan je de richting niet bepalen. Met 2 reed contacten en 2 magneten, zo gepositioneerd dat de pulsen niet gelijk liggen maar wel overlappen, heb je een rotary encoder gebouwd. (Met 4 stappen per omwenteling: 3 hele kleine stapjes en 1 hele grote, maar dat maakt niet uit.)
Als je de richting weet, kan je ook het verschil uitmaken tussen draaien en heen-en-weer schommelen.

nicoverduin:
Let wel op dat beide millis getallen volatile unsigned long zijn of volatile uint32_t

En vergeet niet de interrupts (even) uit te zetten als je deze variabele leest aangezien uint32_t groter dan een word is (op meeste Arduino's) en dus niet in een keer gelezen kan worden (atomic).

Daarom is het volatile. Dan heb je daar geen last van.

Owwwwwww jawel :wink:

Volatile vertelt alleen de compiler om geen optimalisatie over een variabele te doen. Aangezien een flag die je alleen set vanuit een interrupt er in de normale flow uit ziet als een variabele die nooit geset wordt en de compiler kan deze dus weg optimaliseren met een constante. Mooie besparing toch?

Maar het doet niets met het niet atomic zijn van het benaderen van variabelen die groter dan een word zijn. Een interrupt kan nog steeds plaats vinden midden in het benaderen van een variabele. Dus, uitzetten die handel.

Zie Interrupts, the Ugly.

Goede tip!! Thx