Close

Arduino hodiny založené na ESP8266

Náš čtenář Petr Zapadlo nám poslal článek o jeho projektu hodin postavených na modulu ESP8266. Přejeme příjemné čtení.


Úvod

Když jsem před rokem objevil modul ESP8266, rozhodl jsem se, že v rámci seznámení s tímto modulem postavím hodiny. Ano, kdyby mi šlo jen o ty hodiny, tak si zajdu do tržnice a mohu vybírat dle libosti, ale na hodinách z tržnice mi dost věcí vadí. A když si je mohu udělat k obrazu svému, tak proč ne.

Jaké by měly mít hodiny vlastnosti:

  • Automatické nastavení času
  • Přepínání zimní/letní čas na přepínači
  • Nastavení budíku na každou číslici samostatně (abych nemusel mačkat tlačítko 59x, když chci o 1 minutu dříve vzbudit)
  • Čas budíku uložený do EEPROM, aby po výpadku napájení budík fungoval, jak má.
  • Jas displeje řízený okolním osvětlením.
  • Budík budí každý den ráno, dokud to explicitně nevypnu a nebudí, když je vypnut
  • Automatická korekce přesnosti interního čítače času

Při úvaze, jak by takové hodiny měli být postaveny,  jsem původně přemýšlel nad Arduinem a Ethernet shieldem, ale jakmile mi dorazili moduly ESP8266 a našel jsem projekt NTP klienta do těchto wifi modulů, tak bylo rozhodnuto.

Schéma hodin s ESP8266
Schéma hodin

Popis zapojení

Arduino

V obvodu Arduina není žádná zvláštnost, jediný HW UART Arduina je použitý pro komunikaci s wifi modulem. Na modul je navázán napěťovým převodníkem z rezistorů R1, R2.  Tx signál z wifi nekonvertujeme – pro Arduino stačí 3,3V pro spolehlivou funkci. Programování Arduina je třeba dělat mimo mimo obvod, tj je třeba ho před programováním vyjmout z patice na plošném spoji. Nedoporučuji nechat připojený seriový programovací převodník na Arduino. Může se stát, že že z tohoto převodníku vnutíme úroveň +5V na TX pin ESP8266. Jak ukazují zkušenosti, tak je sice wifi modul  hodně odolný, ale jelikož datasheet uvádí, že není tolerantní k +5V, tak je lepší neriskovat jeho poškození.

Piny 2, 3 (RX, TX) jsou vyvedeny na pinovou lištu jako SW seriový port, přičemž TX se používá na  vypisování ladících zpráv. Komunikační rychlost na TX pinu je 9600. RX pin není zatím využit.

Na pinu 5 je připojen přepínač, kterým lze rychle přenastavit čas z jedné časové zóny do druhé (GMT+1 a GMT+2), čímž snadno a rychle přepínáme zimní a letní čas.

Arduino hodiny s ESP8266 -Vnitřní zapojení
Vnitřní zapojení

Wifi modul ESP8266

Wifi modul má nahraný firmware, který rozšiřuje funkce o vlastnosti NTP clienta esp8266-ntp_0.9.4. Firmware se skládá ze dvou souborů, které je třeba do ESP nahrát na uvedené adresy:

  • eagle.app.v6.flash.bin -> 0x0000
  • eagle.app.v6.irom0text.bin -> 0x40000

Tento firmware komunikuje ve výchozím nastavení rychlostí 115200Bd, proto je nezbytné připojit wifi modul na HW UART Arduina. NTP Firmware rozšiřuje seznam AT příkazů o další:

  • AT+CIPNTP=<offset from GMT>, tímto příkazem nahodíme uvnitř ESP8266 NTP klienta.
  • AT+CIPNTP? Vrátí odpověď s aktuálním časem. Z této odpovědi potom parsujeme přesný čas do interní implementace času v Arduinu.

