Is Arduino running – Er døren låst?

Is Arduino running – Er døren låst?

(For English version press American Flag on top of Sidebar)

En bekendt spurgte, om jeg kunne være behjælpelig. Han vil gerne sikre sig, at døren hos hans mor er låst, når hjemmeplejen forlader hendes bolig. Han har installeret en kontakt, som er sluttet, når døren er låst og brudt, når døren er ulåst. Resten skulle jeg klare. Noget elektronik, så han kan få besked om tingenes tilstand ved døren.

Nemt, tænkte jeg. Blynk og Nano, et par ledninger til kontakten og en lysdiode, hvis nu herligheden skal i en kasse. Så kan man se status for Power On. Fritzing diagrammet kan næsten ikke være simplere:

CheckDoor Fritzing

I Blynk-app’en en rød og en grøn LED-widget, samt en lcd-widget for at få lidt liv på skærmen. Der skal ikke meget kode til for at få det hele til at fungere. Med SimpleTimer og lidt hensigtsmæssig kode skulle det også være muligt kun at sende informationer, når noget ændrer sig. Heller ikke en uoverkommelig opgave.

Men så let skulle jeg ikke slippe om ved det. For app’en viser i sagens natur altid blot den seneste information, som er blevet sendt til den. Derfor er det vigtigt at vide, om sketchen kører ovre på Nano’en. Hvis den er gået i stå, er det der står på skærmen værdiløst. Og hvis man ikke ved, om Nano’en er gået i stå, så……. Jeg oplevede også, at når min telefon havde været i dvale, var min skærm ikke altid opdateret, når den kom til live igen. Så den simple løsning var ganske enkelt ikke brugbar, før der blev bygget noget sikkerhed ind i sketchen.

Alt i alt fik jeg indkredset tre forhold, som der skal tages højde for i koden, for at app’en er pålidelig og anvendelig:

  1. Løbende information om Arduino er aktiv eller ej
  2. Sikre at app’en er opdateret, hvis Arduino har været nede, nettet har været ned, app’en slukket eller har været på dvale.
  3. En indikator på hardwaresiden, så man kan se, om der er forbindelse til net og Blynk-server.

1. ‘Arduino er aktiv’ indikator.

Det kan laves med en ny LED-widget, som jeg har koblet op på virtual pin V31. For at vise, at der er liv i Nano, skal den virtuelle LED blinke. Det klares med disse to små funktioner:

Med SimpleTimer times de i på denne måde i setup():

Nu blinker min LED-widget, når Arduino kører. Hvis den ikke blinker, er det fordi forbindelsen til serveren er nede eller fordi min Arduino ikke kører. Så ved jeg, at jeg ikke kan stole på informationen på min skærm.

I sync eller ej?

Der findes forskellige måder at synkronisere på og jeg har forsøgt mig med en del af dem, som udviklerne bag Blynk anbefaler. Jeg har været omkring BLYNK_CONNECTED, syncAll() og syncVirtual(pin) men endte med blot at kalde min egen updateApp() funktion hver gang der er gået 30 sekunder. Ved samme lejlighed besluttede jeg, at der skal sendes en notifikation, når der sker ændringer. (Husk at give Blynk lov til at sende notifikationer til din smartphone!). Der kan højst sendes notifikationer hvert minut, så jeg valgte 90 sekunder for at være sikker på at få informationen frem. Igen sikrer SimpleTimer, at det sker:

Er Arduino connected?

Også her var jeg omkring forskellige løsninger men først efter at have læst koden i header-filerne Blynk.h og UIPEthernet.h fandt jeg en løsning. Jeg fandt frem til en PUBLIC metode, connected(), som kunne anvendes. Det blev skrevet sammen med mine tidligere blink-funktioner og ser således ud:

På CONNECT_PIN sidder min LED, som egentlig var tænkt som indikator for power on. Nu blinker den i stedet, når Arduino er i kontakt med Blynk-serveren. Hvis forbindelsen bliver afbrudt, blinker dioden stadig videre et lille stykke tid. I min opsætning kommer der 9-10 hjerteslag, inden den slukker helt.

CheckDoor Hardware

Blynk app

Som det ses ovenfor, har jeg følgende widgets i min app:

  • LED på V29 (rød)
  • LED på V30 (grøn)
  • LED på V31 (blå)
  • LCD på V1, – husk at sætte det til advanced mode
  • Notify-widget, husk at tillade, at Blynk sender notifikationer på din smartphone.

That’s it.


Hele koden kan hentes her:

gplv3-127x51

Leave a Reply

Your email address will not be published. Required fields are marked *