Følgende er et tilpasset uddrag fra den kommende bog, Kom i gang med Intel Galileo.
Brug af Intel Galileo til netværksprojekter i hjemmet er en naturlig pasform. Med Arduino pin kompatibilitet, netværk og Linux er det en kraftfuld, men fleksibel bord. Da vi udforsker det tilsluttede hjem i denne uge, vil jeg gerne dele et Galileo-projekt, der passer til dette tema. Jeg tror, at det tilsluttede hjem ikke kun drejer om at skifte omskiftere og at få temperaturen, men det handler også om at vise information til beboeren.
Jeg har oprettet en simpel hjemmeside kaldet Hvor mange dage, indtil jeg kommer ud? som tjener et enkelt formål: det fortæller dig, hvor mange dage, indtil næste nummer af MAKE Magazine forventes at ramme aviskiosker. Dataene indlæses i en database af mig baseret på produktionskalendere, som jeg modtager som MAKE Bidragende redaktør. Den serveres af et gratis niveau i Google App Engine, og kildekoden til webstedet er tilgængelig på Github, hvis du vil se på, hvordan jeg lavede det.
Når du går til http://nextmakemagazine.appspot.com/ i din webbrowser, vil du se, at oplysningerne er formateret til at blive set og forstået af et menneske, men serveren er også konfigureret til at tale direkte til enkle mikrocontrollere ved at strippe væk al den ekstra stil og sprog og kun returnere antallet af timer, indtil næste nummer frigives. Du kan se dette, hvis du går til URL http://nextmakemagazine.appspot.com/simple
Din Galileo kan bruge sin internetforbindelse via Ethernet til at oprette forbindelse til denne webadresse, tage de data, den modtager, og evaluere, hvordan den skal vises. Lad os først sørge for, at den kan oprette forbindelse til serveren.
BEMÆRK: For dette projekt skal du starte op af Galileos SD-kortbillede, som du kan downloade her.
Hvis dit bestyrelse lykkedes at forbinde til en server, vil du se, at tekststart vises i den serielle skærm (som vist nedenfor). I dette eksempel programmeres din Galileo til at gøre en Google-søgning efter udtrykket "Arduino." Når HTML-svaret fra Googles server er modtaget, sender det disse tegn til Serial Monitor.
Nu hvor du er sikker på, at netværksforbindelsen virker, skal du få din Galileo til at oprette forbindelse til, hvor mange dage der kommer til at komme ud? server:
Hvis det fungerede, skal du se antallet af timer, indtil MAKE kommer ud trykt hvert femte sekund i serielt skærm.
void setup () {} void loop () {Serial.println (getHours ()); forsinkelse (5000); } int getHours () {char output [5]; system ("curl http://nextmakemagazine.appspot.com/simple> response.txt"); FIL * fp; fp = fopen ("response.txt", "r"); fgets (output, 5, fp); fclose (fp); returnere atoi (output); }
Den første ting du måske bemærker i koden ovenfor er, at loop-funktionen kun har to linjer kode. Forsinkelsen (5000) er, hvad der sikrer, at hver gentagelse af sløjfen kun sker hvert femte sekund. Men hvad med serial.println (getHours ()) ;? Den inderste funktion, getHours (), er faktisk defineret lige under loop-funktionen.
Den første linje i funktionsdefinitionen angiver, at vores funktion kaldes getHours og vil returnere et helt tal som følge heraf. Når funktionen kaldes fra opsætnings- eller sløjfefunktionerne, udføres koden inde i funktionen. For getHours vil den bede om data fra serveren, gemme svaret i en fil og derefter læse filen og returnere en heltalværdi, der repræsenterer det antal timer, du skal vente, indtil et nyt udgave af MAKE er tilgængeligt.
Med Linux-kommandoen skal du skrive dataene til en fil og derefter have Arduino-skitsen læs den fil, der kun er en måde, så du kan få data i din skitse. Jeg var sikker på at vise denne unikke Galileo-funktion, fordi det er en effektiv måde at forbinde forskellige dele af et projekt sammen, da der er så mange måder at læse og skrive filer på.
Der er en anden interessant ting, der foregår i den kode. Lad os sige, at serveren sendte et svar på 45. Det sender faktisk to ASCII-tegn, en 4 og en 5. Når Arduino læser disse tegn, vil den ikke forstå dem som heltalet 45, men snarere to byte, der repræsenterer tegnene 4 og 5. Dette betyder, at hvis du skal lave matematik med værdien, skal du konvertere dem til et helt tal. Det er hvad funktionen atoi () er til. Det vil se på rækken af tegn og udgive deres værdi som et helt tal, som du kan bruge til aritmetik.
Hvor mange dage indtil der kommer ud? server gør ovenstående eksempel ret nemt, fordi det leverer et enkelt stykke data. Andre tjenester kan give et par forskellige stykker data struktureret i et format kaldet JSON, eller JavaScript-objekt notation.
JSON er blevet standardformatet til overførsel af strukturerede data via internettet. Hvis du vil kunne læse data fra et websted, der tilbyder JSON, skal du analysere det. Da dette ville være svært at gøre med Arduino-koden, kan du bruge andre sprog til at gøre dette job og videregive de relevante oplysninger til Arduino kode.
For at forhåndsvise JSON-data kan du besøge http://nextmakemagazine.appspot.com/json i din webbrowser.
{totalTimer: 1473, volumenNumber: "38", daysAway: 61}
Svaret vil sandsynligvis være sammen på en linje, men hvis du skulle tilføje linjeskift og indrykning, ville det ligne eksemplet ovenfor. Der er tre nøgle / værdi par: antal timer indtil næste nummer, næste volumen nummer og antal dage indtil næste nummer.
Koden nedenfor bruger Python programmeringssprog for at oprette forbindelse til serverens JSON-feed på http://nextmakemagazine.appspot.com/json og analyserer volumennummeret og antallet af timer.
Import json import urllib2 httpResponse = urllib2.urlopen ('http://nextmakemagazine.appspot.com/json') jsonString = httpResponse.read () jsonData = json.loads (jsonString) Udskriv "Volume", jsonData ['volumeNumber'] , "vil blive frigivet i", jsonData ['totalHours'], "hours."
# cd / home / root /
# vi json-parse.py
# python json-parse.py
Hvis du har alt rigtigt, skal du se følgende output på kommandolinjen:
Volumen 38 vil blive frigivet i 1473.0 timer.
Som du kan se fra eksemplet ovenfor, er det ikke særlig svært at analysere JSON-responsen fra et websted, når du har Python tilgængelig for dig på Galileo. Nu skal du blot forbinde svaret fra Python til din Arduino kode.
For at prøve det nu skal du først ændre json-parse.py:
# cd / home / root /
# vi json-parse.py
import json import urllib2 httpResponse = urllib2.urlopen ('http://nextmakemagazine.appspot.com/json') jsonString = httpResponse.read () jsonData = json.loads (jsonString) udskriv jsonData ['daysAway']
void setup () {} void loop () {Serial.println (getDays ()); forsinkelse (5000); } int getDays () {char output [5]; system ("python /home/root/json-parse.py> /response.txt"); FIL * fp; fp = fopen ("response.txt", "r"); fgets (output, 5, fp); fclose (fp); returnere atoi (output); }
Nu skal du se svaret fra serveren som antallet af dage, indtil næste udgave af MAKE kommer ud.
Hvor gode er disse oplysninger, hvis det kun kan ses i serielt skærm? Lad os tilslutte et LCD display til at udskrive disse oplysninger.
Ud over de dele, du har brugt, skal du også:
Sådan forbinder du LCD-skærmen med Galileo:
#omfatte
Nu kan du nemt holde tabs på, når næste nummer af MAKE vil ramme aviskiosker! Hold øje med udgivelsen af Kom godt i gang med Intel Galileo til flere netværkstilsluttede Galileo-projekter!