Vlastní firmware nahrajeme do modulu pomocí převodníku USB/serial nástrojem esptool.py (opět pozor na převodník úrovní).
Více o NTP firmware: http://www.esp8266.com/viewtopic.php?f=11&t=705

Arduino hodiny s ESP8266 - Zapojení
Zapojení

Displej

Pro řízení displeje je použit integrovaný obvod MAX7219CNG – tento obvod umí řídit sedmisegmentový multiplexovaný displej se společnou katodou až o 8 pozicích. Má seriový vstup, k připojení potřebujeme jen 3 piny a jeho ovládání je velmi jednoduché (není třeba žádné knihovny). Řadič displeje může pracovat ve 2 režimech, včetně sedmisegmentového dekodéru, nebo s přímým ovládáním jednotlivých segmentů. Pro naše hodiny využijeme režim se sedmisegmentovým dekodérem. Dvojtečka mezi hodinami a minutami je připojena jako desetinná tečka páté pozice.

Dále tento integrovaný obvod umí řídit střídu multiplexu a tím i jas displeje v 16 úrovních, čehož s výhodou využijeme. Základní jas řídíme rezistorem R3 – ten vybereme podle použitého displeje dle pokynů v datasheetu. Já jsem použil R3 o hodnotě 47k.

Použitím tohoto řadiče displeje si výrazně zjednodušíme programovou část – obsluha takhle velkého displeje v multiplexním režimu není pro Arduino snadná.

Na vstupu řadiče displeje jsou 3 rezistory R15, R16, R17, které uzemňují řídící vstupy – ty jsou důležité při startu. Stávalo se mi, dokud jsem je nezapojil, že při náběhu se řadič kousnul v nějakém mezistavu, ze kterého jsem ho nebyl schopen řízením z Arduina dostat. IO piny Arduina jsou po resetu ve stavu IN, tedy vysoká impedance a na pinech se může nakmitat cokoliv.  Každopádně osazení rezistorů tento neduh odstranilo.

Jelikož v nabídce místních elektronických obchodů jsem rozumně velký displej nenašel, poohlédl jsem se na Aliexpressu a používám TYTO.

Arduino hodiny s ESP8266 - Detail displeje
Detail displeje

Obvod řízení jasu

Je tvořen fotodiodou (BPW34, BPW43 apod.) zapojenou jako zdroj proudu v invertujícím zapojení s operačním zesilovačem. V podstatě běžné zapojení. Já jsem použil fotodiodu BPW43. Pokud by dioda měla výrazně jinou citlivost, je třeba upravit zisk zesilovače korekcí rezistoru R4. Při běžném osvětlení by na výstupu operačního zesilovače mělo být kolem 3,5V. Je třeba dodržet použitý typ zesilovače, protože umožňuje práci při nízkém napájecím napětí, ale hlavně jeho vstupy pracují i při nulovém napětí. Případně lze použít jiný rail-to-rail OZ. U LM324 při napájení 5V nepřekročí výstup cca 3,6V (viz datasheet) a nevyužijeme tak plný rozsah AD převodníku, což ale nevadí, protože stejně jas převádíme na šestnáct úrovní. Výstup operačního zesilovače je přiveden přes RC filtr R10, R11,  C11, C12 na vstup AD převodníku. Tento filtr měl odstranit rychlé změny osvětlení, ale nakonec jsem filtraci udělal i v SW a tento filtr je možné neosadit a jen spojit výstup zesilovače se vstupem převodníku. Čtyřnásobný OZ jsem použil jen z důvodu „šuplíkových zásob“.

Arduino hodiny s ESP8266 - Pohled zepředu
Pohled zepředu

Obvod klávesnice

