nielda
Vytvořené odpovědi
-
AutorPříspěvky
-
ArduXPP
ÚčastníkAsi děláte ve windows XP poprvé ? Je to stejný jako třeba u USB flash, když ho chci používat, tak musím nainstalovat driver ( ovladač) , to stejný je u arduino uno či Funduino UNO R3.
Hint
ÚčastníkTak po menší úpravě vašeho návrhu už zřejmě funguje jak má, přepíná po sériové lince i přes IR. Pokud to tedy chápu správně, místo použití příkazu switch mám použít vypsaní všech možností podmínkou if
a zárověň mě napadlo zda jde ještě nějak zapsat podmínka, když nepřijme data která má v podmínkach, neudělá nic a bude pokračovat v předchozím efektu. Uvědomil jsem si totiž že při ovladaní TV bude IR ovlivňovat i arduino přijímač a vypínat efekty.#include <Adafruit_NeoPixel.h> #include"IRremote2.h" #define pinIN 4 #define PIN 6 // Parametr 1 = počet pixelů (LED diod) na pásek // Parametr 2 = číslo PINu Arduina // Parametr 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz kmitočet pro pásky s WS2812 LED diodami) // NEO_GRB Pixely jsou zasílány ve formátu GRB Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800); IRrecv dalkoveOvl(pinIN); decode_results vysledek; char pozice; void setup() { pixels.begin(); Serial.begin(9600); pixels.show(); delay(250); dalkoveOvl.enableIRIn(); } void loop() { if (dalkoveOvl.decode(&vysledek)) { detekceKlaves(); dalkoveOvl.resume(); } if (Serial.available() > 0) { pozice = Serial.read(); if(pozice == '1') blika(); if(pozice == '2') blika1(); } } void detekceKlaves() { if(vysledek.value == 0xFFA25D) { Serial.println("Stisknuto CH-"); blika(); // pauza pro přehlednější výpis delay(500); } if(vysledek.value == 0xFFE21D) { Serial.println("Stisknuto CH-"); blika1(); // pauza pro přehlednější výpis delay(500); } } void blika() { dalkoveOvl.resume(); while(!(Serial.available() || dalkoveOvl.decode(&vysledek))) { pixels.setPixelColor(6, pixels.Color(255,255,255)); pixels.show(); delay(1000); pixels.setPixelColor(6, pixels.Color(0,0,0)); pixels.show(); delay(200); pixels.setPixelColor(6, pixels.Color(255,255,255)); pixels.show(); delay(1000); pixels.setPixelColor(6, pixels.Color(0,0,0)); pixels.show(); delay(200); } } void blika1() { dalkoveOvl.resume(); while(!(Serial.available() || dalkoveOvl.decode(&vysledek))) { pixels.setPixelColor(16, pixels.Color(255,255,255)); pixels.show(); delay(1000); pixels.setPixelColor(16, pixels.Color(0,0,0)); pixels.show(); delay(200); pixels.setPixelColor(16, pixels.Color(255,255,255)); pixels.show(); delay(1000); pixels.setPixelColor(16, pixels.Color(0,0,0)); pixels.show(); delay(200); } }
Vojtěch Vosáhlo
ÚčastníkZkuste něco takového jako zjednodušený kód. Mělo by to blikat s prvním pixelem pokud zmáčknete CH- nebo pošlete 1. Pokud přijde něco jiného, smyčka by se měla přerušit.
#include <Adafruit_NeoPixel.h> #include"IRremote2.h" #define pinIN 4 #define PIN 6 // Parametr 1 = počet pixelů (LED diod) na pásek // Parametr 2 = číslo PINu Arduina // Parametr 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz kmitočet pro pásky s WS2812 LED diodami) // NEO_GRB Pixely jsou zasílány ve formátu GRB Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800); IRrecv dalkoveOvl(pinIN); decode_results vysledek; char pozice; void setup() { pixels.begin(); Serial.begin(9600); pixels.show(); int delayval = 300; delay(250); dalkoveOvl.enableIRIn(); } void loop() { if (dalkoveOvl.decode(&vysledek)) { detekceKlaves(); dalkoveOvl.resume(); } if (Serial.available() > 0) { pozice = Serial.read(); if(pozice == 1) blikejLed(); } } void detekceKlaves() { if(vysledek.value == 0xFFA25D) { Serial.println("Stisknuto CH-"); blikejLed(); // pauza pro přehlednější výpis delay(500); } void blikejLed(){ dalkoveOvl.resume(); while(!(Serial.available() || dalkoveOvl.decode(&vysledek))){ pixels.setPixelColor(1, pixels.Color(255,255,255)); pixels.show(); delay(1000); pixels.setPixelColor(1, pixels.Color(0,0,0)); pixels.show(); delay(1000); } }
krcmar.tomas@gmail.com
Účastníkahj, diky moc za vase snazeni, byl jsem ted par dni mimo, ale zase se do toho chci pustit
muzu poprosit o to zjednodusene schema, nasel jsem na fb neco hodne podobneho
a jeste jsem chtel pozadat, jak presne zapojit tu klapku
http://marcomplet.cz/docs/Belimo/belimo_cm24-SR.pdf
diky moc pratele
Attachments:
Zbyšek Voda
ÚčastníkNe, 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
Dominic
ÚčastníkDobre ale pokud nenahraju nejak program do desk tak mi to stejne nebude nic delat ze?
Luke_CZ
ÚčastníkSamozřejmě, stačí použít Google.
L.
Dominic
ÚčastníkTakze z nejake nokie 3310 nebo simens c35 by to melo jit?
Luke_CZ
ÚčastníkDůležité je z jakého mobilu je. Pokud z nějakého starého, tak to by šlo, z nových dotykových ne, to by musel být displej i s řadičem a ten je na základní desce a nevím o takovém, který by měl řadič přímo fyzicky na displeji.
L.
Hint
ÚčastníkDěkuji moc za pomoc a váš čas. zkusím něco sepsat.
Vojtěch Vosáhlo
ÚčastníkOzvu se zase zítra, možná si najde čas i někdo z ostatních a dřív, uvidíte. Já bych asi doporučil jednu věc. Udělejte čistý nový projekt pouze s nejnutnějšími funkcemi na přijímání z IR a Serial a spuštění nějaké jednoduché funkce. Omezte to na co nejmenčí kód, klidně jen něco jako po stisknutí ON na ovladači nebo poslání 1 na port rosviť ledky. Na tomhle zkusíme jak by se mělo postupovat s přerušením smyčky a bude to přehlednější než ten kód co máme teď. Zmenšením kódu taky omezíme prostor na chybu. Držím palce.
Zbyšek Voda
ÚčastníkMá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.
Dzaraaa
ÚčastníkZdravím 🙂 ta první varianta není pro NodeMCU, ale pro arduino s bluetooth.
Mohl byste sepsat návod pro tu druhou variantu? Děkuji.Hint
Účastníkomlouvám se zde přikládám zdroje knihovny
knihovna ledpaskuknihovnu na IR ovladač jsem stahl tady
IR remote
možná by pomohlo tohle
IR remote wikiHint
Účastníkbohužel se mi nepovedlo to nějak rozběhat, ovladač pouze vypne probýhající smyčku, ale nespustí žádnou a přitom po seriové lince vypisuje stisknuté klavesy.
Vojtěch Vosáhlo
ÚčastníkZkuste za while vložit
dalkoveOvl.resume();
tzn bude to vypadat asi takto: `void nejakyefekt(){
while(neco){
}
dalkoveOvl.resume();
}
`
Pokud to nepojede tak se ozvěte. Zkuste taky poslat odkaz na knihovnu kterou přesně máte, jestli existuje dokumentace, bude to jednoduší.Hint
ÚčastníkDíky moc, hned jsem vaši radu vyzkoušel a opravdu teď mohu vypnout smyčku i pomoci ovladače a sepnutí nového efektu přes seriovou linku pracuje ještě lépe než předtím, bohužel ale nevím proč, přestal program přijímat sepnutí smyček efektů, pouze ukončí smyčku. Ovladačem nejde spustit efekt ani po resetu arduina, když ještě nic neběží.
Omlouvám se snad jsem to napsal srozumitelně.Vojtěch Vosáhlo
ÚčastníkMělo by stačit přidat k přerušení seriovou linkou i přerušení IR příjmem. Na začátku kódu máte v podmínce if toto: „dalkoveOvl.decode(&vysledek)“
Vzhledem k tomu že je v podmínce, nejspíše vrátí 1/true/pravda pokud něco přijme a zvládne dekódovat a 0/false/nepravda pokud nic nepřijme nebo nedekóduje.
Do vašeho while by tedy stačilo přidat logický operátor OR v arduinu jako ||. Ten vám dá 1 pokud alespoň jedna vstupní hodnota je 1. Smyčka by tedy vypadala asi taktowhile(!(Serial.available() || dalkoveOvl.decode(&vysledek)))...
Serial.available() se podívá jestli je něco dostupného na sériové lince a dalkoveOvl.decode() zjistí zda něco přijímáme. Pokud nic z tohoto neplatí dostaneme 0 která je vykřičníkem znegovaná na 1 a smyčka běží. Pokud bude ale jedna z možností 1, smyčka se zastaví.Mimo tohle by se dal kód ještě různě optimalizovat ale o tom kdyžtak jindy 😉
Zbyšek Voda
ÚčastníkZač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 Voda
ÚčastníkDobrý 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 Voda
ÚčastníkDobrý 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)
.schamann
ÚčastníkMozna mela puvodni otazka byt jinak postavena:
Je konstrukce if (Testfunction()) { sama o sobe spravna? neni bezpecnejsi pouzit treba jiny operator?schamann
ÚčastníkTo ja vim, ze nic nevrati… Otazka byla proc to kazdy kompilator zpracuje jinak, ve win dostanu hlasku OK, a v Lin dostanu Hlasku False. Tedy, ja testuju vysledek Testfunction(), ktery je prazdny. a zajima me proc je vyhodnoceni v ruznych kompilacich ruzne. nikoli to, ze je to samo o sobe blbost.
Mimochodem nevrati „co chce“, vrati neco co win vyhodnoti jako true tedy jakoukoliv hodnotu mimo 0 a pod linuxovou kompilaci vrati 0 protoze vysledek je FALSE. A nebo vrati NULL a pak to kazdy kompilator vyhodnoti jinak a to je to co me zajima.
Muj asi mylny predpoklad na FALSE pochazi z Visual Studia kde programuju uz 20 let. Pokud v Basicu deklaruji funkci Boolean, je vzdy vysledek false, pokud mu neridam hodnotu true.
Vojtěch Vosáhlo
ÚčastníkJak můžete říct že správná odpověď je false? Ten kód koukne na to jestli se 1==1, řekne ano ale pak nic nevrací, tzn na return nikdy nenarazí. Může si teda vrátit co chce.
Řešení je v celku jednoduché. Vždy používat return ve všech částech kde by jste měl. Mnoho IDE by vás to ani nenechalo zkompilovat, vyjela by hláška jako „Not all parts of the code return a value.“ Pokud nic nenastavíte, program si asi dělá trochu co chce.Jinak tu funkce upravená tak aby vždy něco vrátila by vapadala takto ale to asi víte.
boolean TestFunction() { if (true) { return true; break; } return false; }
Pokud to je zakomentované tak samozřejmě nevrátí nic…
rehot79
ÚčastníkPekné riešenie ale možno som našiel niečo jednoduchšie , bez potrebnej vedomosti o elektrotechnike aj keď ja som elektrotechnik, ale na čo si komplikovať život no nie? a cenovo dostupne na Ebay cca 3Eur. Volá sa to ssr-40da relé,je galvanicky oddelene,ovládane už od 3 volt DC .Pridávam link na YouTube
Klik sem Pevne verím že toto pomôže veľa ľudom s touto problematikou .petan
ÚčastníkMrkni sem: http://playground.arduino.cc/Main/ACPhaseControl (bacha, mají přehozeno in a out na Arduinu). Jinak, když zadáš do gůglu „AC Phase Control“ tak toho určitě najdeš dost. Je to v podstatě řízená triaková regulace.
Zbyšek Voda
ÚčastníkDobrý 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.
mitgan
ÚčastníkDěkuji. To mi pomohlo.
M.
posjirka
Účastníknemáš vůbec zač, každopádně bych ten odpor zvětšil alespoň na 1k ideálně 10k.
Bude to jistější.hcdady
ÚčastníkDobrý den, děkuji za pomoc a užitečné rady posjirkovi, chyba byla ve mě. Měl jsem špatně definované piny na tranzistoru. Jinak u toho obvodu jsem odpor R1 úplně zrušil a R2 jsem nechal 100, protože když jsem tam dat 100K tak tranzistor nespínal.
Každopádně ještě jednou děkuji David -
AutorPříspěvky