- Fotók, videók mobillal
- iPhone topik
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Okosóra és okoskiegészítő topik
- Milyen GPS-t vegyek?
- Mobil flották
- Google Pixel topik
- Hónap végén érkezik a Xiaomi Band 10, ára is van
- Netfone
- Az Oppo Find X8 Ultra lett a legvékonyabb kameramobil
-
Mobilarena
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Teasüti
nagyúr
válasz
DrojDtroll #4799 üzenetére
És szervó fogja hajtani a sínen?
Már az 1500 rpm-es szervó is áll leejtős így első hallásra. -
Teasüti
nagyúr
-
Teasüti
nagyúr
válasz
fpeter84 #4761 üzenetére
Hát ez a szemétre való ipari hulladék kategória.
+-20%-al egyszerűen nem lehet mit kezdeni, főleg érdemi munkát végezni.
Kapható egyáltalán igazi páratartalom mérő breakout board kivitelben, vagy csak ilyen tessék-lássék AS szabványú mindegy is kacatok?
Hát ennyi erővel a random generátort is lekérdezhetném és még erőlködni se kell hozzá regiszter olvasással.Elnézést a kirohanásért, de hát ez nevetséges!
-
Teasüti
nagyúr
válasz
DrojDtroll #4720 üzenetére
Anyám ezen mennyi minden van!!
Tud adatot fogadni kikapcsolt megszakításokkal? -
Teasüti
nagyúr
Mit kerestek még itt? Irány az élet! BUÉK!
-
Teasüti
nagyúr
válasz
Janos250 #4708 üzenetére
Fail safe-re igyekszem készíteni az összes projektem, így alapból bele foglalom minden programba egy 8 másodperces időzítéssel.
A kérdés az volt miért nem működik a Nano a WDT reset után? Mit jelent a pin13 villogása? Miért kell teljesen áramtalanítani az eszközt, hogy észhez térjen?
Nem az, hogy miért nincs szükségem WDT-re. -
Teasüti
nagyúr
Jézusom bakker mi a fene történt itt az elmúlt héten???
Ha már feljöttek a villamos motorok, akkor be is dobnék egy kérdést:
milyen bizonyossággal lehet elvégezni egy kontárnak egy 230 VAC motoron való apró módosítást, miszerint ne dobáljon már akkora tüskéket a hálózatra kikapcsoláskor, hogy levágja a mellette lévő ATX tápegységet?
Illetve pontosan milyen áramköri elemek is kellenének ide, amit gyárilag valószínűleg kihagytak a berendezésből?
(Érdekességként: ezt miért nem érzi meg a PC tápja úgy 10-15 méternyi vezetékkel arrébb? Bár az egy APC Smart-UPS mögött van, de emlékeim szerint már az UPS előtti időkben se indult soha újra a gép rejtélyes módon.)Mint ahogy sikerült kiderítenem, valójában nem a Nano bolondul meg, hanem a táp mikor kikapcsolom a gőzelszívót. Egy PW_ON újra lehúzására helyreáll a működés. Feltételezem "beaktivál" az egyik beépített védelem és lekapcsolja a tápot. Remélem legalábbis, hogy ez történik, mert most üzemszerűen újraindítja az uC valahányszor ez történik és egy rövid szünet után megy minden tovább, mintha mi sem történt volna.
Remélhetőleg nem lesz rövid életű.Persze nem volt haszontalan szénné szűrni az összes ki- és bemenetet, hisz így legalább kiküszöböltem az egyéb interferenciákat is, amik eltorzították a led szalagok képét (random jelek az adatbuszon?).
Bypass filter figyel minden tápon, Z-diódák minden adatbuszon (szupresszor diódát nem lehet kapni a boltokban, se PTC biztit). Mikor ezek után is produkálta a jelenséget, akkor már meg kellett próbálnom külön tápról az uC-t, és megdöbbenve látom, hogy hát annak semmi gondja: a táp kapcsol le.
Örülök ennek a tapasztalatnak, végre gyakorlati választ kaptam, illetve - alapos kutatómunkával az ESD protection témakörben - találtam arra a kérdésre, hogy miként érdemes védeni a mikrovezérlőt 24/7-es beépítésnél. ...Amire itt a topikban nemigen kaptam kielégítő válaszokat.
Ennek a kapcsán kérdezem még, hogy egy DC-DC kapcsoló üzemű konverternél kell-e szűrni a tápot?
Vagy mennyire adnak tiszta jelet ezek az ebay-es boost/buck konverterek?MÁS:
A korábbi megbolondulás oka meg a Watchdog maga!
Vmiért a system reset nem működik és ez okozza a pin13 vad villogtatását, amit csak teljes áramtalanítással lehet megoldani. Erre esetleg ötlet? Mi történik ilyenkor? Bootloop?Ezt a beállítást használom, mely Uno-n tökéletesen működött eddig:
//watchdog config
byte resetflag = MCUSR; // save flags for debug
MCUSR = 0; // reset various flags
WDTCSR |= 0b00011000; // see docs, set WDCE, WDE
WDTCSR = 0b01101001; // set WDIE, WDE, and appropriate delay
wdt_reset();Ez azt tudja elvileg, hogy 8 sec timeout után az első megszakításra kódot futtat, a másodikra meg reset-el.
-
Teasüti
nagyúr
A Schottky diódákat ebben a formában értetted?
GND-re és VCC-re húzni az I/O portot ezekkel?
Ezt az áramköri részletet közvetlen a port mellé érdemes berakni?Valamint mi a meglátásod a bypass kondi kapcsán? Lehet ilyet alkalmazni I/O portra is épp úgy, ahogy VCC-re?
Jelenleg nem tudom eldönteni melyik megoldás a legjobb vagy egyáltalán miben különböznek, ha ESD és egyéb magas feszültségű tüskéket kell szűrni:
1. ESD védő dióda soros ellenállással (Zener, de inkább TVS),
2. Schottky-val GND-re és Vcc-re csatolni a portot,
3. bypass kondenzátorral felfogni a zajt/tüskét (vagy ez gátolja a TTL kommunikációt?).Vagy esetleg egyszerre alkalmazom valamennyi megoldást, ahogy a videóban is említésre kerül, hogy a Schottky-val Vcc-re húzni is úgy érdemes, ha a Vcc már védve van a megszaladás ellen egy Z-diódával, ha jól értem a videó(ka)t.
-
Teasüti
nagyúr
Be lehet ezeket szerezni helyileg is boltból, vagy csak online lehet? Nem szeretnék rögtön 100 db-ot venni, és várni a postára sem ha lehet.
Ha más nem, akkor veszek pár TVS diódát hétfőn és megcsinálom azzal.Kellemes ünnepeket mindenkinek!
(#4543) tibi-d
Milyen I2C library-t használsz? Ha az alap Wire, akkor inkább azt kukázd!
Ha az kizárva, akkor meg én inkább kikeresném a chip adatlapjáról a regiszter térképet és magamnak összeraknám azt a pár parancsot, amit használok. I2C eszközöknél eddig semmihez se használtam library-t, jobbnak láttam magam kiolvasni a regisztereket. Nem nagy művészet, még nekem is megy. -
Teasüti
nagyúr
+ javaslom a reset labat 1k-n keresztul felhuzni a tapra, mert ott is van kondi, ami tultoltodhet, attol is meghulyulhet.
Én itt nem látok kondit, ellenben fel van húzva elvileg a reset pin.
De gyakorlatilag nem látok az enyémen egyetlen leágazást sem ellenállás felé. -
Teasüti
nagyúr
Nagyon tetszik ez a tokozás, viszont nem írja az adatlap az amatőröknek, hogy hogy kell használni.
3-6 és 1-es láb mehet egy-egy I/O portra párhuzamosan, majd a 2-es láb a földre?
És egy ilyen mellé nem kell semmi kiegészítő alkatrész és "teljes" ESD védelmet nyújt? Minden háztartási körülmények között valószínűsíthető esetre, beleértve a HBM-et is. -
Teasüti
nagyúr
Z-diódával földre
húznicsatolni a portokat működhet? Mint a Ruggedunio megoldása, csak túlfesz helyett ESD-re való tekintettel.
Vagy mintha vhol olvastam volna, hogy létezik külön ESD ellen védő dióda is.
Esetleg egy bypass filter, mint a betápnál?Még az is eszembe jutott, hogy földelt vezetékkel csavarnám be érpárba az adatbuszokra menő vezetékeket. Ez jó ötlet?
A kapacitív érzékelő viszont kérdőjeles, bár végső elkeseredésemben azt is be lehetne csavarni, de gondolom alaposan hazavágná az érzékenységet. ADCTouch library okán az csak egy kopasz vezeték.Örülök amúgy ennek a tapasztalatnak, máris mennyi új fogalmat tanultam ma!
-
Teasüti
nagyúr
Egy másik berendezés kikapcsolására? Paraszti logikám szerint éppen nem lefelé kéne esnie a fesz.-nek. Meg miért nem esik le minden alkalommal?
Na meg úgy tudom, ha alulfeszt kap, akkor reset van. De ez úgy meghülyül, hogy csak a teljes áramtalanítás segít rajta.
Másrészt meg éppen ezért raktam be a 100 uF-os kondit.A tápnak le kéne reagálni annyi idő alatt, amíg az kisül. Nos, legalábbis ez az elképzelés.
De jogos észrevétel, kipróbálom majd usb-ről meghajtva is. De ekkor nem tudom leárnyékolni, hisz ki kell vennem a dobozból a Nano-t.
Esetleg még azt tudom kipróbálni, hogy berakok egy-egy diódát minden port elé, ami kimenetre van állítva.
Bemenetekre ellenállást, bár a kapacitív érzékelőn kívül minden porton van vmekkora ellenállás. 220 Ohm a szalagok adatbuszai felé és 1k a táp TTL jelszintű vezetékeire.Ezeknek nem kéne megfogni egy ESD-t?
Akkor is levágta mondjuk, ha csak a táp vezetékei voltak rádugva, bár ez nem zárja ki, hogy a lehúzott vezetékekről nem jön be semmi alapesetben.MÁS: ekkor mi történik a résoptóban? Félig lát át a tárcsán és a "lebegés" közepette dobálja a jeleket?
-
Teasüti
nagyúr
válasz
gyapo11 #4527 üzenetére
Raktam két darab 0,1 uF kerámia kondit, egy 10 uF tantalum és egy 100 uF elkót, meg még egy Z-diódát is - biztos, ami biztos - a Nano +5V és GND portjai elé. Beraktam a Nano-t és ezeket egy alufóliába csomagolt dobozkába, ami a táp tetején pihen. Így gondolom a földelés is adott a táp háza és az alufólia közötti kontaktus miatt.
Nos a probléma nem oldódott meg. Most is sikerült kiütni néhány próbálkozás után a gőzelszívóval a rendszert.
Azt nem értem miért nem tér észhez reset-re.
És mit jelent a pin13 folyamatos villogása? -
Teasüti
nagyúr
válasz
gyapo11 #4517 üzenetére
Uhm, kérhetek egy szívességet?
Tudnál/tudnátok írni egy pontos útmutatót bevásárló listával, amit csak beviszek a legközelebbi elektronikai üzletbe és adják ami kell?Fizikailag az atx tápra van rátéve az mcu egy műanyag dobozkában, ha ezt fém dobozra cserélem (esetleg a műanyag dobozkát helyezem fém dobozba, így nem kell foglalkozni a portok szigetelésével) és azt ráhelyezem a tápra, akkor az elégséges földelés? Tekintve, hogy a táp készülékháza le van földelve.
-
Teasüti
nagyúr
Helló!
Segítségre lenne szükségem (ki gondolná?).
Elkészült egy konyhapult világítás ws2812 szalaggal, atx táppal és egy Nano-val. A kapcsolás kapacitív érzékelővel történik.
Gönyörűen működik a rendszer egészen addig, amíg el nem kezdik használni a konyhát, pontosabban a gőzelszívót, ami köré lett telepítve a vezetékezés, fölötte meg a táp és az mcu. Ennek a két oldalán futnak le a vezetékek az egység két felén elhelyezkedő szekrények belső falán, át az alsó lapjukhoz.Éles helyzetben valahányszor kikapcsolásra kerül a kétmotoros elszívó, egész egyszerűen kilövi a szalagokat és pár másodperc elteltével ezt a Nano gyors és folyamatos 13-as led villogással konstatálja. Reset nem segít, csak a teljes áramtalanítás.
Ha lehúzom az összes szalag és a kapcsoló portját és csak a táp (GND, +5VSB, PS_ON, PWR_OK) marad, akkor a motorok bekapcsolására az egységhez közel álló néhány rgb led random jelet kap, kikapcsolásra meg ugyanúgy levág mindent.Hogy tudnám kizárni a két problémát, vagy leszűkíteni a lehetséges okokat?
Van itt egyrészt egy interferencia bekapcsoláskor, amit a futó program elfed (random jelet kapnak a szalagok), valamint egy vélhető tüske valahol a motorok lekapcsolásakor.Kell-e szűrni az atx tápot a +5V portra csatlakoztatásakor? Z-dióda talán, ha tüskéről lehet szó?
A gond, hogy mérni nincs mivel, így csak találgatni lehet.Köszi!
szerk: még mindig fogalmam sincs mit jelentenek a bootloader villogásai a 13-as leden. Erről vkinek vmi infója?
-
Teasüti
nagyúr
Estét!
Volna egy Processing gondom, amiben kérném a segítségetek!
Ezen a projekten ügyködök, már kész is van de sehogy se boldogulok a PC részével.
Sose dolgoztam még a Processing-gel, se semmi egyéb alternatívával, nem volt még szükségem PC-s feldolgozásra.
Így nem meglepő módon nem tudom beüzemelni a linkelt oldalon lévő kódokat, és legfőképpen nem tudom megjeleníteni a grafikont.
Rá tudnátok nézni nekem mi a gáz ezzel?
Bevallom nem áll szándékomban ezt megtanulni se most, se később. Nincs olyan projekt tervben, amihez PC-s feldolgozás kéne.
(Ha sikeres a kísérlet, akkor MCU-s feldolgozás lesz, csak előbb látnom kell mi történik az érzékelőn és a serial monitor ehhez kevés, vagy csak én nem tudok még futó kódból olvasni, mint az operátorok a Mátrixban.)Először is miért van egynél több forráskód eszközönként? Mondjuk a Processing felénél mindhárom fájlt bedobtam a programba külön fülekre és így jónak tűnik, de az Arduino fájlokat egy darabbá ollóztam össze, hogy menjen. Én vagyok primitív, vagy idióta volt aki írta? Vagy hogy gondolta ezt, hogy szétdarabolja a forráskódot?
Alapesetben kapok egy fordítási hibát:
size() cannot be used here.Kihámoztam netről, hogy
setup_()
legyen asetup()
és jó lesz. Látszólag jó is lett, de gyakorlatilag nem csinál semmi látványosat a program, ami úgy tűnik lefut.
Egész este alternatív megoldásokat keresgéltem, de egyetlen eggyel sem boldogulok és ezek között még a Processing tűnik a legegyszerűbb útnak.Köszönöm!
-
Teasüti
nagyúr
válasz
Janos250 #4423 üzenetére
Igen, az 5V-os ágon lesz a led szalag. 120 db 5050 rgb led csak elég lesz.
5 Vsb-n meg a Nano.
Fogalmam sincs kell-e terhelés a többi ágnak, de gondolom ha nem kapcsol be a táp, akkor kiderül.
Gondolom addig nem fog kikapcsolni, amíg nem ad jelet a PS_ON szálon, amire meg majd bekapcsol a led. -
Teasüti
nagyúr
válasz
gyapo11 #4415 üzenetére
Wow! És én még azt hittem fogom a tranzisztort - amit a starter kit-ben találtam - és jól bekötöm bármilyen nem nagy teljesítményű fogyasztó elé és az mcu egyik szabad portjára csak úgy a lá nature.
MÁS:
ATX tápegységnél a bekapcsoló vezetéket (földre húzva on, 5 voltra húzva vagy megszakítva off) ráhúzhatom a táp saját készenléti 5 voltos áramára egy felhúzó ellenállással, hogy alapesetben kikapcsolva maradjon áram alá helyezéskor? (Arduino a készenléti áramkörről üzemel majd.)
Vagy az MCU boot-olása előtt amúgy se kapcsolna be, amíg lebeg a port? Ha igaz az, hogy default bemenetként funkcionál a programfuttatás előtt, akkor elvileg az megszakításnak felel meg és kikapcsolva marad a táp.MÁS:
Szerintetek mennyire jó ötlet beépíteni a Nano-t az ATX tápba, mint készülékház? -
Teasüti
nagyúr
válasz
Janos250 #4398 üzenetére
Értem.
No de hogy hozom létre az objektumokat program alól? Alapesetben fixen deklarálom a program elején, hogy:Class instance1;
Class instance2;De hogy adok nevet az objektumoknak futás közben?
Ez lehet egy tetszőleges változó is?char className = "instance";
loop() {
Class className;
} -
Teasüti
nagyúr
válasz
Janos250 #4395 üzenetére
Elég ritkán szoktam magyarul keresni.
Köszi!
Szóval ez így működhet?loop() {
if (gombnyomás) Touching_class *touch1 = new Touching_class();
if (lefutott a touch1) {
delete touch1;
touch1 = NULL;
}
}Tudnál írni kicsit arról a static változóról a konstruktorban? Épp azon törtem a fejem hogy fogok én dinamikusan címkézni példányokat, vagyis programból sorszámozni: touch1, touch2, touch n+1?
-
Teasüti
nagyúr
Most ismerkedek az OOP-vel és ebben az egyszerű példában teljesen érthető számomra mi a megoldás lényege.
Viszont hogy tudom felszabadítani az egyik példány erőforrásait, praktikusan kitörölve az adott példányt?Az ötletem az volna, hogy több teljesen azonos eseményt is tudjak kezelni egyszerre, és egy esemény "kioldásakor" (triggering) hoznék létre egy példányt az adott osztályból. Viszont ahogy elvégezte az adott példány a feladatát, úgy szeretném lezárni, törölni és felszabadítani a lefoglalt memóriát.
Ez azért volna fontos, hogy jelenleg OOP nélkül csak egyszer tudok meghívni egy funkciót, aminek van egy lefutási ideje több loop() cikluson keresztül. Viszont menet közben szeretném meghívni többször is ugyanazt a funkciót, de más-más paraméterekkel. OOP nélkül ez nem lehetséges, ha jól látom a helyzetet.Példának legyen az esemény egy paraméteres user input, mondjuk egy érintés egy touch slider-en.
Majd a slider pontjával arányosított led szalag adott hosszán lesz egy 0-255 közti felfutás fényerőben (soft on), ami eltart egy pár másodpercig és egy adott funkció végzi a feladatot, két loop() között változóban tárolva az aktuális helyzetet.
Majd a lényeg, hogy még a funkció lejárta előtt több ponton is indítanék egy-egy eseményt, akár 5-6 különböző ponton is egyszerre ha az ember játékos kedvében van (és van elég ram hozzá). -
Teasüti
nagyúr
Most már két párhuzamos vezetéknél járunk? Amiknek mindkét végén mérjük a feszt?
Le vagyok maradva egy körrel.Én arra próbálok választ kapni, hogy 1 db ellenálláshuzalnál ha kapacitást mérek, akkor úgy kb mennyi idő alatt töltődhet fel és sülhet ki a huzal - vagy bármilyen elektrosztatikusan töltött test -, valamint ha magasabb frekvencián vizsgálom akkor vajon mérhetek-e eltérést, ha különböző pontokon földelem a huzalt.
Hisz mondjuk az 1 MOhm-os ellenállás két oldalán teljesen eltérő értékeket mérek.
Remélhetőleg a Touché majd megválaszolja a gyakorlatban ezt a kérdést. -
Teasüti
nagyúr
Akusztikához nem tudok hozzászólni. Nem láttam még ilyen megoldást, azt se tudom mi kell hozzá, és hogy a mikrofon jelét miként kéne feldolgozni, vagy egyáltalán milyen fizikai jelenségen alapul a működési elve. Megváltozik a frekvencia különböző pontokon? Azért ez mégse gitár húr, annak a működését értem. Na meg milyen változók vannak a használatban, pl. számít-e a felületre ható erő nagysága? Mennyire kompakt a rendszer, elrejthető-e?
Ez az ellenálláshuzal - most találkozok először a fogalommal - pont úgy működne, ahogy elképzelem? Minél közelebb érintem meg az ADC-hez, annál erősebb jelet kapok? Már ha így működik a kapacitás mint fizikai jelenség, vagy pedig ugyanazt az értéket fogom kapni bárhol is érintem meg (mint most kicsi méretekben).
Amúgy ez egy jó ötlet, köszönöm! Magam is filóztam rajta alternatívaként, csak sima vezetéket képzeltem el. -
Teasüti
nagyúr
válasz
gyapo11 #4371 üzenetére
Oké, felejtsük el a lézert! Teláltam egy opciót: Lidar Light, de 150 dollár és 1 méter alatt nem szupi.
Vissza a kapacitív érzékelésre, megépítem a Disney Touché-t, aztán meglátom mire megyek vele. Meg kéne szereznem mintát az alu profilból is, hogy egyáltalán elég érzékeny-e az érintésre, vagy mindegy is.Esetleg még olyanokon filóztam, hogy fel lehetne darabolni a sínt annyi darabra, ahány analóg portom van és így csökkenteni a kapacitást.
Vagy sorba kötni a darabokat egy maréknyi ellenállással és így meg lehetne különböztetni a feszültségszintekből melyik darabot fogtam meg.
Mondjuk ez utóbbi pár centi huzalon remekül működik, de ha mákom van, akkor a két méteres lécen talán ellenállásra se lesz szükség. Arra kíváncsi lennék fizikailag miért nem számít hol fogom meg a huzalt, vagy csak nincs akkora felbontásom, hogy lássam pár centinél. Azt gondolnám vhogy úgy kéne működnie, mint egy poti, hogy erősebb a jel, ha közelebb vagyok a porthoz. Vagy át kellene ismételnem az általános iskolás fizikát.Kicsit olvasgatva a témában azért nem egyszerű megtervezni egy ilyet. Nálam a több méteres vezetékezés és a hatalmas érzékelő felület mind alkalmatlanná teszi kapacitív érzékelésre, nem beszélve a majd fellépő parazita kapacitásról.
Arra számítok, hogy elég magasan lesz az alapvonal a jelszintben.Egy nyomom van még, aminek nem jártam utána: vhol láttam egy apró hozzáfűzést, hogy a 2D-s érintő panelnél lehet olyat, hogy a négy sarkán mérni a feszültségeket és amelyik sarokhoz közelebb van az ujjunk, ott lesz erősebb a jelszint. Viszont nem tudom, hogy kvázi össze vannak-e kötve galvanikusan, vagy itt is van vmi elektromos teres trükközés az egymás mellé helyezett absztrakt alakú felületekkel.
Ezért érdekelne, hogy ha a két méteres léc két végén mérek feszültséget, akkor is azonos értékeket fogok-e látni a bemeneten, vagy nem? -
Teasüti
nagyúr
válasz
fpeter84 #4364 üzenetére
Csak egy menő ki-/bekapcsolás effektet szeretnék alkotni. Az érintés pontjától söpör végig a led szalag.
Persze lehetne variálni tartással és húzogatással is (mondjuk ezzel a gesztussal lehetne szabályozni a színhőmérsékletet).A fizikai részéről még nem találtam bővebb infót azon kívül, hogy drót az alufóliára és hát ez így működik.
Tömör alu léccel ez miért ne működne? -
Teasüti
nagyúr
válasz
Teasüti #4362 üzenetére
Capacitive touch slider érdekelne, de nem találok hozzá tutorialt.
Egyetlen egy releváns videót találtam róla, de ehhez meg nincs leírás.
Nézegettem a Disney féle Touché implementálását is Arduino alá, de az meg nem egészen erre való, illetve overkill, meg tanítani kell.
A fenti videó lenne a legjobb, csak annyi infó kell kimenetnek, hogy a hosszú lécet hol érintik meg a két vége között. -
Teasüti
nagyúr
Üdv urak!
Kapacitív érzékelőben van vkinek tapasztalata? Fizikailag lehetséges megkülönböztetni egy szenzoron, hogy kb hol érintették meg? Pl. ha egy led-hez való alu profilt használnék érzékelőnek, akkor lehetséges azt érzékelni, hogy az érintés hozzávetőlegesen melyik pontján történt a 2 méteres profilnak? -
Teasüti
nagyúr
Köszönöm!
Viszont nem látok árakat. Mennyiért adnak egy darab örök licencet egy gépre magánszemélynek?
Na meg ugye én ezt hobbiból csinálom, szóval ha kijön vmi olyan összeg, ami már közelít egy eredeti Arduino Starter Kit árához, akkor csak mosolyogni fogok rajta.
Meg olyan szoftver kéne, ami nincs szétdarabolva a támogatott hardvereket illetően.
Egy mindenest szeretnék: Atmel AVR, AVR32 és ARM támogatás all-in-one, ami szóba jöhet így nekem a nem túl távoli jövőben. -
Teasüti
nagyúr
Látom kreativitásban nem szenved hiányt a társaság, LOOL!!
-
Teasüti
nagyúr
Pedig határozottan ez a szándékom vele.
Én meg épp azt akartam kérdezni, hogy csak úgy ismerkedés szinten milyen másik fejlesztőkörnyezetet volna célszerű tanulmányozni így az Arudino IDE mellett? Arm procikhoz valót. Előny volna, ha 1:1-ben át lehetne ültetni a forráskódot egyik fordítóból a másikba, akár copy&paste a két ablak között. Ez így lehetséges, vagy elölről kell kezdenem az egész mikrovezérlősdit onnantól, hogy "hello world"?
Na meg nagy kérdés, hogy a különböző keretrendszerekhez eltérő függvénykönyvtárak használatosak, vagy továbbra is használhatom az eddig bevált Arduino közösségből merített könyvtárakat? -
Teasüti
nagyúr
válasz
Janos250 #4255 üzenetére
Már meg is jött az első arm alapú vasam, a Leaflet Mapple Mini amit te linkeltél.
Majd kipróbálom, ha unatkozok. De a meglévő projektet nem fogom átültetni arra.
Ez a Nano éppen elég erre a feladatra (rom 99%, ram 75%, GPIO D2-től D13-ig valamint A0-tól A2-ig foglalt, plusz az I2C és UART portok).
(#4262) fpeter84
Ez az RTC nem tud véletlenül 1 hz-nél gyorsabb megszakítást küldeni, de azért vmi épeszű osztással? Csak egy-két nagyságrenddel kéne gyorsabb frekvencia, amiket eddig láttam azok rendre 1 hz-es vagy 1 khz és a fölötti jelet küldenek csak.
Egy kerek 10 hz-el lennék boldog. -
Teasüti
nagyúr
válasz
Janos250 #4253 üzenetére
Ennyire nem sablonosak a menüelemek azért. Ez csak két kiragadott példa volt a kb 60 db-ból.
Na meg a példádban a "brightness" szó ugyanúgy kétszer lesz eltárolva a rom-ban.
Szóval nekem ez olybá tűnik semmivel se foglal kevesebb tárhelyet, mint az én verzióm.
(Mondjuk arról nincs infóm az lcd.print() mennyi extra területet emészt fel, ha szavanként hívom meg.)
Én itt most tárhelyre igyekeztem optimalizálni. Legyen az rom vagy ram - ha nem használod az F makrót.MÁS
Pillanatpákához lehet kapni U alakú lapos hegy helyett tűhegyet, ami a forrasztóállomásokon is van? Elutazom egy időre és viszek pár játékot unaloműzőnek, viszont odahaza csak pillanatforrasztó van és azzal elég nehéz felapplikálni egy tüskesort mondjuk egy Nano-ra. -
Teasüti
nagyúr
válasz
Janos250 #4249 üzenetére
Kajak elméláztam rajta hogy lehetne megszüntetni a karakterláncok ismétlődését, persze nem úgy, hogy szóismétlés nélkül fogalmazom meg a menüt.
Azért nem bontottam le minden egyes string-et szavakra, de 50-60 db menüelemnél nyertem idáig másfél kilobájtot optimalizációval.
(Egyébként ezt a mai világban nevetségesnek tartom, de bakker jól jön másfél KB így a rom végén.)
E helyett:
case 30: //LED max brightness
lcd.print(F("Max brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmax);
break;
case 31: //LED min brightness
lcd.print(F("Min brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmin);
break;Ezzel és hasonlókkal:
void valami()
{
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
}
...
case 30: //LED max brightness
lcd.print(F("Max"));
goto case31;
break;
case 31: //LED min brightness
lcd.print(F("Min"));
case31:
lcd.print(F(" brightness:"));
valami();
if (case == 31) lcd.print(Bmin);
else lcd.print(Bmax);
break; -
Teasüti
nagyúr
Szia!
Nincs véletlen arra vmi tipped, vagy vkinek vmi tippe, hogy miként tudnám megspórolni a középső három ismétlődő sort?case 30: //LED max brightness
lcd.print(F("Max brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmax);
break;
case 31: //LED min brightness
lcd.print(F("Min brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmin);
break;Van vagy 20 db ilyenem. Gondolkodtam goto-n, de azért ki-be ugrálni elég hajmeresztő volna (volt fak. prog. tanárom forogna a sírjában, ha televágnám a programot goto-val
). Más nem jut eszembe hirtelen. Illetve nem ismerem annyira a nyelvet, hogy van-e erre megoldás. Mondjuk egy dinamikus goto? Aminek egy változóban lehetne megadni hova ugorjon? Praktikusan a switch case változó szerint.
Köszi!Szétszedtem két külön switch-re, kettő között meg if-ben vizsgálom, hogy be kell-e szúrni e három sort.
-
Teasüti
nagyúr
Kérhetek egy kis segítséget C++-hoz?
Statikus változónál jól értem, hogy az adott funkció legelső meghívásakor történik csak deklaráció?
Vagyis az alábbi kód szemantikailag helyes, ha a hys1 és 2 változónak csak deklaráláskor szeretnék feltétel nélkül értéket adni?int temp1, temp2;
temp1 = analogRead(A0);
temp2 = analogRead(A1);
static int hys1 = temp1, hys2 = temp2;
if (temp1 > hys1 + 5 || temp1 < hys1 - 5) hys1 = temp1;
if (temp2 > hys2 + 5 || temp2 < hys2 - 5) hys2 = temp2;(#4243) tvamos
Szép munka! -
Teasüti
nagyúr
Ha fehér színt is szeretnél max fényerőn, akkor 60 mA-el kell számolni ledenként. Feltételezve, hogy 5050-es ledeket használsz. Ez alapján ha van elképzelés mennyit fogsz rendelni, akkor ehhez kell méretezni a tápot.
Én 5 voltost vennék, az a legpraktikusabb digitális szalaghoz (már ha nem direkt 12V-os digitális szalagot veszel, ahol hármas csoportokban vezérelhetők a ledek - szobához még ez is praktikus lehet), na meg a Nano is 5 voltról megy. Bár ahhoz a kollégák úgyis külön tápot fognak javasolni, mondjuk egy fölösleges usb töltőt (én mondjuk leszartam, annyira nem ingadozik a feszültség terhelésre, hogy hibázzon az Arduino a közös tápon).
Teljesítménytől függően ez lehet laptoptöltő formátum, vagy ilyen rack mount amiből itt kapható akár 40 Amperes is 5 Volton. De lehet próbálkozni akár PC táppal is, ha van fölös otthon. -
Teasüti
nagyúr
Ez azért van, mert a loop() másodpercenként több ezerszer lefut és amennyiben egy ciklus idejénél tovább tartod nyomva a gombot (
), úgy ki-bekapcsolgat a led, aztán mikor felengeded akkor teljesen random, hogy épp melyik állapotban lesz.
Ezért szokás egy változóval figyelni a gomb állapotát és minden ciklusban összehasonlítani az előző állapottal, ami ha megegyezik a jelenlegivel, akkor nem futsz fölösleges köröket. Ha nem egyezik meg a jelenlegivel, akkor ez alkalommal lett lenyomva a gomb, mely átállítja a változót is és a következő körben már nem fog beaktiválni.
Én ezt a módszert szoktam alkalmazni gombnyomásra, vagy bármi egyéb digitális jelzésre:
//button press
if (digitalRead(button) == LOW && !pressed) {
buttonOn = !buttonOn;
pressed = true;
Serial.println("Pressed");
}
else if (digitalRead(button) == HIGH) pressed = false;Ezzel a kóddal pontosan úgy fog működni a gomb, ahogy azt az ember várná. Már ha kapcsolóként akarod, nem pedig "nyomvatartósként". Utóbbinál nyilván nem kell akkor szűrni a jelet, elég annyi, hogy a buttonOn változót nem csak átbillented, hanem konkrétan meghatározod milyen értéket vegyen fel lenyomott és felengedett állapotban.
(#4200) Tankblock
Ez nem erre van kitalálva.
A kolléga egy-egy gombnyomásra akarja ki- és bekapcsolni. A késleltetéssel a prell-t szűrőd, viszont a feladatot nem oldja meg, hisz nyomva tartásnál villogtatni fogja a ledet, ha X időközönként újra és újra átbillenti a buttonOn változót, amíg tartod a gombot. -
Teasüti
nagyúr
Nincs felhúzó ellenállásod. Próbáld ki ezt:
pinMode(button, INPUT_PULLUP)
!
Valamint ugyan elektronikában analfabéta vagyok, de mitől lenne a jelenlegi felállásban HIGH, ha földre húzod a gombbal és alapból nincs felhúzva? Azon kívül, hogy nyitott áramkörnél lebeg a port és néha lehet pont átesik HIGH-ra. Vagyis, ha a lenyomást akarod vizsgálni, akkor az LOW lesz a gombnyomásra. -
Teasüti
nagyúr
WOW!
MÁS
Uhm nem emlékszem rá, hogyan is kell két integer-be konvertált idővel számolni?
Mondjuk ki akarom vonni a 915-ből (9 óra 15 perc) a 845-öt. És 30 percet kéne eredményül kapnom.
Tudnom kéne nem csak azt, hogy egy adott időpont elérkezett, hanem azt is, hogy mennyi idő telt el azóta.
Kérhetnék erre tippet?Ok, percekben kell számolni, nem órában és percben. De buta vagyok.
-
Teasüti
nagyúr
Kivágtam, ami nem létszükséglet (távirányító gombjait 0..9 közt), befejeztem minden mást és hivatalosan is elkészültnek tekinthető a v1.0.
Ezt igencsak ki kellett centiznem. A program kereken 30720 bájtot foglal a rom-ban...
...a rendelkezésre álló 30720 bájtból!!(#4162) zka67
Nem mondom, hogy ebből mindent értek, viszont volna egy kérdésem.
A switch nem hatékonyabb kód, mint az if?
Nem arra lett kitalálva, hogy 110 db if helyett legyen inkább 110 db switch case? -
Teasüti
nagyúr
SD-re? Ennyi erővel be lehetne vetni külső ROM-ot is, na de hogy veszem rá arra az AVR-t, hogy külső tárhelyre töltse fel az IDE a kódot és onnan futtassa a programot?
VAGY megtanulok programozni, ha ez az osztálykezelés ennél hatékonyabban el tudja végezni mindezt.
Na meg mások vígan menüznek Atmel328-as procikon az enyémnél bonyolultabbnak tűnő projektekben, így szerintem én csinálok vmit rosszul. -
Teasüti
nagyúr
Üdv urak!
Nagy a baj.
Elkezdtem menüt faragni 1604-es karakteres lcd-re és hozzá egy utasításkezelő rutint, viszont olyan hatalmas lett (és még nincs 100% kész), hogy máris elfogyott a rom.
Nézegettem kész megoldásokat, viszont az osztálykezelés nekem kínai, így state machine-ben csináltam kézzel az összes lehetséges opciót. Nos ez zsákutca.
Kérhetnék segítséget hogy lehetne az alábbit megoldani kisebb kóddal?
Az osztályokban történő kódolás miben különbözik ettől? Azon kívül, hogy olyan bonyolult, hogy beleszagolni se tudok.
Esetleg egy iszonyú szájbarágós tutorial osztálykezelésre? Igazából még azt sem tudom mire jó ez, csak láttam, hogy ebben írtak menüket mások.Az alsó semmi extra, csak sorszámozott képernyők az LCD-n. A menu változó hivatkozik egy adott oldalra, mely tartalmat jeleníti meg. A felső funkció pedig a távirányító egy adott gombjára* (külső switch) és adott oldalra menüben (belső switch) csinál vmit: lapozás, értékadás, stb.
*pl. távirányító 1-9 számgombjai, vagy a kurzor nyilai a numerikus bill.-en vett helyei alapján 14 - balra, 16 - jobbra, 15 - OK, stb.
void menuHandler(byte button) {
if (inMenu) {
lcd_update = true;
switch (button) {
case 10:
switch (menu) {
case 81:
rtc[5] = 0;
menu++;
break;
case 82:
rtc[4] = 0;
menu++;
break;
case 83:
rtc[3] = 0;
menu++;
break;
case 84:
rtc[2] = 0;
menu++;
break;
case 85:
rtc[1] = 0;
menu++;
break;
case 86:
rtc[0] = 0;
menu = 80;
break;
case 91:
evening[3] = 0;
menu++;
break;
case 92:
evening[2] = 0;
menu++;
break;
case 93:
evening[1] = 0;
menu++;
break;
case 94:
evening[0] = 0;
menu = 90;
break;
case 101:
morning[3] = 0;
menu++;
break;
case 102:
morning[2] = 0;
menu++;
break;
case 103:
morning[1] = 0;
menu++;
break;
case 104:
morning[0] = 0;
menu = 100;
break;
}
break;
case 1:
switch (menu) {
case 81:
rtc[5] = 1;
menu++;
break;
case 82:
rtc[4] = 1;
menu++;
break;
case 83:
rtc[3] = 1;
menu++;
break;
case 84:
rtc[2] = 1;
menu++;
break;
case 85:
rtc[1] = 1;
menu++;
break;
case 86:
rtc[0] = 1;
menu = 80;
break;
case 91:
evening[3] = 0;
menu++;
break;
case 92:
evening[2] = 0;
menu++;
break;
case 93:
evening[1] = 0;
menu++;
break;
case 94:
evening[0] = 0;
menu = 90;
break;
case 101:
morning[3] = 0;
menu++;
break;
case 102:
morning[2] = 0;
menu++;
break;
case 103:
morning[1] = 0;
menu++;
break;
case 104:
morning[0] = 0;
menu = 100;
break;
}
break;
case 2:
switch (menu) {
case 81:
rtc[5] = 2;
if (rtc[4] > 3) rtc[4] = 3;
menu++;
break;
case 82:
rtc[4] = 2;
menu++;
break;
case 83:
rtc[3] = 2;
menu++;
break;
case 84:
rtc[2] = 2;
menu++;
break;
case 85:
rtc[1] = 2;
menu++;
break;
case 86:
rtc[0] = 2;
menu = 80;
break;
case 91:
evening[3] = 0;
menu++;
break;
case 92:
evening[2] = 0;
menu++;
break;
case 93:
evening[1] = 0;
menu++;
break;
case 94:
evening[0] = 0;
menu = 90;
break;
case 101:
morning[3] = 0;
menu++;
break;
case 102:
morning[2] = 0;
menu++;
break;
case 103:
morning[1] = 0;
menu++;
break;
case 104:
morning[0] = 0;
menu = 100;
break;
}
break;
case 3:
switch (menu) {
case 82:
rtc[4] = 3;
menu++;
break;
case 83:
rtc[3] = 3;
menu++;
break;
case 84:
rtc[2] = 3;
menu++;
break;
case 85:
rtc[1] = 3;
menu++;
break;
case 86:
rtc[0] = 3;
menu = 80;
break;
case 91:
evening[3] = 0;
menu++;
break;
case 92:
evening[2] = 0;
menu++;
break;
case 93:
evening[1] = 0;
menu++;
break;
case 94:
evening[0] = 0;
menu = 90;
break;
case 101:
morning[3] = 0;
menu++;
break;
case 102:
morning[2] = 0;
menu++;
break;
case 103:
morning[1] = 0;
menu++;
break;
case 104:
morning[0] = 0;
menu = 100;
break;
}
break;
case 4:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 4;
menu++;
break;
case 83:
rtc[3] = 4;
menu++;
break;
case 84:
rtc[2] = 4;
menu++;
break;
case 85:
rtc[1] = 4;
menu++;
break;
case 86:
rtc[0] = 4;
menu = 80;
break;
}
break;
case 5:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 5;
menu++;
break;
case 83:
rtc[3] = 5;
menu++;
break;
case 84:
rtc[2] = 5;
menu++;
break;
case 85:
rtc[1] = 5;
menu++;
break;
case 86:
rtc[0] = 5;
menu = 80;
break;
}
break;
case 6:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 6;
menu++;
break;
case 84:
rtc[2] = 6;
menu++;
break;
case 86:
rtc[0] = 6;
menu = 80;
break;
}
break;
case 7:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 7;
menu++;
break;
case 84:
rtc[2] = 7;
menu++;
break;
case 86:
rtc[0] = 7;
menu = 80;
break;
}
break;
case 8:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 8;
menu++;
break;
case 84:
rtc[2] = 8;
menu++;
break;
case 86:
rtc[0] = 8;
menu = 80;
break;
}
break;
case 9:
switch (menu) {
case 82:
if (rtc[5] < 2) rtc[4] = 9;
menu++;
break;
case 84:
rtc[2] = 9;
menu++;
break;
case 86:
rtc[0] = 9;
menu = 80;
break;
}
break;
case 15:
switch (menu) {
case 51:
menu = 52;
break;
case 52:
L1switch = analogRead(A1);
break;
case 53:
menu = 54;
break;
case 54:
L2switch = analogRead(A2);
break;
case 56:
L1max = 0;
L1min = 1023;
L2max = 0;
L2min = 1023;
EEPROM.put(0, L1max);
EEPROM.put(2, L1min);
EEPROM.put(10, L2max);
EEPROM.put(12, L2min);
menu = 57;
break;
default:
goto select;
break;
}
break;
case 14:
if (menu >= 20 && menu < 30) menu = 11;
else if (menu < 20) {
menu = 1;
inMenu = false;
}
if (menu >= 40 && menu < 50) menu = 12;
if (menu == 60 || menu == 61) menu = 13;
if (menu >= 70 && menu < 80) menu = 14;
if (menu > 80 && menu <= 86) {
menu--;
break;
}
if (menu > 90 && menu <= 94) {
menu--;
break;
}
switch (menu) {
case 30:
menu = 20;
EEPROM.put(4, Bmax);
break;
case 31:
menu = 21;
EEPROM.put(5, Bmin);
break;
case 32:
menu = 22;
EEPROM.put(6, standby_light);
break;
case 33:
menu = 23;
EEPROM.put(7, default_timeout);
break;
case 34:
menu = 24;
EEPROM.put(8, white);
break;
case 35:
menu = 25;
EEPROM.put(9, gamma_correction);
break;
case 50:
menu = 40;
break;
case 51:
menu = 41;
break;
case 52:
menu = 41;
EEPROM.put(14, L1switch);
break;
case 53:
menu = 42;
break;
case 54:
menu = 42;
EEPROM.put(16, L2switch);
break;
case 55:
menu = 43;
break;
case 56:
menu = 44;
break;
case 57:
menu = 44;
break;
case 64:
menu = 60;
EEPROM.put(18, lcd_light);
break;
case 63:
menu = 61;
EEPROM.put(19, lcd_maxBrightness);
break;
case 80:
setRTC();
menu = 70;
break;
case 90:
EEPROM.put(20, evening);
menu = 71;
break;
case 100:
EEPROM.put(24, morning);
menu = 72;
break;
}
break;
case 16:
select:
if (menu >= 80 && menu < 86) menu++;
if (menu >= 90 && menu < 94) menu++;
if (menu >= 100 && menu < 104) menu++;
switch (menu) {
case 9:
menu = 10;
break;
case 10:
menu = 11;
break;
case 11:
menu = 20;
break;
case 12:
menu = 40;
break;
case 13:
menu = 60;
break;
case 14:
menu = 70;
break;
case 20:
menu = 30;
break;
case 21:
menu = 31;
break;
case 22:
menu = 32;
break;
case 23:
menu = 33;
break;
case 24:
menu = 34;
break;
case 25:
menu = 35;
break;
case 40:
menu = 50;
break;
case 41:
menu = 51;
break;
case 42:
menu = 53;
break;
case 43:
menu = 55;
break;
case 44:
menu = 56;
break;
case 51:
menu = 52;
break;
case 53:
menu = 54;
break;
case 60:
menu = 64;
break;
case 61:
menu = 63;
break;
case 70:
menu = 80;
break;
case 71:
menu = 90;
break;
case 72:
menu = 100;
break;
}
break;
case 18:
if (menu > 10 && menu < 20) menu--;
if (menu >= 20 && menu <= 25) menu--;
if (menu >= 40 && menu <= 44) menu--;
if (menu == 30 && Bmax < 254) {
Bmax += 1;
if (Bmax > maxBrightness) Bmax = maxBrightness;
}
if (menu == 33 && default_timeout < 119) default_timeout++;
if (menu == 52 && L1switch < L1max) L1switch++;
if (menu == 54 && L2switch < L2max) L2switch++;
if (menu == 60 || menu == 61) menu--;
if (menu == 63 && lcd_maxBrightness < 255) lcd_maxBrightness += 5;
if (menu >= 70 && menu <= 72) menu--;
switch (menu) {
case 10:
menu = 14;
break;
case 19:
menu = 25;
break;
case 39:
menu = 44;
break;
case 31:
Bmin += 1;
if (Bmin > Bmax) Bmin = Bmax;
break;
case 32:
standby_light = true;
break;
case 34:
white = true;
break;
case 35:
gamma_correction = true;
break;
case 50:
auto_light = true;
break;
case 55:
auto_dim = true;
break;
case 59:
menu = 61;
break;
case 64:
lcd_light = true;
break;
case 69:
menu = 72;
break;
}
break;
case 12:
if (menu < 15) menu++;
if (menu >= 20 && menu <= 25) menu++;
if (menu >= 40 && menu <= 44) menu++;
if (menu == 31 && Bmin > 0) Bmin--;
if (menu == 33 && default_timeout > 10) default_timeout--;
if (menu == 52 && L1switch > L1min) L1switch--;
if (menu == 54 && L2switch > L2min) L2switch--;
if (menu == 60 || menu == 61) menu++;
if (menu == 63 && lcd_maxBrightness > 20) lcd_maxBrightness -= 5;
if (menu >= 70 && menu <= 72) menu++;
switch (menu) {
case 15:
menu = 11;
break;
case 26:
menu = 20;
break;
case 45:
menu = 40;
break;
case 30:
Bmax -= 1;
if (Bmax < Bmin) Bmax = Bmin;
break;
case 32:
standby_light = false;
break;
case 34:
white = false;
break;
case 35:
gamma_correction = false;
break;
case 50:
auto_light = false;
break;
case 55:
auto_dim = false;
break;
case 62:
menu = 60;
break;
case 64:
lcd_light = false;
break;
case 73:
menu = 70;
break;
}
break;
}
Serial.print(F("Menu: "));
Serial.println(menu);
}
}
void lcd_menu(uint16_t page) {
byte temp;
if (menu <= 80 || menu == 90 || menu == 100) {
lcd.clear();
lcd.setCursor(0, 0);
}
switch (page) {
case 0: //welcome
lcd.print(F("Stairlights v1.0"));
lcd.setCursor(0, 1);
lcd.print(F("by Istvan Kocsis"));
break;
case 1:
if (mode == 0) lcd.print(F("Standby..."));
else if (mode == 255) lcd.print(F("Adjusting..."));
else lcd.print(F("Active..."));
lcd.setCursor(0, 1);
lcd.print(F("Press OK to menu"));
break;
case 2:
if (mode == 0) lcd.print(F("Standby..."));
else if (mode == 255) lcd.print(F("Adjusting..."));
else lcd.print(F("Active..."));
lcd.setCursor(0, 1);
lcd.print(F("Press any to set"));
break;
case 3:
if (mode == 0) lcd.print(F("Standby..."));
else if (mode == 255) lcd.print(F("Adjusting..."));
else lcd.print(F("Active..."));
lcd.setCursor(0, 1);
lcd.print(F("FPS:"));
if (fps > 9) lcd.setCursor(5, 1);
else lcd.setCursor(6, 1);
lcd.print(fps);
lcd.setCursor(8, 1);
lcd.print(F("CPS:"));
lcd.print(cps);
break;
case 4:
readRTC();
lcd.print(F("Time:"));
lcd.setCursor(8, 0);
lcd.print(rtc[5]);
lcd.print(rtc[4]);
lcd.print(F(":"));
lcd.print(rtc[3]);
lcd.print(rtc[2]);
lcd.print(F(":"));
lcd.print(rtc[1]);
lcd.print(rtc[0]);
lcd.setCursor(0, 1);
lcd.print(F("FPS:"));
if (fps > 9) lcd.setCursor(5, 1);
else lcd.setCursor(6, 1);
lcd.print(fps);
lcd.setCursor(8, 1);
lcd.print(F("CPS:"));
lcd.print(cps);
break;
case 9: //inMenu
lcd.write(byte(2));
lcd.setCursor(2, 0);
lcd.print(F("to scroll"));
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(1, 1);
lcd.print(F(" to go back"));
break;
case 10: //inMenu
lcd.write(byte(1));
lcd.setCursor(2, 0);
lcd.print(F("or OK"));
lcd.setCursor(0, 1);
lcd.print(F("to select"));
break;
case 11: //LED settings
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("settings"));
break;
case 12: //Sensor settings
lcd.write(byte(3));
lcd.setCursor(2, 0);
lcd.print(F("Ambient light"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.print(F("sensor settings"));
break;
case 13: //LCD settings
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Display"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("settings"));
break;
case 14: //time settings
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Date/Time"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("setting"));
break;
case 20: //LED submenu
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED max"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("brightness"));
break;
case 21: //LED submenu
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED min"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("brightness"));
break;
case 22: //LED submenu
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED standby"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("running light"));
break;
case 23: //LED submenu
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("timeout"));
break;
case 24: //LED submenu
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED color"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("set"));
break;
case 25: //LED gamma
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LED gamma"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("correction"));
break;
case 30: //LED max brightness
lcd.print(F("Max brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmax);
break;
case 31: //LED min brightness
lcd.print(F("Min brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(Bmin);
break;
case 32: //LED standby
lcd.print(F("Standby light:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
if (standby_light) lcd.print(F("ON"));
else lcd.print(F("OFF"));
break;
case 33: //LED timeout
lcd.print(F("LED timeout:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(default_timeout);
lcd.print(F(" sec"));
break;
case 34: //LED color
lcd.print(F("Default mode:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
if (white) lcd.print(F("White"));
else lcd.print(F("Color"));
break;
case 35: //LED gamma
lcd.print(F("Correction:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
if (gamma_correction) lcd.print(F("ON"));
else lcd.print(F("OFF"));
break;
case 40: //Sensor auto light
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Ambient light"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("activating"));
break;
case 41: //Sensor adjust
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Primary light"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("sensor"));
break;
case 42: //Sensor adjust
lcd.write(byte(3));
lcd.setCursor(1, 0);
lcd.print(F("Secondary light"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("sensor"));
break;
case 43:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Auto dimming"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("in the dark"));
break;
case 44: //Sensor calibration
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Light sensor"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("recalibration"));
break;
case 50:
lcd.print(F("Only in dark?"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
if (auto_light) lcd.print(F("Auto ON"));
else lcd.print(F("Always ACTIVE"));
break;
case 51:
lcd.print(F("OK: read sensor"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(1, 1);
lcd.print(F(": to adjust"));
break;
case 52:
temp = map(L1switch, L1min, L1max, 0, 100);
lcd.print(F("Sensitivity:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
if (L1switch > 99) lcd.setCursor(2, 1);
else if (L1switch > 9) lcd.setCursor(3, 1);
else lcd.setCursor(4, 1);
lcd.print(L1switch);
if (temp < 10 ) lcd.setCursor(7, 1);
else lcd.setCursor(6, 1);
lcd.print(temp);
lcd.print(F("% of max"));
break;
case 53:
lcd.print(F("OK: read sensor"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(1, 1);
lcd.print(F(": to adjust"));
break;
case 54:
temp = map(L2switch, L2min, L2max, 0, 100);
lcd.print(F("Sensitivity:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
if (L2switch > 99) lcd.setCursor(2, 1);
else if (L2switch > 9) lcd.setCursor(3, 1);
else lcd.setCursor(4, 1);
lcd.print(L2switch);
if (temp < 10 ) lcd.setCursor(7, 1);
else lcd.setCursor(6, 1);
lcd.print(temp);
lcd.print(F("% of max"));
break;
case 55:
lcd.write(byte(2));
lcd.setCursor(2, 0);
lcd.print(F("Auto dimming"));
lcd.setCursor(0, 1);
if (auto_dim) lcd.print(F("ON: dim in dark"));
else lcd.print(F("OFF: full power"));
break;
case 56:
lcd.print(F("OK to reset"));
lcd.setCursor(0, 1);
lcd.print(F("stored values?"));
break;
case 57:
lcd.print(F("Calibration data"));
lcd.setCursor(0, 1);
lcd.print(F("cleared!"));
break;
case 60:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LCD backlight"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("mode"));
break;
case 61:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("LCD"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("brightness"));
break;
case 63:
lcd.print(F("Brightness:"));
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.setCursor(2, 1);
lcd.print(lcd_maxBrightness);
break;
case 64:
lcd.write(byte(2));
lcd.setCursor(2, 0);
lcd.print(F("Auto dimming"));
lcd.setCursor(0, 1);
if (lcd_light) lcd.print(F("Always ON"));
else lcd.print(F("Auto OFF"));
break;
case 70:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Set time"));
lcd.setCursor(0, 1);
lcd.write(byte(4));;
break;
case 71:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Set start of"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("night mode"));
break;
case 72:
lcd.write(byte(3));
lcd.setCursor(3, 0);
lcd.print(F("Set end of"));
lcd.setCursor(0, 1);
lcd.write(byte(4));
lcd.setCursor(3, 1);
lcd.print(F("night mode"));
break;
case 80:
lcd.print(F("Time:"));
lcd.setCursor(8, 0);
lcd.print(rtc[5]);
lcd.print(rtc[4]);
lcd.print(F(":"));
lcd.print(rtc[3]);
lcd.print(rtc[2]);
lcd.print(F(":"));
lcd.print(rtc[1]);
lcd.print(rtc[0]);
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.write(byte(1));
break;
case 81:
lcd.setCursor(8, 0);
lcd.print(F("_"));
lcd.print(rtc[4]);
break;
case 82:
lcd.setCursor(8, 0);
lcd.print(rtc[5]);
lcd.print(F("_"));
lcd.print(F(":"));
lcd.print(rtc[3]);
break;
case 83:
lcd.setCursor(9, 0);
lcd.print(rtc[4]);
lcd.print(F(":"));
lcd.print(F("_"));
lcd.print(rtc[2]);
break;
case 84:
lcd.setCursor(11, 0);
lcd.print(rtc[3]);
lcd.print(F("_"));
lcd.print(F(":"));
lcd.print(rtc[1]);
break;
case 85:
lcd.setCursor(12, 0);
lcd.print(rtc[2]);
lcd.print(F(":"));
lcd.print(F("_"));
lcd.print(rtc[0]);
break;
case 86:
lcd.setCursor(14, 0);
lcd.print(rtc[1]);
lcd.print(F("_"));
break;
case 90:
lcd.print(F("Evening starts at"));
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.setCursor(7, 1);
lcd.print(evening[3]);
lcd.print(evening[2]);
lcd.print(F(":"));
lcd.print(evening[1]);
lcd.print(evening[0]);
break;
case 91:
lcd.setCursor(7, 1);
lcd.print(F("_"));
lcd.print(evening[2]);
break;
case 92:
lcd.setCursor(7, 1);
lcd.print(evening[3]);
lcd.print(F("_"));
lcd.print(F(":"));
lcd.print(evening[1]);
break;
case 93:
lcd.setCursor(8, 1);
lcd.print(evening[2]);
lcd.print(F(":"));
lcd.print(F("_"));
lcd.print(evening[0]);
break;
case 94:
lcd.setCursor(10, 1);
lcd.print(evening[1]);
lcd.print(F("_"));
break;
case 100:
lcd.print(F("Morning starts at"));
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.setCursor(7, 1);
lcd.print(morning[3]);
lcd.print(morning[2]);
lcd.print(F(":"));
lcd.print(morning[1]);
lcd.print(morning[0]);
break;
case 101:
lcd.setCursor(7, 1);
lcd.print(F("_"));
lcd.print(morning[2]);
break;
case 102:
lcd.setCursor(7, 1);
lcd.print(morning[3]);
lcd.print(F("_"));
lcd.print(F(":"));
lcd.print(morning[1]);
break;
case 103:
lcd.setCursor(8, 1);
lcd.print(morning[2]);
lcd.print(F(":"));
lcd.print(F("_"));
lcd.print(morning[0]);
break;
case 104:
lcd.setCursor(10, 1);
lcd.print(morning[1]);
lcd.print(F("_"));
break;
}
} -
Teasüti
nagyúr
válasz
Janos250 #4132 üzenetére
Aha, kezd összeállni a dolog.
Viszont azt megnézném hogy hozod össze delay nélkül mikroszekundum szinten a dolgot!
Mondjuk 1. bit elindít, majd van x uS-od a következő bitig. Kettő között mit csinálsz? A loop() biztos nem lép tovább, amíg be nem fejeződött a frissítés...
Mert ha bejön egy megszakítás, akkor oké az lemegy, de amúgy meg csak malmozol amíg végzel a szalaggal.
Vagy itt is van már loop1, loop2, stb? Kérdéses mi hasznosat lehet csinálni ezekben a hangyaf.sznyi időszeletekben.Komolyabb számításba tuti nem lehet belekezdeni.
-
Teasüti
nagyúr
válasz
Janos250 #4130 üzenetére
Egy adott bit küldésének a megkezdése és következő közötti idő elég ahhoz, hogy a megszakítások lekezelésre kerüljenek.
Tehát ha jól látom a dolgot, akkor ez annyival nyújt többet a bitbang-nél, hogy a proci addig malmozik és lekezeli az ISR-t, amíg két bit között eltelik némi idő.
Na várjunk, a programban ez hogy működik? Bitbang-nél ugye delay-ek vannak a LOW és HIGH értékek között és ugye ki van lőve a megszakítás az időzítés miatt.
Ennél viszont ezt hogy lehet kivitelezni delay nélkül? Gondolom a loop() nem fogja átugrani az első bit után az adatküldést a következő részre a programban, szóval mit fog csinálni két bit között? Ugyanúgy delay-ezik, nem? Csak az egyik port húzogatása helyett a pwm vezérlőt buzerálja (ami amúgy időben gyorsabb volna, mint egy portot felhúzni HIGH-ra?), de a köztes időben épp úgy malmozik, mint a bitbang-nél?
Egyelőre csak annyit értek ebből, hogy nem kell kikapcsolni a megszakításokat, mert izomból megoldja a köztes időben az ISR-t. De akkor ez az idő nem lenne ugyanúgy elég bitbang esetében is (nem tudom melyik művelet gyorsabb)? -
Teasüti
nagyúr
válasz
Janos250 #4126 üzenetére
Na várj, még mindig le vagyok maradva ott, hogy WS2812 vezérléséhez nem kell PWM - mivel hogy az a szalagon van intergálva.
A led szalag library-k bitbang-elnek legjobb tudomásom szerint, valamint az se igazán látszik nekem, hogy ehhez az adatküldéshez miképp kapcsolódik a PWM vezérlés az MCU-n.
A kitöltési tényezőt variálja minden egyes bit küldésekor? Tehát ha jól értem, akkor úgy lövi be a frekvenciát és a kitöltési tényezőt, hogy megfeleljen a WS2812 specifikációjában szereplő 1 és 0 kód időzítésének. Vagyis egy adott setup-ban az MCU pwm vezérlője csak 1-eseket küld, másik setup-ban csak 0-kat. És két bit között folyamatosan változtatja a paraméterezést a szoftver? Ez nagyon perverz módszernek hangzik, még ha lehetséges is. Az MCU pwm vezérlőjének basztatásához nem kell a processzor? Vagy hogy lesz ebből "multitasking"? Teszem azt ha bejön egy megszakítás és az ISR végrehajtása közben megszakad az adatküldés, mert nincs idő basztatni a PWM vezérlőt?
Még mindig nem világos ARM-n például hogy lehet UART RX-en adatot fogadni, miközben egy WS2812 ledszalagot frissítünk.szerk: amúgy köszönöm a fenti linkeket, meg is rendelek egy Maple Mini klónt.
Az F103C8T6 és az F103CBT6 van egy lényeges különbség ami említésre érdemes, legalábbis első ránézésre utóbbi kétszer akkora ROM-ja elég meggyőző.
DMA-t használta itt már vki adatfogadásra?
Neten vajmi kevés infó van a DMA használatáról.
Pedig mekkora királyság lenne már megszakítás nélkül adatot fogadni! -
Teasüti
nagyúr
válasz
Janos250 #4104 üzenetére
A Cortexen a PWM hardver alapon egyszerűen megy, akár több is. Adott frekivel - ha kell - akár 4 különböző kitöltöttséget is tudsz timerenként.
Hardver alapon, nem kell interrupt. Ez nagyon hasznos, pl. ha valaki WS2812 pixelenként színváltós LED szalagot akar programozni. Elindítja a PWM jelet, és akár van valami interrupt, akár nincs, a PWM jel hossza nem változik.
Erről kérhetnék egy kis magyarázatot?
WS2812-höz úgy tudom nem használunk PWM.et, a szalagnak van saját vezérlője.
A library viszont kikapcsolja a megszakításokat, amíg frissíti a szalagot, hogy semmi ne szóljon bele az időzítésbe.
Így viszont nincs megszakítás és ha ekkor bejön egy jel - mondjuk UART RX porton -, akkor az megy a lecsóba Atmel-en legalábbis.
ARM-en erre van esetleg vmi megoldás?
A WS2812 szalag miatt kérdem elsősorban, mivel erre épülnek a projektjeim.
Köszi! -
Teasüti
nagyúr
válasz
Teasüti #4068 üzenetére
Nem tudom kell-e konfigurálni regiszter szinten az AVR-t a beérkező jel megjegyzésére kikapcsolt megszakítások mellett, hogy aztán bekapcsolás után rögtön kezdje meg az ISR-t, vagy alapból így működik...
De gyakorlati jelentősége úgy tűnik nem nagyon van. Ha éppen rosszkor is jön be a megszakítás, akkor is csak 10-30 ms-et csúszik az időzítés a következő jelig.
Ez jelentősen jobb eredmény, mint az AVR saját számlálójának felfüggesztése miatti csúszás.
Azért kíváncsi lennék rá beállít-e interrupt flag-et ilyenkor, vagy sem. -
Teasüti
nagyúr
válasz
Janos250 #4065 üzenetére
Jó ötlet!
Nem is gondoltam még erre.
Ellenben a poti a PIR szenszorokon elég pontatlan és elnagyolt beállítás, meg teljesen esélytelen éppen ugyanolyan fényerőre behangolni a kettőt. Illetve a funkciója is kérdéses volna így, ha különböző fényviszonyok vannak a lépcső alján és tetején.
Szóval jóval célravezetőbb egységesen vezérelni külön érzékelővel és digitálisan.MÁS:
szeretném használni az RTC modul óráját az eltelt idő pontosabb követéséhez, mert a millis() ugye kihagy a megszakítások alatt és így nem lehet időt mérni. Sajnos ez a modul nem regisztrál a másodpercnél kisebb mértékegységet, így az oszcillátor kimenetét fogom használni megszakítás küldéséhez 1 hz-enként.
A kérdésem az volna, hogy az Atmel 328p képes regisztrálni a beérkező megszakítást úgy, hogy ideiglenesen ki vannak kapcsolva a megszakítások:noInterrupts()
?A problémám, hogy egy másodpercenként kiíratok vmit a monitorra, viszont a led szalag frissítéséhez ki kell kapcsolni a megszakításokat, ami miatt pontatlan adatot írok ki.
Az elképzelés az volna, hogy az RTC adja az 1 hz-es jelet és amint érzékeli a loop(), hogy be van állítva ez a flag, úgy írná az adatot a serial monitorra. -
Teasüti
nagyúr
Ühüm. Csavart érpáros jó ötlet! Azok a vezetékek elég esztétikusak tudnak lenni és könnyű telepíteni.
Az nagyon morbid lenne, ha egy vezetékkel tápolnám a szalagot a másik végéről is (brown-out ellen) és továbbítanám a jeleket is?
Igen, ahogy nézem az adatlapját ezeknek a kábeleknek. -
Teasüti
nagyúr
Pontosan.
De filózok azon is, hogy egy RF adó-vevő párossal kommunikálok egy 5 méter led szalag két vége között.
Lépcső világítást készítek PIR szenzorokkal. És a vezérlő MCU-nak kéne jelet továbbítani a másik végéről.
Egy PIR szenzor és egy fotoellenállás szerepel a tervben, mindkettőt vagy kihúzom 5 méteres vezetékkel, vagy kapnak egy második MCU-t jelfeldolgozásra.
Még az esztétikum is szerepet játszik, alu profil nélkül nem lehet elrejteni az extra vezetékeket. -
Teasüti
nagyúr
válasz
gyapo11 #4052 üzenetére
Az MCU-nak kéne meghajtani a saját 5V-járól. Ez így nem oké?
Többiek:
Köszönöm!MÁS
Az ártalmas lehet, ha 5 méter ledszalag végére rakok egy MCU-t, ami a szalagról kapja a tápot? Beleértve a fesz. esést a szalagon. Úgy olvasom vígan mennek ezek az AVR-ek 5V alatt is.
Vagy kéne egy boost-buck konverter biztos, ami biztos?
(Ezek a konverterek amúgy hatásosak zajszűrőnek is? Arra gondolok, hogy ha a ledszalag elkezdi rángatni a tápot 5-10 amperrel, akkor ezzel párhuzamosan kötni egy MCU-t vajon mennyire üzembiztos?Nem, nem kap dedikált tápot.)
-
Teasüti
nagyúr
válasz
krisztianAMG #4045 üzenetére
Esztétikusnak kéne lennie, hétköznapi beltéri felhasználásra.
Még dizájnos projekt dobozt találni is elég necces.(#4048) FireKeeper
A "deszkapanel"?
Belül mindegy, csak azért szerelhető legyen.MÁS:
Hogy méretezzek vezetéket analóg jel továbbításra?
Egy fotoellenállást szeretnék kihelyezni 5 méterre az MCU-tól. -
Teasüti
nagyúr
Srácok!
Hogy lehet szakszerűen beépíteni ezeket a breakout board-okat és az MCU-kat egy projekt dobozba?
Gondolok itt arra, hogy a nyákon lévő furatokat kéne használatba venni. Na de a dobozokban meg nincs semmilyen rögzítési lehetőség, oda mit szokás barkácsolni, hogy azért összeszerelve esztétikus is legyen kívülről?
Bónusz kérdés: hogy kéne rögzíteni egy Nano-t úgy, hogy az usb port csatlakoztatható legyen a dobozon kívülről? Az oké, hogy lyukat reszelek a dobozra, na de oda bepozicionálni és rögzíteni a nyákot az üres dobozban...
Köszi! -
Teasüti
nagyúr
válasz
Janos250 #3581 üzenetére
Bluetooth soros port kapcsán merült fel a kérdés, hogy mivel lehet összeütni viszonylag fájdalommentesen egy Android-os GUI-t? Mármint telepíthető alkalmazást tabletre és telefonra.
A fájdalommentes alatt vmi frontend-ben történő szerkesztést értek, ha létezik ilyen.
Az se zavar, ha 100 mega ramot eszik három gomb a képernyőn, csak ne kelljen megtanulni kódolni még ezt is. -
Teasüti
nagyúr
A gyári Liquidcrystal library-re ismertek vmi jó és sallangmentes alternatívát?
Még csak most ismerkedek vele, de máris utálom:
nem tudok string-et írni csak az első oszlopba, valamint a szóközzel kezdődő string-re meghülyül. -
Teasüti
nagyúr
válasz
Janos250 #3557 üzenetére
Hát ahogy én látom a ws2812 nem jobb a ws2801-nél, csak más.
Mindkettőnek megvannak az előnyei és hátrányai.
Ha ezt előre tudom, hogy a 2812 mellett nem fogok tudni parancsot küldeni az mcu-ra, akkor a másikat vettem volna. Persze amíg csak egy szalag van, bár láttam már megoldást több ws2801 párhuzamos használatára is shift registerrel. Vagy multiplexer vagy mi a retek. -
Teasüti
nagyúr
válasz
Janos250 #3554 üzenetére
Kicsit megvariáltam a ledek frissítését. Nincs konstans kiíratás, csak ha változik a kép.
Statikus "vektornál" átugorja a küldést és ilyenkor tudok kommunikálni vele.
Annyi trükköt raktam még bele, hogy ahogy érkezik vmi adat, felfüggeszti az animációt.
Neten nem találtam megoldást a problémára, egyetlen példában sem merült fel a "ws2812b + remote control" esete.
Ha cserélnék a régebbi WS2801-es szalagra, aminek nem kell szigorú időzítés, akkor ez a probléma fel se merülne. Kár, hogy erre így konkrétan akkor jöttem rá, amikor már megvettem 15 méter szalagot.
Na mindegy.
Lehetséges megoldások között szerepelt a nagyobb vasra váltás is, de az sem garancia az ütközésmentes működésre. Annyi, hogy több ciklust tud végrehajtani az idő alatt. Igaz több erőforrással már nem kellene szénné optimalizált library-ket használni, mert amúgy van vmi Pololu féle cucc is, ami tud olyat, hogy pixelenként kapcsolja ki-be a megszakításokat - értékes proci időt hagyva más feladatokra ahogy te is utaltál rá. Persze ez se garancia az ütközésmentességre, de talán jelentősen lecsökkenti a csomagok eldobásának esélyét.
A valóban garantáltan hibamentes megoldás a második mcu, ami kezeli a beérkező kommunikációt és kérésre továbbítja az első felé.A táp egy kínai utángyártott laptoptöltő akar lenni, szokatlan 5V/15A paraméterekkel, de olyan szinten noname, hogy még én is félek tőle.
5,3V jön ki belőle, csak úgy a miheztartás végett.Ezek közül melyik működik csont nélkül az Arduino IDE-vel?
Úgy tudom csak a Teensy 100% kompatibilis utasításszinten - vagyis lefordul rá ugyanaz a sketch, mint az Uno-ra, ha nem tévedek (talán egy-két specifikus dolgot leszámítva, mint hogy pl. a Due-n is megszaporodtak a perfifériák és azokat külön kell címezni). Arra pályázok majd. Csak mivel kicsit drága ezért még egyelőre nem támasztok akkora igényt a nagyobb kapacitásra.
(Majd ha minden mostani projektem egyesül egy komplex vmivé és bejön mellé egy érintős TFT kijelző is, na akkor kelleni fog az ARM.)
Másik környezetre áttérni meg nem szeretnék, nem akarok visszamenni az alapokhoz. -
Teasüti
nagyúr
válasz
Teasüti #3435 üzenetére
Megvan a hiba forrása.
A FAB LED library kikapcsolja a megszakításokat a led szalag frissítése előtt. Hogy ez nem jutott előbb eszembe!
Konklúzió: kell egy második MCU, ami fogadja a parancsokat és az első MCU - ami a ledekkel foglalkozik - csak kérésre tud adatot fogadni.
Egyszerűen nem egyeztethető össze két, megszakítással működő library.Vagy, szüneteltetni kéne a led frissítését, amikor bejön az első külső megszakítás.
Hmm...
Na ehhez library-t kéne írni szerintem.(#3552) Janos250
Biztosítékot nem a tápra kell méretezni? Vagyis ha 15A-es tápom van, akkor zárlat esetén 15A fog áthúzni. Gondolom én naivan.
Illetve ez így annyira nem szupi, mert simán le tudom terhelni 15A-rel üzem közben.
Akkor még egy kérdés: létezik olyan túláram védelem, ami a táp kapacitása felett korlátozza felvehető áramot?
Teszem azt 300 db led 18A-t tudna felvenni, de csak 15A áll rendelkezésre. Egy brown-out jelenség kedvezőbb volna a világításban, mint egy elfüstölt táp.
(Mondjuk szoftveresen tudom szabályozni a teljesítményfelvételt - mérni is tudom MCU-val az áramfelvételt -, de nem ártana vmi hardveres korlát is.) -
Teasüti
nagyúr
Oké, elfogadom.
A következő kérdésem az volna, hogy mihez kezdesz a közös táppal?
Én eddig úgy tudtam, hogy galvanikus leválasztást két külön áramkör összekötésekor alkalmazunk.
Na de itt közös a táp, közös a földpotenciál és vhogy össze kéne kötni az RGB szalag Data In portját az MCU egyik I/O portjával, amin 800 Khz-es adatfolyam fog közlekedni.
Szóval várom a javaslatokat.Amúgy jelenleg a teszt folyamán semmi jelét nem mutatja a rendszer, h ne lenne működőképes.
Már össze van rakva a prototípus, a programot fejlesztgetem. Az MCU és a szalag párhuzamosan van kötve a tápra.
Ez így működik. Igaz semmi sallang nincs rajta, de megy.
Én csak kiegészítő védelmet szeretnék hozzáadni, ha beépítésre kerül 24/7-es használatra, hogy megfeleljen "a biztonsági előírásoknak". De legalább ne legyen háztűz, ha a táppal gond adódik. Az se baj, ha meg tudom védeni az MCU-t, ha bejön vmi zavar a hálózatról.
Vagy mint az eredeti kérdésben is szerepelt, hogy okozhat-e problémát hidegindításkor a nagy áramfelvétel? Ilyenkor ha megszaladna, akkor azt ki kéne védeni vmivel. Erre van a kondi a szalag elején.
VAGY ha rövidzáram van, akkor azt mivel lehet kivédeni. Szóval ez volt a kérdés.Szóval még egyszer. Itt az MCU csak közvetetten kapcsol nagy áramokat, nem az a feladat, hogy az 5V-os I/O-t illeszteni kell az akármilyen feszültségű nagyobb áramhoz. Itt az I/O port egy 220-as ellenálláson keresztül közvetlenül csatlakozik a led szalaghoz. A led szalag meg közvetlenül (illetve egy 2200 uF kondival) a tápra.
Az MCU is közvetlenül a tápra párhuzamosan. -
Teasüti
nagyúr
Egy PTC bizti elegendő volna a +5V elé az AVR-en, esetleg egy Z-diódával megtámogatva, hogy kivédjem a rövidzárlatot és egyéb túlfeszt és -áramot?
-
Teasüti
nagyúr
Hogyan kéne leválasztani galvanikusan, amikor az RGB szalag bekötése úgy indul, hogy közösítsd a földet a szalag és az avr között? Meg nagyjából a legtöbb alkalmazásnál is ez volt eddig, amit láttam Arduino-val, h közös föld potenciálra kell hozni a cuccokat.
Na meg ha ugyanaz a táp eteti az AVR-t, amiről megy még 15 amper smd led?(#3539) Ribi
Ez a dióda kérdés feljött már az AVR portjainak illesztésénél is. Most olvasom a wikit róla, érdekes.
Éppen ilyenekre gondolok, hogy pár apró vacakkal kicsit üzembiztosabbá tenni a tápot, főleg ha közvetlen szabályzott 5V-tal szeretném üzemeltetni az AVR-t. -
Teasüti
nagyúr
Ha már elektronika, akkor beszéljük kicsit a biztonságos betáplálásról!
A kérdésem az volna, hogy miként lehetne megvédeni túlfesz és túláram ellen az AVR-t?
A leendő környezetben 5V-os táp lesz, vagyis közvetlenül lesz betáplálva az 5V-os porton.
Viszont most is úgy jártam, hogy rövidzár, szikra és az AVR megdöglött.
Na az ilyen esetekre mivel lehet felkészülni?
Biztosíték?
Na meg ugyanarról a tápról fog menni majd, amiről 300 db RGB led is, ami elvileg úgy tudom nem lehetne probléma, de azért mégiscsak 5-15 amperről lesz szó és szerencsétlen Nano-nak csak pár mA kell.
Ha megszalad, akkor füstöl gondolom.
Mennyire életszerű, h megszalad?
Onnan sejtem, h ebből gond lehet, hogy az rgb szalag betáplálásánál is előfordul, hogy az első led megdöglik és azzal magyarázzák, hogy túláramot kap. Nem értem miért párhuzamos kötésnél, de nálam is sérült már az egyik szalag első ledje, kondi ide vagy oda.Na meg kínai tápom van, szóval szeretnék utána még gondoskodni túlfesz, túláram, rövidzár és egyéb védelmekről mielőtt beépítésre kerül.
Köszönöm! -
Teasüti
nagyúr
Nem teljesen vág ide a kérdés, de lehetséges kapcsolni 120 VAC-t félvezetőkkel?
Egy 12VDC to 120VAC@800khz invertert szeretnék úgy kapcsolgatni, hogy a kimenetet elosztani sok csatornára.
A relé az túl lassú, világítást kéne vezérelni róla, amit természetesen Arduino-val készíteném el.
Ez lehetséges? Nincs infó hogy oldották meg elektronikailag a fenti példában, de erősen kétlem, hogy beépítettek n+1 invertert. -
-
Teasüti
nagyúr
Uhm ez érdekes.
Kínai Nano amit megszikráztattam tegnap, ma rádugom az usb-re és megy a program.
Na mondom mégse lett baja?
Ahogy elindítom az IDE-t, úgy a program futás leáll és a 13-as LED villog. Ha elindítom a soros monitort, akkor megint beboot-ol és megy a program.
Ha kilépek a monitorból, akkor újra villog. Ha bezárom az IDE-t, akkor ismét fut a feltöltött program.
Ez most mi? -
Teasüti
nagyúr
Köszi a tippeket!
(#3501) gyapo11
LOL, az igen!
Az évek meg a rutin.
Elektromos tűzhely van csak, de mindjárt szerzek egy öngyújtót. -
Teasüti
nagyúr
Taknyoljam össze bő nyállal és lejön?
Esetleg nincs ötlet mivel lehet tápolni a breadboard-okat, ami nem ilyen megoldás, hanem kicsit szofisztikáltabb?
A másodikat füstöltem el ebből, mert kilóg a bele és hozzáért vmi a tüskékhez, aminek nem kellett volna. -
Teasüti
nagyúr
Produktív nap volt a mai.
Kinyírtam két Nano-t, egy 16x2-es lcd kijelzőt és egy breadboard buck converter-t.
Rövidzár vitte el a tápot és az egyik Nano-t (verification error), majd második körben vmiért az lcd kijelző nem díjazta, hogy a kontrasztra ráadtam az 5 voltot. Még egy szikra és a másik Nano azóta elfelejti a programot áramtalanítás után.
Amúgy jelent vmit a villogó D13 led a Nano-kon? Mindkettő ezzel indul, hogy villog a led rajta. A programban ez nincs benne.
Meg nem értem az lcd-t se, hogy mi baja az 5 volttal. Elvileg egy potival kéne szabályozni, ami fasza is volt amíg el nem kezdtem továbbgondolni, hogy ezt lehetne vezérelni is. Na de a poti is 0-5 között szabályoz, szóval miért volt baj, ha közvetlen rádugtam a tápra?Bónusz kérdés: miként tudnám levenni a halott Nano-ról a fesz stabilizátort és kicserélni az elfüstölt társával a breadboard tápon? A pákával próbáltam melegíteni, de ahogy látom egyszerre kéne melegíteni 4 ponton, hogy levegyem.
-
Teasüti
nagyúr
válasz
Janos250 #3453 üzenetére
A szalag frissítése sosem volt probléma. Egyben kitolja a puffert, aztán amíg nem hívja meg semmi megint, addig a szalag tartja a mintát. Nincs frissítési probléma és tetszőleges fps-el lehet frissíteni.
A "gond" az volna, hogy nagyrészt globális változókkal dolgozok, mint amilyen a szalag pufferje is.
Ezt a puffert manipulálja az összes függvény, amíg végül kiküldésre nem kerül sor.
A puffer és a vezérlőbájtok mind globálisak, ami számomra egyszerűvé teszi a munkát.Egy képkocka első szalagra, bele a vektorba.
A vektor kiküldése az első szalagra.
Mit értesz vektor alatt? Mi volna itt a "vektor" feladata?
Ha itt generálom a képkockát, az rendben is volna, de végső soron ugyanúgy el kell tárolnom a ram-ban a vezérlőbájtokat minden szalagra vonatkozóan, nem?
Vhonnan elő kell kaparni a paramétereket a függvényhez/osztályhoz.Tehát ha pl. a
byte fényerő
változóból van négy példány, mert négy szalaghoz kell eltárolni az infót, akkor ezt sehogy nem lehet leredukálni egy változóra.
Vagyis ha jól értem az egyetlen előny az volna, hogy átláthatóbb és rendezettebb lenne a program a mostani katyvasz helyett. -
Teasüti
nagyúr
válasz
Janos250 #3449 üzenetére
/*Ez egy hevenyeszett bevezeto bevezetoje az osztalyokrol teasuti keresere
* jogallasa "beerware", azaz szabadon hasznalhatod, de ha kocsmaba megyunk, Te fizeted a sort
*/LOOOL
Viszont ha jól értem ezzel dolgozik az összes WS2812 library is, hisz eleve osztályként definiálod a led szalagot.
Az én esetemben viszont akkor nem értem miként lehetne osztályokba rendezni konkrétan az egész loop-ot, hisz egy loop ciklus egy képkockát generál.
Aztán ha több szalagom lesz, akkor azt kell megoldanom, hogy egy ciklusban több képkocka jöjjön létre több szalagra, amit vagy úgy fogok megoldani, hogy oda-vissza ugrálok a loop-ban, vagy copy&paste.
Aztán ami a változókat illeti, ha osztályokba rendezve fut le, akkor is több példány jön létre minden változóból, vagy ahogy kilép az egyik osztályból úgy üríti a ram-ot?
Új hozzászólás Aktív témák
Hirdetés
- BESZÁMÍTÁS! Samsung T22E390EW TV monitor garanciával hibátlan működéssel
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5700X 16/32/64GB RAM RTX 4060Ti 8GB GAMER PC termékbeszámítással
- Bomba ár! Dell Latitude 5310 - i5-10GEN I 16GB I 256SSD I HDMI I 13,3" FHD I Cam I W11 I Garancia!
- Szinte új, minőségi, állítható ritkítóolló
- BESZÁMÍTÁS! Apple iMac Pro (2017) 5K - Xeon W-2140B 64GB DDR4 RAM 1TB SSD Radeon PRO Vega 56 8GB
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Liszt Ferenc Zeneművészeti Egyetem
Város: Budapest