Klávesnice je v analogovém provedení okopírovaném z Arduino shieldu dvouřádkového displeje, tj výstup klávesnice je přiveden na vstup AD převodníku a zmáčknuté tlačítko je reprezentováno hodnotou AD převodu. V klidovém stavu je hodnota 1023. Klávesnice neumí rozpoznat několik zmáčknutých tlačítek naráz – vždy to tlačítko s nižším číslem „maskuje“ to s vyšším číslem. Pro zamýšlené použití to však vůbec ničemu nevadí. Hodnoty po převodu jednotlivých kláves jsou ve zdrojovém souboru. Pokud se budou hodnoty výrazně lišit, je třeba provést korekce mezí v patřičné části programu.

Arduino hodiny s ESP8266 - Upevnění tlačítek
Upevnění tlačítek

Obvod piezoelementu na buzení

Pro buzení je použit běžný samovybuzovací element spínaný tranzistorem Q1. Sériově v kolektoru tranzistoru mám zapojen dodatečný rezistor, kterým jsem nastavil hlasitost. Ve schématu ani na plošném spoji tento rezistor není zakreslen a jeho hodnota závisí na piezo elementu a případně mechanickém provedení. Já jsem použil hodnotu 1k.

Obvod napájení

Pro napájení celých hodin jsem zkoušel několik variant – klasické plechové trafo s usměrňovačem a stabilizátorem, externí spínaný zdroj (adaptér do zásuvky) + interní stabilizátor. Nejvíce (i z hlediska spotřeby) se mi osvědčilo napájení z malého adaptéru s výstupem USB původně určeného k nabíjení smartphonu. Tyto adaptéry jsou dostupné za rozumné peníze. Mechanicky je napájení řešeno ustřiženým USB kabelem, který USB konektorem je zasunut do adaptéru a druhý konec je napevno přidělán na krabičku hodin a propojen s plošným spojem.

Zdrojovou část doplňuje lineární stabilizátor LM1117 stabilizující 3,3V pro účelu wifi modulu ESP8266. Samozřejmě, že by bylo možné využít i nějaký spínaný modul, ale vzhledem k výkonové ztrátě (LM1117 je sotva vlažný) to nemá opodstatnění.

Software

V SW je nastaven poměrně důležitý údaj a to přístup do místní Wifi sítě. Jsou na to 2 parametry: SSID a PASS. Tyto údaje musí být korektně nastaveny a program znovu přeložen a nahrán do Arduina.

Hodiny mají svůj interní časový čítač, který je inkrementován v sekundových intervalech. Tento čítač je synchronizován s NTP přes wifi. V případě poslední úspěšné synchronizace, je další provedena za 1 hodinu (3600000ms), v případě neplatné poslední synchronizace je interval 45 sekund (3600000ms/80). Interval lze ovlivnit nastavením parametru „PRODLEVA“. Rychlost čítání sekund je ovlivňována proměnnou „konstanta“. Tato je uložena v EEPROM a změna její velikosti probíhá v okamžiku úspěšné synchronizace s časem NTP. Toto je realizováno na konci funkce setTime(), kdy podle toho, zda je interní čítač rychlejší či pomalejší než čas z NTP, inkrementujeme nebo dekrementujeme konstantu. Nepřesnost čítání je způsobena především tím, že použité Arduino Pro Mini má místo křemenného krystalu keramický rezonátor s výrazně nižší přesností. Když se nepovede synchronizace s NTP, hodiny jdou normálně dál a pokusí se v krátkém intervalu ověřit čas. Na funkci zobrazeného času ani budíku to vliv nemá.

Komentář si zaslouží i způsob inicializace wifi modulu ESP8266 – je jiná, než jsem viděl u ostatních uživatelů na internetu. Wifi ESP8266 si ukládá parametry pro připojení do interní EEPROM, takže stačí tento modul zapnout a po nějakém čase se automaticky připojí k posledně použité wifi síti. Proto po zapnutí program čeká určitou dobu (min 10s) a pak se začne ptát, zda je připojen k wifi síti. Pokud se automatické připojení povede (je na to 5 dotazů s prodlužujícími se intervaly), nastavíme časovou zónu (při tom dojde k aktivaci NTP klienta uvnitř ESP8266) a opustíme funkci s návratovou hodnotou true. Pokud automatické připojení neklapne, posíláme parametry připojení standardním způsobem. Při psaní komunikace s wifi modulem se mi osvědčilo počkat na příchod očekávaného počtu znaků do seriového bufferu a následně na to zjistit co modul odpověděl.

