Stap 8: Firmware: Main
PP {} kw {} pps {} lc {tekenstijl: cursief;} bc {kleur: Green; font-style: cursief;} jc {kleur: Blue; font-style: cursief;} fn {kleur: rood;} {num} var}Bij het rechtstreeks programmeren van gangbare microcontrollers als de Atmel AVR-lijn, kunt u een hoofdfunctie met een interne "forever loop." Dit is niet het geval met de ESP8266. Deze module maakt gebruik van haken, vergelijkbaar met de Arduino, zodat de compiler een paar gedefinieerde functies zullen verwachten. Na dat, kunt u een timer om herhaalde taken plannen.
De meest voorkomende haken in gebruik zijn:
// Required for SDK v1.1.0 - Can be used to disable RFvoid user_rf_pre_init(void) { } // Loop function - Can/will continuously reschedule itself to runstatic void IFA user_procTask(os_event_t *events) { os_delay_us(10); // system_os_post(user_procTaskPrio, 0, 0 ); } // User Initialization void IFA user_init() { // Initialize the device here }
Othwerwise, u bent vrij om te schrijven van uw eigen functies en noemen als een normale C programma. Het kenmerk "IFA" is eigenlijk een macro die ik heb gedefinieerd in include/esp8266.h als:
#define IFA ICACHE_FLASH_ATTR
Als een functie wordt voorafgegaan door de IFA, is het geschreven naar flash die is toegewezen aan de ROM. Zonder dit kenmerk zal de functie uiteindelijk in de instructie RAM segment, die sneller is, maar zal snel vullen. Indien mogelijk, gebruik altijd het kenmerk van de IFA. Deze headerbestand bevat ook bijna alle van de bibliotheken van de SDK gebruikte evenals het opnieuw toewijzen van een paar gemeenschappelijke C-functies (zoals printf) naar de versie die is vereist door de Espressif SDK (os_printf). Tot slot, het definieert een eenvoudige foutopsporing afdrukken macro die kan worden gebruikt als selectief afdrukbereik verklaringen als een bepaalde waarde is gedefinieerd, wordt er in het *include/user_config.h* bestand. Ik gebruik deze macro uitgebreid in de bibliotheek, maar wees voorzichtig met het als het gemakkelijk gebroken worden kan.
// Define to print debug statements over UART using DEBUG_PRINT()#define DEBUG_PRINT_ 1 // Only prints lines for debugging purposes#ifdef DEBUG_PRINT_ # define DEBUG_PRINT(S) printf S #else# define DEBUG_PRINT(S) #endif
Binnenkant van de user_init() functie, zullen we de UART-verbinding initialiseren, opstelling de GPIO pinnen, en verbinden met WiFi. De waarden van SSID en SSID_PW zijn in include/user_config.hdefiniëren. U moet deze waarden ingesteld op de bijbehorende SSID en het wachtwoord voor uw huis WiFi-verbinding! De algehele stroom van de code gaat iets als dit:
- Initialiseren van de UART
- GPIO initialiseren
- Initialiseren van de PubNub
- Verbinding maken met netwerk (pauze hier tot stand gebrachte verbinding)
- Verbinden met Pubnub
- Bewaking van de knop (SW2) en beheersing van LED1 op basis van berichten die worden ontvangen.