Go Down

Topic: Alarmsysteem (Read 218 times) previous topic - next topic

jmnijsse

Jun 17, 2016, 01:10 pm Last Edit: Jun 17, 2016, 01:20 pm by jmnijsse
Hallo,

Leerlingen willen een medicijndoosje ontwerpen, wat met verschillende alarmpjes (speakertje) laat horen dat je het medicijn in moet nemen.

Er zijn nogal wat eisen aan dat dingetje, vanwaar ik me afvraag hoe complex dat wordt.

Medicijn 1
Ligt op een een lichtsensor en móet elke 5 minuten (fictief :-)) ingenomen worden. Dus elke 5 minuten een signaal. Wordt het medicijn niet binnen x seconden ingenomen volgt er een luider/ander signaal totdat het medicijn van de lichtsensor is afgehaald.

Medicijn 2
Moet om de 2 minuten. Elke 2 minuten een ander (hoger/lager) signaal dan medicijn één, wat 30 sec. piept. Verder geen controle of het wel of niet ingenomen is.

Medicijn 3
Moet om de minuut. Elke minuut een ander (hoger/lager) signaal dan de andere medicijnen, wat 20 sec. piept. En hier ook verder geen controle.

Ze waren zelf al met delay's bezig, maar dat gaat natuurlijk niet werken.

Wat ik me afvraag:
- moeten ze elk medicijn een afzonderlijke tijdcontroleur meegeven? (dus de previous- en currenttime)
- op een gegeven moment zullen mogelijk verschillende piepjes samen gaan vallen. Dat lijkt me niet te werken. Moet dan elk medicijn een eigen buzzer hebben?
- kan de tone functie meerdere poorten tegelijk aansturen? Ik dacht het niet, maar weet even niet waarom niet.
- is het handig om voor elk medicijn een functie te maken?

Kortom: zelf overzie ik niet precies hoe de structuur van dit gebeuren er uit moet gaan zien. En of we niet wat eisen moeten laten vallen.

Groet,
Johan

Jantje

