WeggUp - en sovande cykel och ljus väckarklocka (9 / 11 steg)
Steg 9: programvara
Jag använde en "betyder" steack (mongodb, express.js, kantiga js och nod js) att genomföra allt i programvara.
Du kan hitta aktuellt (verkligen, verkligen alfa) källa koden på github
Det är flera skäl varför jag försökte denna kombination:
- Jag ville prova det i en riktig projetc
- Det är samma språk i frontend/backend/db
- JavaScript är ganska bra på prototyper
Begrepp:
På en inbäddad projekt som detta har vi problemet med delade resurser (ljud och ljus i vårt fall). Så bara en process kan komma åt resursen vid varje given tidpunkt, eftersom vi har flera arbetslägen (ljus, humör ljus, larm, ljudbok-läge), kan dessa tjänster blockera varandra. Så för att hålla allting enkelt jag bestämde mig för en mycket enkel strategi: när en process vill komma åt en resurs, en annan eventuellt pågående process så att resursen kan användas igen av den nya processen stoppas. I vårt fall, detta är möjligen också en av de bästa lösningarna: ingen av processerna som gör verkligen behov en resurs + den enda gången utlösta processen är larmet: larmet bör alltid få resursen när det börjar, även när något annat körs. Alla andra processer är användare utlöst (och vi har bara en användare), så vi vill nog processen för att göra anspråk på resursen.
Gränsyta lysdioderna: pwm med Pi-blaster
Raspberry Pi har oftast bara 1 eller 2 pwm portar. För detta projekt dock behövde jag minst 4 av dem så jag använde pi-blaster projektet för att köra flera portar med pwm. Jag hade problem med flimmer medan dimming lysdioderna, så jag var tvungen att byta till en tidigare version som inte har problemet. Dessutom hade jag ändra källor för pcm-läge som standard, utmärkt pi-blaster använder klanggeneratorns för att producera pwm vilket resulterar i riktigt äckligt buller på högtalarna. Dessutom hade jag justera portar: Port 21 döptes till 27 i den senaste raspberry Pi versionen.
Loggning
Som förklaras i intro bestämde jag mig att logga alla sensor värden i mongodb att visa dem senare och analysera dem. Det finns ett stort bibliotek för samverkan med mcp3008 chip för noden. Man kan söka i poster i loggen med en REST api. På gränssnittet använde jag flot, en jquery biblioteket för plottning diagram.
Loggning av accelerometrar var lite svårare, eftersom jag i princip ville logga "Är det motion" inte "vad är ledning av förslaget". Därför jag kontinuerligt loggas den absoluta skillnaden mellan 2 mätningar och byggde ett glidande medelvärde över 100 prover (1 urval varje millisekund) leder till 10 mätningar per sekund. När genomsnittligt överskrider en viss threashold (empiriskt bestämd) avfyras en händelse, så att larm-Schemaläggaren och andra moduler kan ta enligt åtgärder. Som provet är frekvensen för rörelse ganska hög, jag bara värden loggas när de ändrar en viss från det senast sparade värdet. otherwhise det skulle vara för mycket I/O för hallon bromsa allt (plus det skulle ta evigheter att visa data).
Larm
Alarm lagras också i mongodb och nod-cron biblioteket används för att starta dem. De kan redigeras via en REST api. På front-end använde jag en övertoningsväljare och en ljud-plockare för att konfigurera sunrise-ljuset och stämningen ljud.
För att ha en förhandsgranskning av den valda färgen utan alltför stor fördröjning, La jag socket stöd för att garantera en snabb kommunikation vid plockning av färgvärden. När du redigerar den lätta lutningen, förhandsgranska den markerade färgen alltid på weggup. Ljud/ljus toning kan också vara helt förhandsgranskade och alla ljud kan spelas separat. Volymen av varje ljud kan vara justerade separat, även om det bör upprepas eller inte.
Ljudfilerna läses från en viss katalog på raspberry Pi, som också delas via samba.
Inse funktionen sleep cycle larm Schemaläggaren lyssnar till händelsen rörelse från loggern och kontrollerar om nästa ljuset sova fasen ligger inom en viss tidsram mellan vakna tid och en fastställd tid dessförinnan att schemalägga om larmet. Det största problemet är att förutse nästa ljuset sova fasen. Just nu använder jag en konstant längd på 3 timmar per sömncykel. När har jag samlat mer rörelse data kommer att jag justera detta eller hitta en annan metod att förutsäga nästa ljus sömn fas (beroende på insamlade data).
Spela ljud
Om du vill spela upp ljud är mplayer processer lekt i bakgrunden i slav-läge, så att de enkelt kan styras från noden. Jag kommer eventuellt ändra till en annan spelare, som krav på hårdvara, och förseningar är därför ganska hög med mplayer.
Den enda knapp gränssnittet
När du trycker upp i huset, blir den inre knappen nedtryckt. Denna händelse orsakar weggup att slå på starkt ljus, agerar som en lampa. När du trycker på knappen, när allt är igång, är denna process omedelbart stoppas. Knappen fungerar dvs som en "stänga av något som kör" växla, och när ingenting är igång, den fungerar som en "ljus på" switch.
Andra moduler:
Alla moduler kan startas och stoppas från ett webbgränssnitt. Konfigurationen av alla parametrar kan även styras där. Jag har genomfört en enkel gemensam Inställningshanteraren för alla moduler, så jag kan lägga till nya lätt (när jag hittar lite tid, jag kommer att skapa anpassade inställningssidor för alla moduler, som är mer bekväm att använda).
- Ljudbok: modulen ljudbok läser en fil efter den andra från en viss katalog. Efter 10 minuters behandlingen vänder det ner volymen med 50%. När lyssnaren rör sig i sängen och en motion händelse avfyras, vänder upp och fortsätter en annan 10 minuter. När lyssnaren har somnat ingen motion händelse kommer att avskedas och ljudbok slutar spelas upp. Placera av motion senast lagras så att uppspelningen börjar vid en punkt där lyssnaren var definitivt vaken.
- moodlight: det ändrar dess färg varje 10 +/-rand(5) sekunder blekning från färgerna, den totala ljusstyrkan kan konfigureras (färg vektorn är normaliserat för att ha ungefär samma ljusstyrka hela tiden).
- ljus: tänds ljuset med en konfigurerbar färg. Denna modul startas när du trycker på toppen av skåpet.