Stap 3: codering
Alle codering in dit instructable werd gedaan door mijn medewerker aan dit project: dennishore, python goeroe en elektronica liefhebber. I 'm gonna dingen omdraaien om hem voor deze stap en stap 6: verslag. Hij heeft afgesproken om vragen te beantwoorden en alle code aan het eind van deze stap en stap 6 heeft geplaatst.
Sensors en verbindingen
Grove temperatuursensor - AI0
Grove roterende potentiometer - AI1
Grove lichtsensor - AI2
Grove correcte sensor - AI3
Grove 16 x 2 LCD display - I2C bus
Grove LED - digitale 2
Grove knop - digitale 3
Grove zoemer - digitale 4
Grove GPS - UART
De GPS communiceert als een seriële apparaat. De Grove GPS pagina (zoals de overeenkomende pagina voor alle Grove sensoren) heeft een Arduino en een sectie van de Raspberry Pi. Voor de andere sensoren, had ik een goede gok als hoe het te doen op de Edison op basis van de connectiviteit van de sectie van de Arduino en de opdrachten op basis van de Raspberry Pi python modules. Maar dit verschilde voor de GPS. Voor de duidelijkheid is het de bijgewerkte SIM28 GPS-module. Op het einde, het werkt verbonden met UART op de Grove schild, en wordt geïnitialiseerd met:
De specificaties van de SIM28 staat dat de opstart tijd als het kort als één seconde (warm en met hulp van het internet), of zolang als 32 worden kan s (koud en zonder internet). De meest uitdagende (lopend) deel van dit project is om te debuggen wat is een (1) GPS-fout, (2) seriële poort leesfout, (3) GPS data parsing probleem. Parsing gebeurt momenteel met de pymnea2 module. De volledige initialisatie routine is
Dit omvat de definitie van de categorieën. Omdat we gebruik maakt van de Grove roterende potentiometer (en niet een roterende encoder), hebben we beperkte hoekige resolutie. Zes categorieën zijn gemakkelijk instelbaar op het LCD display door het draaien van de knop, maar we kunnen waarschijnlijk geschikt voor maximaal ~ 15 zonder de selecties worden te dicht bij elkaar. De code probeert vervolgens een aanvankelijke GPS moeilijke situatie:
De oneindige lus wordt verbroken wanneer gegevens van meer dan twee satellieten wordt geretourneerd. Succes wordt afgemeten aan het parseren van de gegevens van de latitude in een float. Nalaten hiervan kan verschillende soorten GPS fouten, inclusief seriële communicatiefouten aangeven. Zodra een oplossing is vastgesteld, wordt de huidige systeemtijd gebruikt voor het initiëren van het logboekbestand:
Het algoritme van de kern is dan:
De half-tweede vertraging biedt enige stabiliteit voor het registreren van de knop pers gebeurtenissen, zonder een liefhebber middel meerdere pers gebeurtenissen te weigeren. Dit dient ook als de tijd basis voor het opnemen van gegevens, momenteel ingesteld op 10 keer dit interval (ongeveer elke 5 seconden). Details voor de pick, scherm, getData en recordData functies kunnen worden gezien in de volledige code gekoppeld aan het einde van deze sectie.
Op dit moment, de LED-bochten af/knippert wanneer het verliest zijn GPS-fix, of als het aantal satellieten zakt tot onder 2. Tijdens deze tijden is het nog steeds mogelijk om record veldgegevens met behulp van alle sensoren behalve GPS, d.w.z. niet breedtegraad, lengtegraad, of kanteling voor die gegevenspunten. De tabel Samenvatting geproduceerd uit de uitvoer wordt weergegeven betekent voor de gegevens, rekening houdend met of hoogte beschikbaar of niet was. Door het observeren van de toestand van de LED voordat u zich registreert gegevens, biedt dit de mogelijkheid al dan niet te wachten (soms maar een paar seconden) om de GPS-gegevens beschikbaar hebben. Gegevenspunten zonder GPS staan natuurlijk niet op de kaart.
De volledige code is gekoppeld hieronder.
Automatisch starten bij het opstarten (Headless)
Aangezien wij vereisen de data collectie programma te starten zodra de stroom is aangesloten (en opnieuw opstarten als we moeten veranderen van de batterijen in het veld), eisen wij dat het python programma op start wanneer de Edison eindigt de opstartvolgorde.