Natur Tracker: mappningen med Intel Edison (3 / 7 steg)
Steg 3: kodning
All kodning i detta instructable gjordes av min medarbetare på detta projekt: dennishore, python guru och elektronik entusiast. Jag kommer att vända saker till honom för detta steg och steg 6: rapport. Han har har gått med på att besvara frågor och all kod i slutet av detta steg och steg 6.
Sensorer och anslutningar
Grove temperaturgivare - AI0
Grove roterande potentiometer - AI1
Grove ljussensor - AI2
Grove ljud sensor - AI3
Grove 16 x 2 LCD-display - I2C bussen
Grove LED - digital 2
Grove knapp - digital 3
Grove Summer - digital 4
Grove GPS - UART
GPS kommunicerar som en seriell enhet. Grove GPS sida (som sidan likvärdiga för alla Grove sensorer) har en Arduino och en Raspberry Pi del. För andra sensorer, jag hade en bra gissning om hur man gör det på Edison utifrån anslutning från avsnittet Arduino och kommandon baserat på Raspberry Pi python moduler. Men detta skilde sig för GPS. För tydlighetens skull är det uppdaterade SIM28 GPS-modulen. I slutändan, det fungerar anslutna till UART på Grove skölden och initieras:
UART = mraa. UART(0)
ser = följetong. Serial(UART.getDevicePath(), 9600)
SIM28 specifikationer har angett att starta upp tid kan vara så kort som en sekund (varma och internet hjälp), eller så länge som 32 s (kallt och utan internet). Den mest utmanande (pågående) delen av detta projekt har varit att felsöka vad är en (1) GPS fel, (2) seriell port läst fel, (3) GPS-data parsning problem. Parsning görs för närvarande med modulen pymnea2. Den kompletta initieringsrutinen är
Temp = mraa. AIO(0)
kruka = mraa. AIO(1)
ljus = mraa. AIO(2)
ljud = mraa. AIO(3)
Visa = lcd. Jhd1313m1 (0, 0x3E, 0x62)
display.setColor (100, 0, 0)
LED = mraa. Gpio(2)
LED.dir (mraa. DIR_OUT)
knappen = mraa. Gpio(3)
summern = mraa. Gpio(4)
BUZZER.dir (mraa. DIR_OUT)
B = 3975.
UART = mraa. UART(0)
ser = följetong. Serial(UART.getDevicePath(), 9600)
typer = "turdstool röksvamp logOysters deathcap fungweed minishrooms'.split()
Discovery = {}
för t i typer:
Discovery [t] = 0
Detta omfattar definition av kategorier. Eftersom vi använder roterande potentiometer Grove (och inte en rotationsencoder), har vi begränsat vinkelformig upplösning. Sex kategorier kan enkelt väljas på LCD-skärmen genom att vrida vredet, men vi kunde sannolikt hysa upp till ~ 15 utan att ha valen vara för nära varandra. Koden sedan försöker en inledande GPS fix:
fixa = False
attemps = 0
medan fix == False:
försök:
gpsTime, lat, lon, framtidsforskare, nsats = getGpsData()
testa = '%8 .4f' % float(lat) # får jobbet gjort
fixa = sant
skärmen ('natureTracker', ' ver 0.1')
BUZZER.write(1)
Time.Sleep(.1)
BUZZER.write(0)
Time.Sleep(3)
utom:
skärmen ("initiera GPS", "%d sats... %d ' % (nsats, attemps))
Time.Sleep(5)
attemps += 1
Oändlig loop är bruten när data från mer än två satelliter returneras. Framgång är ett mått av tolkning av latitude datan i en flottör. Underlåtenhet att göra detta kan tyda på olika typer av GPS fel, inklusive seriell kommunikationsfel. När en fix har fastställts, används aktuell tid för systemet att initiera loggfilen:
inledande = datetime.datetime.now()
Core algoritmen är då:
# händelse röstningen
Jag = 0
samtidigt sant:
# scan för tryck på knapp
plockade = pick(pot.read())
om button.read():
Discovery [tog] + = 1
# uppdatering display
skärmen (plockade,'> %s' % discovery[picked])
# uppdateringsloggen
om jag > 10:
data = getData()
recordData (data, discovery)
Jag = 0
# spenslig försening
Time.Sleep(0.5)
Jag + = 1
Halv-sekunders fördröjning ger viss stabilitet för att registrera knappen tryck på händelserna, utan ett finare sätt att avvisa flera tryck på händelser. Detta fungerar också som tiden bas för inspelning av data, för närvarande inställd 10 gånger detta mellanrum (ca var 5 sekunder). Detaljer för plockning, skärmen, getData och recordData funktioner kan ses i den fullständiga koden bifogas i slutet av detta avsnitt.
För tillfället LED vändna av/blinkar när det förlorar sin GPS-fix, eller om antalet satelliter sjunker under 2. Under dessa tider är det fortfarande möjligt att registrera fältdata med alla sensorer utom GPS, dvs inte latitud, longitud och höjd för de datapunkterna. Tabellen Sammanfattning produceras från utdata visar hjälpmedel för data, med hänsyn till om höjd var tillgängliga eller inte. Genom att observera staten LED innan du registrerar data, ger detta möjlighet att vänta (ibland bara några sekunder) för att få GPS-data tillgängliga. Naturligtvis visas datapunkter utan GPS inte på kartan.
Fullständiga koden är länkade nedan.
Starta automatiskt vid uppstart (huvudlösa)
Eftersom vi kräver data collection programmet ska starta så snart makten är ansluten (och starta om om vi måste byta batterier i fältet), kräver vi att python programmet startar på när Edison klar dess startsekvensen.
Cat /etc/init.d/go.sh
#! / usr/bin/env sh
python natureTracker.py
chmod + x go.sh
uppdatera-rc.d go.sh försummelsen