Stap 5: De software
Als u gebruik wilt maken de software-as-is zonder enige wijziging en niet schelen hoe het gemaakt, de procedure is eenvoudig: downloaden en uitpakken van de bijgevoegde 'wakeuplight_esp01.zip', open in de Arduino IDE. Wijzig de instellingen in 'configuration.h'. Het moet uw Wifi SSID en wachtwoord, IP-adresgegevens, de naam van een NTP-server (u kunt waarschijnlijk laat dit ongewijzigd) en informatie over timezone - uw standaardverschuiving ten opzichte van UTC in minuten, alsmede eventuele zomertijd regels.
Nadat u de juiste wijzigingen hebt, gewoon uploaden van de schets om de ESP-01.
Als u wilt enkele wijzigingen aanbrengen in de software, of gewoon geïnteresseerd bent in hoe het werkt, is wat meer gedetailleerde informatie hieronder opgenomen.
Algemene architectuur
Mijn eerste versie van deze software was in plain C en organisch groeide van experimenteren. Op een gegeven moment het werkte (kinda), maar het was een totaal knoeit. Ik besloot vervolgens refactoring en overschakelen naar C++, het creëren van een enkele klasse voor elke afzonderlijke functie (bestaande uit een .h bestand de klasse definiëren en een bestand van de .cpp die de implementatie bevat). De klassen krijgen in de belangrijkste module geïnstantieerd. Natuurlijk, zijn de meeste klassen afhankelijk van anderen. De belangrijkste module injecteert deze afhankelijkheden via de constructors van de betreffende klassen.
De volgende klassen zijn aanwezig:
- Configuratie: biedt een interface naar alle configuratiegegevens, zowel hardcoded (hierboven genoemde), alsmede gegevens die zijn opgeslagen in EEPROM (zoals de alarminstellingen). Alle andere modules (met uitzondering van de Dimmer) is afhankelijk van configuratie.
- Dimmer: Hiermee past u de lichtintensiteit met PWM.
- Wificlient: maakt de verbinding met een Wifi access point.
- NTPClient: krijgt universele tijd van een tijdserver.
- LocalClock: universal time omgezet in lokale tijd, DST Rekeningreglementen eventueel rekening.
- Alarm: gebruikt Dimmer, LocalClock en configuratie voor het uitvoeren van de basisfunctie van het inschakelen van het licht geleidelijk gedurende een ingestelde periode.
- Webserver: serveert een mobiele-vriendelijke webpagina als alarm configuratie en handmatige bediening wilt inschakelen.
- Serialhost: seriële communicatie mogelijk maakt voor de foutopsporing.
Meer gedetailleerde informatie is beschikbaar in de bronbestanden. De Dimmer en Webserver modules zijn speciaal in de zin dat ze deels gegenereerde code gebruiken. Het bestand 'wakeuplight_java_helpers.zip' bevat een Eclipse Java-project dat de generatie doet. We zullen dit hieronder inzoomen.
Dimmer
Het punt van het licht wakker is te laten de lichtintensiteit geleidelijk verhogen zoals waargenomen door een mens. Het PWM-mechanisme geeft ons lineaire controle over de lichtintensiteit, maar menselijke waarneming is min of meer logaritmische (de Weber-Fechner wet). Als wij niet zou compenseren en laat het recht van de PWM cyclus verhoging van 0 tot 100 procent in zeggen 1000 stappen, zou dit ertoe leiden dat in het begin van de cyclus van de wakker, lichtintensiteit zou te snel met merkbaar sprongen toenemen, vroeg, het bereiken van een hoog niveau en dan heel langzaam van hoog naar volledig in de rest van de cyclus stijgen. Dat is natuurlijk niet wat we willen. We moeten veranderen van de lichtintensiteit eerder exponentieel dan lineair in tijd, om de perceptie van een lineaire verhoging van tijd.
Ook is de ESP8266 PWM niet perfect. Het heeft sommige jitter die is merkbaar in zeer kleine plicht cycli en merkbaar flikkering veroorzaakt in de lamp. Dus het licht kunnen volledig af, of op sommige stabiele minimumwaarde, maar we moeten voorkomen dat tussendoor. Dit probleem wordt minder ernstig als de frequentie PWM laag is - en daarom heb ik gekozen voor slechts 100Hz.
Het bestand 'DutyCycle.java' berekent een functie van een vereiste stap in waargenomen lichtintensiteit (op een schaal van 0 tot 1800) en de waarde van een PWM (op een schaal van 0 tot 20000). 'ConvertDutyCycleToEsp.java' wordt deze functie berekend en schrijft het naar een .h bestand in de Arduino project moeten worden opgenomen. De Dimmer code in de Arduino doet gewoon een blik omhoog op deze gegenereerde tabel.
Webserver
Ik wilde om te controleren van het project met mijn smartphone. Als ik heb veel meer ervaring met het schrijven van web-apps dan native mobiele apps, besloten heb ik om de web-app mobiele-vriendelijke aanpak.
De web-app is een single-pagina HTML5/jQuery-toepassing waarmee een Ajax POST-aanvraag worden verzonden wanneer de gebruiker op een knop drukt (en ook periodiek opgehaald statusupdates). De pagina krijgt de browser om jQuery uit de jsDelivr CDNinstructie, alle JavaScript en CSS-code is opgenomen in de HTML-code, evenals de beelden met behulp van de Gegevens URL's. Dientengevolge, laden van de pagina met zich meebrengt slechts een enkele GET-verzoek naar de ESP-01, houden alles eenvoudig en snel.
Smartphones kunt met inbegrip van de 'mobile-web-app-staat' en 'apple-mobiele-web-app-staat' tags en een pictogram van de snelkoppeling, deze webpagina aan het huisscherm toevoegen. Daarna kan het worden gestart op dezelfde manier als een app (het zal worden gestart in een volledig scherm-browser), grotendeels verbergen het feit dat er niet een native app.
Moetend uploaden van een schets naar de ESP-01, telkens wanneer het testen van kleine wijzigingen in de webpagina niet is een mooie ontwikkeling cyclus. Daarom heb ik dit ontwikkeld in Java web-project, met 'LightServlet.java' simulatie van de reactie van de ESP-01 op de Ajax POST-aanvragen. De 'ConvertWebpageToEsp.java' zet de web projecten index.html aan de 'webserver_homepage.h' omvatten bestand waarin de webpagina als een tekenreeksconstante.