Uživatelský manuál

Hodiny si nastaví čas automaticky, tento je uživatelsky nenastavitelný. Uživatelsky lze nastavit pouze čas buzení. K tomu slouží 3 tlačítka. První stisk zobrazí čas budíku bez jeho změny, další stisky již mění čas. Pokud nastavený čas vyhovuje, přestaneme tlačítka mačkat a po uplynutí nastaveného času (5s) se hodnota uloží a hodiny se vrátí k zobrazení aktuálního času.
Tlačítko nalevo mění nastavený čas buzení – hodiny. Opakovaným stiskáním přidáváme hodinu cyklicky dokola. Druhé tlačítko z leva přidává desítky minut, další jednotky minut. Další tlačítko zapíná a vypíná buzení. Toto je indikováno desetinou tečkou vpravo – u jednotek minut. Opět první zmáčknutí ukáže čas buzení a nastavení buzení, další stisk přepíná stav buzení.
Poslední tlačítko zobrazí sílu signálu wifi (RSSI) v dBm. Pokud nejsou hodiny synchronizovány s NTP serverem přes wifi, tak je to indikováno desetinou tečkou u čísla nejvíce vlevo (desítky hodin).

Mechanické provedení

První provedení bylo na dvou plošných spojích – deska Arduina a deska displeje. V reálu se pak tato koncepce ukázala jako velká , proto jsem udělal druhou verzi plošného spoje, kde vše je na jednom plošném spoji a jen displej je připevněn v pravém úhlu. V pohledu by tato koncepce neměla být větší než obrys displeje. V původní verzi jsem zkoušel i různé zdroje, proto na fotkách je ještě osazený plošný spoj pro modul spínaného stabilizátoru. Plošný spoj je přišroubován na základové desce z překližky 5mm a krycí krabička je z ceibové překližky 3mm. Přední strana je tvořena červeným polykarbonátem 2mm. Plošné spoje jsou optimalizovány na ruční výrobu (vrstvu TOP používám pro vedení drátových propojek). Pro mou kusovou výrobu se při této složitosti oboustranný spoj nevyplatí.

Návrh plošného spoje hodin s ESP8266 1
Návrh plošného spoje hodin 1
Návrh plošného spoje hodin s ESP8266 2
Návrh plošného spoje hodin 2

Možná vylepšení

Pokud by se použil modul ESP8266 s více GPIO, bylo by teoreticky možné úplně vynechat Arduino a mít pouze wifi modul. Konfigurace wifi parametrů by byla možná přes SW seriál, který se používá pro debug.

Podklady


Za článek děkujeme a držíme palce v dalších projektech!

Máte svůj projekt, který chcete předvést ostatním? Napište na naše fórum, nebo na mail zbysek@bastlirna.hwkitchen.cz.

Zbyšek Voda

7 Comments on “Arduino hodiny založené na ESP8266

Peter Navoy
15.8.2016 at 17:55

Dobry den. Zda sa, ze program pre Arduino ma nejake problemy. Doplnil som SSID a heslo v 3. a 4. riadku a po kompilacii pise nasledovnu chybu:

Arduino: 1.6.8 (Windows 10), Vývojová doska:“Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)“

Hodiny:334: error: expected initializer before ‚connectWifi‘

