Zbyšek Voda
Vytvořené odpovědi
-
AutorPříspěvky
-
Zbyšek VodaSprávce
Ne, když chcete, aby Arduino něco dělalo, musíte ho naprogramovat…
O displejích viz třeba tady: http://dontbuyjustmake.blogspot.cz/2015/01/reusing-your-ancient-mobile-phone-lcd.html
Zbyšek VodaSprávceMáte pravdu, pardon. Návod nesepíšu, protože jsem to nikdy nedělal a ani se v dohledné době nechystám 🙂
Zkuste se kouknout třeba sem
http://www.instructables.com/id/ESP8266-OTA-LUA-With-WEB-UI-MANAGEMENT-Nodemcu-Fir/?ALLSTEPSa sem
http://www.instructables.com/id/ESP8266-WiFi-File-Management/Takto se dá do ESP posílat přes prohlížeč zdrojáky ve skriptovacím jazyku LUA.
Zbyšek VodaSprávceZačal jsem to zkoumat a je to celkem zajímavý problém.
Zkusil jsem udělat úplně jednoduchou non-void funkci, která ale, stejně jako u vás, nic nevrací. Ta funkce vypadá takto:
#include <stdint.h> uint8_t fce(){ } int main(){ uint8_t a = fce(); return 0; }
Použil jsem uint8_t, protože boolean je vlastně „převlečený“ typ uint_8 – viz:
typedef uint8_t boolean;
Když tento miniprogram proženu přes kompilátor avr-gcc a zadám přepínače pro výstup v assembleru, získám kód níže. Příkaz pro spuštění kompilace je takovýto (jsem na MacOS):
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc -S main.c
.file "main.c" __SP_H__ = 0x3e __SP_L__ = 0x3d __SREG__ = 0x3f __tmp_reg__ = 0 __zero_reg__ = 1 .text .global fce .type fce, @function fce: push r28 push r29 in r28,__SP_L__ in r29,__SP_H__ /* prologue: function */ /* frame size = 0 */ /* stack size = 2 */ .L__stack_usage = 2 /* epilogue start */ pop r29 pop r28 ret .size fce, .-fce .global main .type main, @function main: push r28 push r29 push __zero_reg__ in r28,__SP_L__ in r29,__SP_H__ /* prologue: function */ /* frame size = 1 */ /* stack size = 3 */ .L__stack_usage = 3 rcall fce std Y+1,r24 ldi r24,0 ldi r25,0 /* epilogue start */ pop __tmp_reg__ pop r29 pop r28 ret .size main, .-main .ident "GCC: (GNU) 4.9.2"
K pochopení toho, co se děje, stačí najít řádek
std Y+1,r24
. Toto je instrukce v assembleru (viz . Slouží k tomu, že se někam do paměti na adresu danou Y+1 (proměnná a v programu) uloží hodnota z registru r24. Když se ale na program podíváte, do tohoto registru se předtím nic neukládá, ani se nenuluje, takže je hodnota nedefinovaná.Tento příklad je zjednodušený, v případě při kompilaci pro Arduino dojde k připojení několika dalších funkcí. Pro ilustraci je to ale myslím dobré 🙂
Podle mě tedy dojde k tomu, že při kompilaci na Linuxu se ještě přidá instrukce pro vynulování registru r24. Je to ale jenom teorie. Můžete vyzkoušet, docela by mě zajímalo, jestli ten assemblerový kód vypadá stejně 🙂
Zbyšek VodaSprávceDobrý den, možná by to šlo, ale asi to nebude úplně přívětivé. Programování na iOS je popsané třeba tu: http://www.arduinocode.info .
Také by to asi šlo pomocí OTA přes prohlížeč. K tomu byste potřeboval počítač jen při prvotním nahrání a potom už by to mělo jít přes prohlížeč více o OTA zde: http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html
Zbyšek VodaSprávceDobrý den, mě ta otázka přijde položená docela jasně 🙂
Pouštím se teď na trochu tenký led, tak snad neplácnu nějakou blbost.
Podle mě jde o to, že norma C++ nevynucuje návrat hodnoty z funkce pomocí return (i když tato funkce není void).Potom tedy závisí na kompilátoru, jak si s tím poradí. Použitý kompilátor pro Arduino je avr-gcc, který se ale asi na obou platformách chová trochu odlišně (právě v takovýchto normou nedefinovaných případech).
Podle mě může dojít ke dvěma možnostem:
1) Na linuxu je defaultní hodnota z funkcí bez return nulová, na Windows nenulová.
Tato možnost ale asi není moc pravděpodobná.2) V https://gcc.gnu.org/wiki/avr-gcc píší, že jednobytové hodnoty se vrací pomocí registrů (ATmega v Arduinech je většinou 8-bitová, takže má i 8-bit registry). Boolean je jenom jiné pojmenování pro bezznaménkové osmibitové číslo, takže se asi vrací v registrech. A právě registry v tom podle mě dělají ten rozdíl – na linuxu se kompilátor chová tak, že registr použitý k návratu vynuluje, kdežto na Windows ne. Díky tomu v registru zůstane hodnota, která už tam byla před voláním funkce (a s největší pravděpodobností je nenulová), takže pak dostanete odpověď OK.
Aspoň takto si to vysvětluji.
Použití
if (Testfunction())
je v pořádku. Můžete si představit, že kompilátor toto vidí jakoif (Testfunction() != 0)
.Zbyšek VodaSprávceDobrý den, asi úplně nejjednodušší cesta je použít nějaký oddělovač, který vložíte vždy mezi dvě čísla – třeba byte s hodnotou 255 (0b11111111), popřípadě možná vhodnější 0. Vždycky čekáte, dokud nepřečtete znak s hodnotou 0 a potom přečtete dva byty.
Tato metoda má své mouchy – třeba si musíte ošetřit situaci, kdy i datový být má hodnotu oddělovače (0, popř. 255). Napadá mě třeba k byte před odesláním vždy přičíst 1 – potom se byte s hodnotou 0 v datových bytech nemůže vyskytnout. Po přijetí 1 zase odečtete. Tam je ale zase problém s přetečením.
Dalším způsobem by mohlo být použít redundanci – prostě byte dat pošlete vždycky dvakrát za sebou (například).
Nebo zkusit použít nějaký standardizovaný formát dat – JSON, CSV apod… To už je ale trochu „s kanonem na vrabce“ (viz http://www.zive.cz/clanky/pojdme-programovat-elektroniku-jak-to-ze-je-prumerna-webova-stranka-stejne-velka-jako-doom/sc-3-a-185860/default.aspx).
Výběr vhodného protokolu řeší například zde: http://forum.arduino.cc/index.php?topic=195224.0.
Zbyšek VodaSprávceDobrý den, program nemůže nalézt knihovnu GLIBC_2.11 (viz error).
Zde řeší podobný problém pro Ubuntu: http://askubuntu.com/questions/421642/libc-so-6-version-glibc-2-14-not-found
Mělo by stačit updatovat požadovanou knihovnu.
Zbyšek VodaSprávceDobrý den,
s tím shieldem se vám to bude jenom jednodušeji zapojovat. Jinak je to jedno 🙂Jen si dejte pozor na to, abyste měla dostatečné napájení. Na stránce píší, že pracovní proud je 400mA, což by Arduino z jeho 5V pinu nemuselo zvládnout.
Zbyšek VodaSprávceNajděte si složku, kde máte staženou knihovnu Exosite a v ní si otevřete soubor Exosite.h v nějakém textovém editoru. Hned na začátku programu najděte řádek
#include <WiFi.h>
a zakomentujte ho.Nejsem si jistý, jestli takto bude program fungovat, ale kód se zkompiluje bez chybových hlášek. Zkuste to a uvidíme 🙂
Zbyšek VodaSprávceDobrý den, jak se projevuje to „zabití sériové linky“?
Jde také o to, jestli odešel pouze převodník USB-Serial na desce, nebo přímo obvod starající se o sériovou linku v čipu.
Zbyšek VodaSprávcePodle té chyby to opravdu vypadá, že bude chyba v knihovně. Někde tam asi dochází k tomu, že se nějaký soubor vloží dvakrát – odsud také chyba „redefinition of classs…“.
Ještě pro jistotu prosím pošlete použitý kód, ale tím to asi nebude.
Zbyšek VodaSprávceMáte pravdu, tohle fórum není ideální.
S převodem jsme uvízli na mrtvém bodě.Taková teoretická otázka – jak moc by bylo user-unfriendly, kdybychom začali phpBB fórum úplně na novo a tohle fórum udělali jenom read-only?
Zbyšek VodaSprávceNení zač, mějte se 🙂
Zbyšek VodaSprávceDobrý den, můžete si udělat třeba nějaké počitadlo.
Kód by pak mohl vypadat například takto (předpokládám, že chcete získat 5 znaků).
int poc = 0; String zadano; char znak; char menu; void setup() { Serial.begin(9600); } void loop() { while (Serial.available()) { znak = Serial.read(); if (znak < 32 || znak > 126) continue; //přeskočí znaky mimo rozumný rozsah (konec řádku...) zadano.concat(znak); poc++; Serial.println(zadano); } if (poc >= 5) { if (zadano == "HELP") menu = 'H'; else menu = '0'; switch (menu) { case 'H': Serial.println(" //================================================\\"); Serial.println(" ||================================================||"); Serial.println(" ||Vypis prikazu ||"); Serial.println(" ||================================================||"); Serial.println(" ||COSI popis instrukce jshfjashfjsah ||"); Serial.println(" ||================================================||"); Serial.println(" \\================================================//"); default: delay(5); } poc = 0; zadano = ""; } }
Zbyšek VodaSprávcePošlete kód 🙂
-
AutorPříspěvky