Väckning taklampa (5 / 6 steg)
Steg 5: Programvaran
Om du vill använda programvaran som-är utan några ändringar och bryr mig inte hur den är gjord, förfarandet är enkel: Hämta och packa upp den bifogade "wakeuplight_esp01.zip", öppna i Arduino IDE. Ändra inställningarna i "configuration.h". Den behöver Wifi SSID och lösenord, IP-adressinformation, namnet på en NTP-server (du kan förmodligen lämna detta oförändrade) och timezone information - din standard offset från UTC i minuter samt sommartid regler.
Efter att lämpliga ändringar, helt enkelt ladda upp skissen till den ESP-01.
Om du vill göra några ändringar av programvaran, eller bara är intresserade av hur det fungerar, finns lite mer detaljerad information med nedan.
Övergripande arkitektur
Min första version av denna programvara var i vanligt C och växte organiskt från experimentera. Någon gång, det fungerade (kinda), men det var en total röra. Jag beslutade då att refactor och växla till C++, att skapa en enda klass för varje separat funktion (bestående av en .h fil definiera klassen och en .cpp fil som innehåller genomförandet). Klasserna få instansieras i modulen viktigaste. De flesta klasser är naturligtvis beroende av andra. Den viktigaste modulen injicerar dessa beroenden genom konstruktörer av klasserna beroende.
Följande klasser finns:
- Konfiguration: tillhandahåller ett gränssnitt för alla konfigurationsdata, både hårdkodad (se ovan) samt data som lagras i EEPROM (som larminställningarna). Alla andra moduler (ej Dimmer) beror på konfigurationen.
- Dimmer: Justerar ljusstyrkan med PWM.
- Wificlient: upprättar anslutningen till en Wifi-åtkomstpunkt.
- NTPClient: blir universell tid från en tidsserver.
- LocalClock: konverterar universell tid till lokal tid, ta in i konto sommartidsreglerna om någon.
- Larm: använder Dimmer, LocalClock och konfiguration för att utföra grundläggande funktion slår på ljuset gradvis under en angiven tidsperiod.
- Webbserver: serverar en mobil-friendly webbsida om du vill aktivera larmet konfiguration och manuell kontroll.
- Serialhost: tillåter seriell kommunikation för felsökning.
Mer detaljerad information finns i källfilerna. Dimmer och webbserver modulerna är speciella i den meningen att de delvis använder genererade koden. Filen "wakeuplight_java_helpers.zip" innehåller en Eclipse Java projekt som gör generationen. Vi ska zooma in här nedan.
Dimmer
Wake-up light är att låta ljusintensiteten öka gradvis som uppfattas av en människa. PWM mekanismen ger oss linjär kontroll över ljusintensiteten, men mänsklig perception är mer eller mindre logaritmisk ( Weber-Fechner lag). Om vi inte skulle kompensera för detta och bara låta PWM duty cycle ökar från 0 till 100% i säga 1000 steg, skulle resultatet bli att ljusintensiteten i den tidiga delen av den vakna cykeln, skulle öka alltför snabbt med märkbar hopp, att nå en hög nivå tidigt, och då stiger mycket långsamt från hög till fullt i resten av cykeln. Det är uppenbarligen inte vad vi vill. Vi måste ändra ljusintensiteten exponentiellt snarare än linjärt i tid, att ge föreställningen av en linjär ökning i tid.
ESP8266 PWM är inte heller perfekt. Det har vissa jitter som märks i mycket små driftcykler och orsakar märkbar flimmer i lampan. Så ljuset kan vara helt avstängda, eller på vissa stabilt minimivärdet, men vi bör undvika att vara i mellan. Detta problem blir mindre allvarliga om PWM är låg - vilket är varför jag har valt just 100Hz.
Filen "DutyCycle.java" beräknar en funktion från ett nödvändigt steg i upplevda ljusintensitet (på en skala 0 till 1800) och en PWM-värde (på en skala 0 till 20000). "ConvertDutyCycleToEsp.java" beräknas denna funktion och skriver det till en .h fil som ska inkluderas i det Arduino projektet. Dimmer koden i Arduino gör helt enkelt en titt på genererade tabellen.
Webserver
Jag ville styra projektet med min smartphone. Som jag har mycket mer erfarenhet av att skriva web-apps än inbyggda mobila appar, beslöt jag att ta den mobil-vänlig webb-app strategin.
Webb-app är ett enkelsidigt HTML5/jQuery program som skickar en Ajax POST-begäran när användaren trycker på en knapp (och även hämtar statusuppdateringar med jämna mellanrum). Sidan instruerar webbläsaren att få jQuery från jsDelivr CDNär alla JavaScript och CSS-kod som ingår i HTML-koden som bilderna med Data webbadresser. Som ett resultat, innebär laddar sidan bara en enda GET-begäran till den ESP-01, att hålla allt enkelt och snabbt.
Inklusive taggarna "mobile-web-app-kompatibel" och "apple-mobil-web-app-kompatibel" och en snar vägen ikonen länk, smartphones kan lägga till denna webbsida på startsidan. Efter det, kan den startas på samma sätt som en app (det kommer att startas i en Fullskärm webbläsare), till stor del dölja det faktum att det inte är en native app.
Att ladda upp en skiss till den ESP-01 varje gång när testa små förändringar på webbsidan inte är en trevlig utveckling cykel. Jag har därför utvecklat detta i ett Java web-projekt med "LightServlet.java" simulera svar på ESP-01 Ajax POST-begäranden. 'ConvertWebpageToEsp.java' konverterar web projekt index.html till 'webserver_homepage.h' inkluderar fil som innehåller webbsidan som en strängkonstant.