boolean connectWifi() {

^

Hodiny:51: error: ISO C++ forbids declaration of ‚setup‘ with no type [-fpermissive]

setup ()

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚int setup()‘:

Hodiny:51: error: new declaration ‚int setup()‘

In file included from sketch\Hodiny.ino.cpp:1:0:

C:\Users\Navoy\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.10\cores\arduino/Arduino.h:145:6: error: ambiguates old declaration ‚void setup()‘

void setup(void);

^

Hodiny:58: error: ‚init_MAX7219‘ was not declared in this scope

init_MAX7219 ();

^

Hodiny:71: error: ‚nactikonst‘ was not declared in this scope

nactikonst ();

^

Hodiny:75: error: ‚ulozkonst‘ was not declared in this scope

ulozkonst ();

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚void loop()‘:

Hodiny:108: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (5, 128);

^

Hodiny:117: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (5, 0);

^

Hodiny:128: error: ‚ulozalarm‘ was not declared in this scope

ulozalarm ();

^

Hodiny:145: error: ‚zobraz‘ was not declared in this scope

zobraz (time); //zapis na displej po jedne sekunde -pokud neni zmacknute tlacitko

^

Hodiny:146: error: ‚settimezone‘ was not declared in this scope

settimezone (); //kontrola prepinace a nastaveni casove zony

^

Hodiny:149: error: ‚jasdisp‘ was not declared in this scope

jasdisp (); //nastaveni jasu displeje

^

Hodiny:176: error: ‚setTime‘ was not declared in this scope

time = setTime (time, true);

^

Hodiny:184: error: ‚connectWifi‘ was not declared in this scope

if (connectWifi ())

^

Hodiny:186: error: ‚setTime‘ was not declared in this scope

time = setTime (time, false);

^

Hodiny:208: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:223: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:232: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:247: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:257: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:272: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:281: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:300: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

Hodiny:309: error: ‚nactiRSSI‘ was not declared in this scope

rssig=nactiRSSI ();

^

Hodiny:310: error: ‚zobrazRSSI‘ was not declared in this scope

zobrazRSSI (rssig);

^

Hodiny:317: error: ‚nactiRSSI‘ was not declared in this scope

rssig=nactiRSSI ();

^

Hodiny:320: error: ‚zobrazRSSI‘ was not declared in this scope

zobrazRSSI (rssig);

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚boolean connectWifi()‘:

Hodiny:340: error: ‚cleanBuff‘ was not declared in this scope

cleanBuff();

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino:343:24: warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]

if (!Serial.find(„OK“)) {

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino:354:25: warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]

if (Serial.find(„OK“)) {

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino:391:25: warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]

if (Serial.find(„OK“)) {

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚long int setTime(long unsigned int, boolean)‘:

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino:430:29: warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]

if (!Serial.find („Time: „))

^

Hodiny:491: error: ‚ulozkonst‘ was not declared in this scope

ulozkonst ();

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚void zobraz(long unsigned int)‘:

Hodiny:539: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (1, lmin);

^

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino: In function ‚unsigned int nactiRSSI()‘:

C:\Users\Navoy\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\Hodiny\Hodiny.ino:735:25: warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]

if (!Serial.find (SSID))

^

exit status 1
expected initializer before ‚connectWifi‘

Zbyšek Voda
24.8.2016 at 22:16

Dobrý den, chyba byla v tom, že před funkcí setup bylo odřádkování.
Tedy místo:
void setup() ...
bylo v kódu
void
setup ...

a kompilátor si s tím neuměl poradit.

V odkazech na konci článku už je správná verze.

Peter Návoy
13.11.2016 at 18:45

Dobry den, viem, ze otravujem ale kompilator stale ukazuje chybove hlásenie. tentokrat uz ine

Arduino: 1.6.12 (Windows 10), Vývojová doska:“Arduino/Genuino Uno“

C:\Users\pcspravca\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\sketch_aug24a\sketch_aug24a.ino: In function ‚void setup()‘:

sketch_aug24a:57: error: ‚init_MAX7219‘ was not declared in this scope

init_MAX7219 ();

^

sketch_aug24a:70: error: ‚nactikonst‘ was not declared in this scope

nactikonst ();

^

sketch_aug24a:74: error: ‚ulozkonst‘ was not declared in this scope

