Bygg en internetuppkopplad ­klocktermometer

Bygg en internetuppkopplad ­klocktermometer

Nu är det dags att dra nytta av allt som vi har lärt oss i tidigare kapitel och bygga en färdig slutprodukt.

Obs! Koden i detta kapitel är anpassad för hur webbtjänsten Thingspeak fungerar i skrivande stund. Funktionaliteten kan förändras med tiden. Wifi-modulen i detta kapitel har en firmware som koden också är anpassad för. Om tillverkaren av wifi-modulen ändrar i firmwaren kan koden behöva uppdateras.

Hårdvaran

Som avslutningsprojekt vill vi bygga en internetansluten klocktermometer. Den ska bestå av följande komponenter (utöver Arduino Uno):

  • en RTC-modul som håller koll på tiden och mäter temperaturen
  • en Neopixel-ring som visar tiden
  • ett servo som visar temperaturen
  • en wifi-modul som används för att ladda upp temperaturen till Thingspeak
  • en display som visar tiden, temperaturen och när Thingspeak uppdaterades.

Sättet som Neopixel-ringen visar tiden är snillrikt. Ringen består av 24 pixlar totalt. Varje enskild pixel på ringen kan med vår kod antingen vara avstängd, lysa blått, lysa rött eller lysa både blått och rött (d.v.s. violett).

På ringen indikeras en timme med två röda pixlar. För varje timme som går tänds ­ytterligare två röda pixlar. Så här ser ringen ut klockan tre (3.00 eller 15.00) och klockan fyra (4.00 eller 16.00). 

I takt med att minuterna tickar på tänds den blå delen av pixlarna. Pixlar som redan är röda blir violetta medan släckta pixlar blir blå.

Den hårdvarumässiga kopplingen av den internetuppkopplade klocktermometern kommer att se ut på följande vis.

Illustration gjord med komponenter från Fritzing (fritzing.org). CC BY-SA 3.0

Bibliotek

För att styra alla dessa komponenter krävs en uppsättning bibliotek. Vi kommer att använda följande bibliotek:

  • Adafruit Neopixel
  • Adafruit Ticoservo
  • RTC by Makuna
  • Software Serial
  • SSD1306Ascii (se installationsförfarande i Manuell biblioteksinstallation)
  • WifiEsp
  • Wire

Lägg märke till att vi i Visa text och grafik på displayer använde ett annat bibliotek för att uppdatera displayen (U8glib i stället för SSD1306Ascii). SSD1306Ascii är ett mindre bibliotek som inte kan användas till lika mycket. Det går exempelvis inte att rita bilder med det. Anledningen till att vi använder SSD1306Ascii i detta projekt är att källkoden är så omfattande att det stora U8glib-biblioteket inte får plats. 

Källkod

Vi inleder sketchen med att importera biblioteken och initiera konstanter för Neopixel-ringen, wifi-anslutningen och Thingspeak-anslutningen. Vi skapar nya objekt för displayen, Neopixel-ringen, RTC-modulen, anslutningsklienten och servot. Vi skapar även en extra seriell kommunikation för wifi-modulen och deklarerar ett gäng variabler som behövs för att hålla tiden och bestämma när information ska uppdateras. 

Del 1/9 av GrandFinale.ino

I setup-funktionen startar vi Oled-skärmen och förbereder en liten animation. När Arduinon startar upp ska det stå Starting. För varje steg i uppstartsprocessen som lyckas lägger vi till en punkt efter Starting. Det gör att vi får en bra översikt över hur långt vi har kommit i uppstartsprocessen om något går fel. 

Metoden som startar displayen har 0x3C som ett argument. Det är adressen som används för att kommunicera med displayen. Vi behövde inte ange den i Visa text och grafik på displayer eftersom det U8glib kunde söka upp displayen automatiskt.

I setup-funktionen startar vi också en seriell kommunikation med datorn för eventuellt behov av felsökning. Vi startar likaså servot, RTC-modulen, Neopixel-ringen och wifi-modulen. Vi avslutar setup-funktionen med att ansluta till vårt definierade trådlösa nätverk. 

Del 2/9 av GrandFinale.ino

I loop-funktionen ber vi om att få tiden uppdaterad av funktionen updateTime. Sedan undersöker vi hur lång tid det var sedan vi skickade data till Thingspeak. Om det var mer än 30 sekunder sedan skickar vi information igen.

Del 3/9 av GrandFinale.ino

Del 4/9 av GrandFinale.ino

UpdateTime-funktionen uppdaterar tiden och anropar uppdatering av Neopixel-ringen. Om klockan har slagit över till en ny minut uppdateras även displayen.

Del 5/9 av GrandFinale.ino

PrintOled-funktionen uppdaterar tiden och temperaturen som visas på displayen. Den skriver även ut när data senast skickades till Thingspeak.

Del 6/9 av GrandFinale.ino

SetTime-funktionen uppdaterar Neopixel-ringen.

Del 7/9 av GrandFinale.ino

UpdateTemp-funktionen uppdaterar temperaturen och mappar om värdena för att passa servots vridbana.

Del 8/9 av GrandFinale.ino

Den sista funktionen är printWifiStatus, vilken vi har använt tidigare (den används för felsökning).

Del 9/9 av GrandFinale.ino

Färdig

När koden är kompilerad och uppladdad är projektet klart. Därmed är denna introduktion till Arduino-elektronik och Arduino-programmering slut. Du som läsare har tagit dig hela vägen i mål. Bra jobbat!

Är du sugen på några riktiga utmaningar? Här är förslag på tre förbättringar som du kanske kan lägga till i sketchen.

  • Kan du få Neopixel-ringen att uppmärksamma klockslaget 13.37 varje dag (t.ex. genom att blinka)?
  • Kan du få Neopixel-ringen att lysa svagare under kvällen och natten (genom att sänka ljusstyrkan mellan specifika klockslag)?
  • Kan du få uppdateringen av Neopixel-ringen att ske på ett vackrare sätt (t.ex. genom att animera övergången mellan timmar)?

Lycka till!

Senast ändrad: 2017-02-28