Bygge et internettilkoblet klokketermometer

Bygge et internettilkoblet klokketermometer

Nå er det på tide å dra nytte av alt vi har lært oss i tidligere kapitler, og bygge et ferdig sluttprodukt.

Obs! Koden i dette kapittelet er tilpasset til hvordan nettjenesten Thingspeak fungerer i skrivende stund. Funksjonaliteten kan bli endret over tid. Wifi-modulen i dette kapittelet har en fastvare som koden også er tilpasset til. Hvis produsenten av wifi-modulen gjør endringer i fastvaren, må koden kanskje oppdateres. 

Maskinvaren

Som avslutningsprosjekt skal vi bygge et internettilkoblet klokketermometer. Det skal bestå av følgende komponenter (i tillegg til Arduino Uno):

  • en RTC-modul som holder rede på tiden og måler temperaturen
  • en Neopixel-ring som viser tiden
  • en servo som viser temperaturen
  • en wifi-modul som brukes til å laste opp temperaturen til Thingspeak
  • et display som viser tiden, temperaturen og når Thingspeak ble oppdatert.

Måten Neopixel-ringen viser tiden på, er ganske snedig. Ringen består av 24 piksler totalt. Hver piksel på ringen kan med vår kode enten være slått av, lyse blått, lyse rødt eller lyse både blått og rødt (dvs. fiolett).

På ringen indikeres en time med to røde piksler. For hver time som går, tennes ytterligere to røde piksler. Slik ser ringen ut klokken tre (03.00 eller 15.00) og klokken fire (04.00 eller 16.00).

I takt med at minuttene tikker fremover, tennes den blå delen av pikslene. Piksler som allerede er røde, blir fiolette, mens slukkede piksler blir blå.

Maskinvarekoblingen av det internettilkoblede klokketermometeret vil se slik ut:

Illustrasjon laget med komponenter fra Fritzing (fritzing.org). CC BY-SA 3.0

Bibliotek

For å styre alle disse komponentene kreves flere biblioteker. Vi bruker følgende biblioteker:

  • Adafruit Neopixel
  • Adafruit Ticoservo
  • RTC by Makuna
  • Software Serial
  • SSD1306Ascii (se installasjonsprosedyre i Manuell biblioteksinstallasjon)
  • WifiEsp
  • Wire

Legg merke til at vi i Vise tekst og grafikk på displayer brukte et annet bibliotek til å oppdatere (U8glib i stedet for SSD1306Ascii). SSD1306Ascii er et mindre bibliotek som ikke kan brukes til like mye. Du kan for eksempel ikke tegne bilder med det. Grunnen til at vi bruker SSD1306Ascii i dette prosjektet, er at kildekoden er så omfattende at det store U8glib-biblioteket ikke får plass. 

Kildekode

Vi innleder skissen med å importere bibliotekene og initiere konstanter for Neopixel-ringen, wifi-tilkoblingen og Thingspeak-tilkoblingen. Vi lager nye objekter for displayet, Neopixel-ringen, RTC-modulen, tilkoblingsklienten og servoen. Vi lager også en ekstra seriell kommunikasjon for wifi-modulen og deklarerer en gruppe med variabler som er nødvendige for å holde rede på tiden og bestemme når informasjon skal oppdateres.

Del 1/9 av GrandFinale.ino

I setup-funksjonen starter vi OLED-skjermen og forbereder en liten animasjon. Når Arduinoen starter opp, skal det stå Starting. For hvert trinn som utføres i oppstartsprosessen, legger vi til et punkt etter Starting. Det gjør at vi får god oversikt over hvor langt vi har kommet i oppstartsprosessen hvis noe går galt.

Metoden som starter displayet, har 0x3C som et argument. Det er adressen som brukes til å kommunisere med displayet. Vi trengte ikke å angi den i Vise tekst og grafikk på displayer, ettersom U8glib kunne søke opp displayet automatisk.

I setup-funksjonen starter vi også en seriell kommunikasjon med datamaskinen for eventuelt behov for feilsøking. Vi starter også servoen, RTC-modulen, Neopixel-ringen og wifi-modulen. Vi avslutter setup-funksjonen med å koble oss til vårt definerte trådløse nettverk.

Del 2/9 av GrandFinale.ino

I loop-funksjonen ber vi om å få tiden oppdatert av funksjonen updateTime. Deretter sjekker vi hvor lang tid det var siden vi sendte data til Thingspeak. Hvis det var for mer enn 30 sekunder siden, sender vi informasjon på nytt.

Del 3/9 av GrandFinale.ino

Del 4/9 av GrandFinale.ino

UpdateTime-funksjonen oppdaterer tiden og kaller opp oppdatering av Neopixel-ringen. Hvis klokken har slått over i et nytt minutt, oppdateres displayet også.

Del 5/9 av GrandFinale.ino

PrintOled-funksjonen oppdaterer tiden og temperaturen som vises på displayet. Den skriver også ut når data sist ble sendt til Thingspeak.

Del 6/9 av GrandFinale.ino

SetTime-funksjonen oppdaterer Neopixel-ringen.

Del 7/9 av GrandFinale.ino

UpdateTemp-funksjonen oppdaterer temperaturen og tilpasser verdiene til servoens rotasjonsområde.

Del 8/9 av GrandFinale.ino

Den siste funksjonen er printWifiStatus, som vi har brukt tidligere (den ble brukt til feilsøking).

Del 9/9 av GrandFinale.ino

Ferdig

Når koden er kompilert og lastet opp, er prosjektet klart. Dermed er denne introduksjonen til Arduino-elektronikk og Arduino-programmering slutt. Du som leser har kommet helt i mål. Bra jobbet!

Har du lyst på noen skikkelige utfordringer? Her er tre forslag til forbedringer som du kanskje kan legge til i skissen.

  • Kan du få Neopixel-ringen til å observere klokkeslettet 13.37 hver dag (for eksempel ved å blinke)?
  • Kan du få Neopixel-ringen til å lyse svakere om kvelden og natten (ved å senke lysstyrken mellom spesifikke klokkeslett)?
  • Kan du få oppdateringen av Neopixel-ringen til å skje på en flottere måte (for eksempel ved å animere overgangen mellom timer)?

Lykke til!

Sist endret: 2017-09-08