ulozkonst ();

^

C:\Users\pcspravca\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\sketch_aug24a\sketch_aug24a.ino: In function ‚void loop()‘:

sketch_aug24a:107: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (5, 128);

^

sketch_aug24a:116: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (5, 0);

^

sketch_aug24a:127: error: ‚ulozalarm‘ was not declared in this scope

ulozalarm ();

^

sketch_aug24a:144: error: ‚zobraz‘ was not declared in this scope

zobraz (time); //zapis na displej po jedne sekunde -pokud neni zmacknute tlacitko

^

sketch_aug24a:145: error: ‚settimezone‘ was not declared in this scope

settimezone (); //kontrola prepinace a nastaveni casove zony

^

sketch_aug24a:148: error: ‚jasdisp‘ was not declared in this scope

jasdisp (); //nastaveni jasu displeje

^

sketch_aug24a:175: error: ‚setTime‘ was not declared in this scope

time = setTime (time, true);

^

sketch_aug24a:185: error: ‚setTime‘ was not declared in this scope

time = setTime (time, false);

^

sketch_aug24a:207: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:222: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:231: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:246: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:256: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:271: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:280: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:299: error: ‚zobraz‘ was not declared in this scope

zobraz (alarm);

^

sketch_aug24a:308: error: ‚nactiRSSI‘ was not declared in this scope

rssig=nactiRSSI ();

^

sketch_aug24a:309: error: ‚zobrazRSSI‘ was not declared in this scope

zobrazRSSI (rssig);

^

sketch_aug24a:316: error: ‚nactiRSSI‘ was not declared in this scope

rssig=nactiRSSI ();

^

sketch_aug24a:319: error: ‚zobrazRSSI‘ was not declared in this scope

zobrazRSSI (rssig);

^

C:\Users\pcspravca\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\sketch_aug24a\sketch_aug24a.ino: In function ‚boolean connectWifi()‘:

sketch_aug24a:339: error: ‚cleanBuff‘ was not declared in this scope

cleanBuff();

^

C:\Users\pcspravca\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\sketch_aug24a\sketch_aug24a.ino: In function ‚long int setTime(long unsigned int, boolean)‘:

sketch_aug24a:490: error: ‚ulozkonst‘ was not declared in this scope

ulozkonst ();

^

C:\Users\pcspravca\Desktop\arduino-esp8266-hodiny-program\arduino-esp8266-hodiny-program\sketch_aug24a\sketch_aug24a.ino: In function ‚void zobraz(long unsigned int)‘:

sketch_aug24a:538: error: ‚writeMAX7219‘ was not declared in this scope

writeMAX7219 (1, lmin);

^

exit status 1
‚init_MAX7219‘ was not declared in this scope

Funguje vôbec tento projekt ?

Zbyšek Voda
13.11.2016 at 19:34

Dobrý den, problém je v Arduino IDE.
Starší verze povolovaly volání funkcí před jejich vytvořením, novější už očividně ne.

Ty problémy, co vám kompilátor hlásí, způsobuje to, že kompilátor narazí na volání funkce, s jejíž deklarací se ještě nesetkal (je deklarovaná níže).

Řešení je vícero.
a) Můžete použít Arduino IDE 1.6.6 (to mám já a kompilace v něm funguje bez problémů).
b) Deklarace funkcí přesunete před jejich volání.
c) Definujete si hlavičky funkcí na začátku souboru – dejme tomu, že máme funkci void writeMAX7219 (char address, char data){…}. Na začátek souboru za direktivy #include a #define vložíme void writeMAX7219 (char address, char data); a to stejné provedeme i pro ostatní funkce kromě setup a void. Toto by také mohlo pomoci.

Daniel
8.3.2016 at 14:44

Jen škoda že to neběží čistě na esp8266 bylo by to o dost zajímavější 🙂

Tomáš Jurman
8.3.2016 at 7:48

Napsat komentář