Dat lijkt me niet zo moeilijk.
Wat je nodig hebt is een hoop timers en 1 controller voor het geluid. Die kan dan (als er 2 geluiden ter zelfder tijd moeten afgespeeld worden gewoon het ene geluid na het andere afspelen (je kan toch ook moeilijk 2 pillen terzelfdertijd nemen he)
Delay is in deze absoluut uit den boze.
Met vriendelijke groet
Jantje
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

MAS3

Nou, als je elke minuut, én elke 2e minuut én elke 5e minuut een pilletje moet nemen, dat word het eerder een pillen trolley dan een doosje (ik weet dat het fictief en puur proof of concept is).

De licht sensor voor de pil is vermoedelijk niet de beste oplossing.
Ding is vermoedelijk mobiel en dan is de licht sensor niet echt handig.
Als je het principe van blink without delay() echt onder controle hebt, kun je dit best aan.
Anders is het een goede manier om dat juist onder controle te krijgen.
Dan ga je dus elke keer kijken of er al genoeg tijd verstreken is voor de verschillende evenementen.
Wanneer dat het geval is ga je voor dat ene evenement waarvoor dat zo is, een vlag zetten.
En vervolgens ga je kijken welke toontjes je buzzer allemaal moet gaan afspelen.
Bij het afspelen van de verschillende tonen ga je overigens niet anders te werk dan bij het bepalen welke pil er nu aan de beurt is.
En je kunt de tonen ook na elkaar laten afspelen en zelfs bepalen welke signalen er prioriteit hebben.
Het programmaatje gaat honderden zo niet duizenden malen per seconde een rondje maken als er geen delays inzitten.
Dan kun je veel meer dingen doen dan je dacht, terwijl ze toch niet zullen conflicteren.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

johan welk niveau hebben de leerlingen? en welk niveau heb je zelf?

persoonlijk zou ik er drie functies van maken, en binnen die functies met state werken. het is zeker goed te doen. tone is volgens mij blocking dus ze komen achter elkaar.
lichtsensor is een heel slimme oplossing.
in de setup:
timer1=millis();
en 2 en 3

dus in de loop komt eigenlijk staan:
functiemedicijn1
2 en 3
als voorbeeld een begin van medicijn1:
state statemedicijn1
10:
if millis()-timer1 > wachtmedicijn1 // dat is dan 5*60*1000
{ tone }
timer1=millis()
wachtmedicijn=5000
statemedicijn=20
break
20:
if millis()-timer1 > wachtmedicijn1 // dat is dan 5*1000
{ tone hoger }
timer1=millis()
wachtmedicijn=5000
statemedicijn=2
break
etc.
meer verklap ik niet, maar is gewoon een begin.

Opdrachten voor de leerlingen:
testen wat er gebeurt als er 2 tijden tegelijk klaar zijn (zet er een een milliseconde hoger dus bijv 5001)
gebruik 4 toonhoogten om te beginnen, en kijk eens wat DTMF is, (voor de volgende stap)zoek op arduino dtmf in de playground staat iets leuks.
zorg voor een reset knop dat alle tijden weer herbeginnen
gebruik de serial monitor om te zien wat er gebeurt, ofwel schrijf een serial print van elke state
zet in de loop een delay van 1000 neer dan kun je het volgen.

En zoals altijd je kunt hier wellicht vragen of er iemand een gastles wil geven (ligt vooral aan waar u zelf bent.




paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Tinkerspy

Wat ik me afvraag:
- moeten ze elk medicijn een afzonderlijke tijdcontroleur meegeven? (dus de previous- en currenttime)
- op een gegeven moment zullen mogelijk verschillende piepjes samen gaan vallen. Dat lijkt me niet te werken. Moet dan elk medicijn een eigen buzzer hebben?
- kan de tone functie meerdere poorten tegelijk aansturen? Ik dacht het niet, maar weet even niet waarom niet.
- is het handig om voor elk medicijn een functie te maken?

Kortom: zelf overzie ik niet precies hoe de structuur van dit gebeuren er uit moet gaan zien. En of we niet wat eisen moeten laten vallen.
Hi Johan,

De tone() functie kan inderdaad niet meerdere poorten tegelijk aansturen. Ik weet het want ik heb het geprobeerd bij het uittesten van mijn 'player' machine. Frere Jacques als canon zat er helaas niet in. Dat komt blijkbaar doordat de tone() functie een timer interrupt overneemt.

Je loopt tegen een van de hardnekkigste problemen van de Arduino-wereld aan. Meerdere functies en timers tegelijk programmeren wordt al snel heel onoverzichtelijk (ik weet het want ook dat heb ik geprobeerd).

Je zou kunnen overwegen je leerlingen mijn Automaton framework te laten gebruiken. Dat is event-based programmeren, waardoor de verschilllende problemen (de verschillende medicijnvakjes) helemaal apart geprogrammeerd kunnen worden. Als je ze klaar hebt kun je ze simpel samenvoegen.

Een introductie vind je hier: https://github.com/tinkerspy/Automaton/wiki/Introduction

Automaton staat deze maand op de tweede plaats van de Github 'trending' list voor Arduino wereldwijd.


Rgrdz,
Tinkerspy
Author of Automaton: Reactive State Machine framework for Arduino

nicoverduin

Ah je doet wel je best om het te promoten. Dus start nu gewoon een mooi topic erover. 
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Tinkerspy

Quote
Ah je doet wel je best om het te promoten. Dus start nu gewoon een mooi topic erover.
Ik snap echt het probleem niet.

Johan wil zijn leerlingen een probleem voorleggen en vraagt zich af of het misschien te complex wordt.

Volgens mij is het een prima voorbeeld van een probleem dat je beter 'event-driven' kunt oplossen en ja, daar heb ik inderdaad een mooie library voor gemaakt.

Een mooi topic ernaast lijkt mij een prima suggestie, zal ik zeker doen, maar het lijkt mij ook zeker relevant om in dit topic te melden.

Author of Automaton: Reactive State Machine framework for Arduino

shooter

ja en zo bedoelde nico het ook, maak reclame en leg uit in een niuew topic wat het is.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

jmnijsse

Allemaal bedankt voor de input. Ga het proberen te (laten) verwerken tot een werkend iets.

En nogmaals: ik ben de TOA bij Natuurkunde. Ik ben enthousiast over Arduino, doe er op school veel mee, maar heb verder geen informatica-achtergrond ofzo. Ik probeer de leerlingen ook enthousiast te maken en dat lukt aardig. Er zit er nu zelfs een een eigen library te schrijven voor een oledschermpje met een klok en alarm. Maar die heeft behoorlijk ervaring.
Probleem is dat ik altijd vrij 'oppervlakkig' met programmeer problemen bezig ben en vaak alleen inspring als zij er niet uitkomen, zoals nu.
Dus ik kan de code lezen, begrijp dat ook. Kan vaak ook voorbeeld sketches ombouwen tot eigen dingen. Maar om vanuit het niets iets op te zetten vind ik nog steeds erg lastig.
Vooral de vraag langs welke weg ga je het probleem oplossen. Dat is vaak verschillend.

Maar het millis() verhaal komt ondertussen steeds vaker terug, dus daar ga ik zeker aan werken om daar een goede basis sketch voor te maken, zodat we dat makkelijk kunnen implementeren en een eigen project.

Dus mijn vragen zijn vaak 'namens' de leerling. En zo kan het dus ook zijn dat het plotseling weer een poosje stil ligt, of omdat ze 't op een andere manier opgelost hebben, of omdat het project afgelopen is en ze de boel gelaten hebben voor wat het is.

Hartelijk dank voor de reacties.

Johan

jmnijsse

@shooter

Wat bedoel je precies met die state-functie?

als voorbeeld een begin van medicijn1:
Code: [Select]

state statemedicijn1
10:
if millis()-timer1 > wachtmedicijn1 // dat is dan 5*60*1000
{ tone }
timer1=millis()
wachtmedicijn=5000
statemedicijn=20
break


het lijkt een soort switch case, maar wat betekenen die 10: en die 20:?

shooter

een state heeft een nummer, en ik doe geen 1,2,3 maar 10,20,30 dan kan ik er altijd nog een aan toe voegen.
en ja dat moet natuurlijk met een switch case, (in mijn PLC heet het wel state.)

hiermee kun je mooie sequenties opbouwen.
of wel doe eerst dit, dan dat en afhankelijk van een uitkomst ga naar een andere functie etc.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy