- Samsung Galaxy A54 - türelemjáték
- Android alkalmazások - szoftver kibeszélő topik
- Redmi Note 12 Pro - nem tolták túl
- A Watch7-tel debütálhat a Samsung vércukormérője
- Xiaomi 13 - felnőni nehéz
- Milyen okostelefont vegyek?
- iPhone topik
- Xiaomi Mi 11 Ultra - Circus Maximus
- Honor Magic5 Pro - kamerák bűvöletében
- Apple iPhone 13 - hízott, de jól áll neki!
Hirdetés
-
Rossz üzlet az EV-kölcsönzés
it Küszködik az EV-kölcsönzés miatt a Hertz Global, még több EV-t adnak el.
-
Gray Zone Warfare - Napokon belül kiderül, hogy mikor indul a korai hozzáférés
gp A jelentések szerint a zárt tesztek sikeresek voltak, hamarosan még többen belevethetik magukat a programba.
-
Toyota Corolla Touring Sport 2.0 teszt és az autóipar
lo Némi autóipari kitekintés után egy középkategóriás autót mutatok be, ami az észszerűség műhelyében készül.
-
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
-
zka67
őstag
válasz dave0825 #821 üzenetére
Szia, bocs, hogy beleszólok, csináltam már jónéhány órát. Nálam a szempont mindig az olcsóság, és az egyszerűség volt. Be lehet "lőni" egész pontosra az arduino-t is, külső RTC nélkül is. A trükk nálam az volt, hogy az internetes időt vettem alapul a "belövéshez". Első lépésben hagytam menni az órát egy teljes napig, majd megnéztem, hogy mennyi az eltérés (természetesen a PC-n minden alkalommal frissítettem előtte az internetes időt). Sietett mondjuk 30 mp-et. Ekkor beállítottam neki, hogy minden 86400/30-adik órajelet hagyja figyelmen kívül (én megszakítást használtam az időzítéshez és a kijelzők multiplexeléséhez, 1kHz-et). A következő lépés az volt, hogy hagytam így menni egy teljes hónapig, majd ugyanezt a számítást elvégeztem, és így kaptam egy olyan órát, ami évi 10mp-nél nem késett/sietett többet, ami szerintem elfogadható. (Ha késik, akkor 2x hívom meg az időszámláló rutint, ha siet, akkor kihagyok egy hívást)
Csináltam órát DS1307-el is, ezt is be lehet "lőni" egész pontosra, két darab 5pF-os kondenzátort kell kötni a kvarc lábai és a föld közé. Ezzel havi 5mp-es pontosságot tudtam elérni, ami szerintem még mindig elfogadható. A DS3231 sem pontosabb, mint a 1307-es, csak abba már beépítettek néhány kondenzátort,
amit a kvarc lábaira tudsz kapcsolni szoftverből, így lehet pontosabbá tenni, de atomóra abból sem lesz.Egyébként az elem azért kell az RTC-nek, hogy ha áramszünet van, akkor is menjen az óra, és a ram-ban tárolt tartalmat is megőrizze. Ez jó dolog, ha csak pár beállítást akarsz tárolni, nem kell külön eeprom.
(Az RTC ram tartalmának ellenőrzésére érdemes egy checkusm-ot is használni, hogy tudd, hogy első
alkalommal indítottad el az órát, és az adatok érvénytelenek, vagy már inicializáltad őket, és érvényesek)Ha atomóra kell, akkor kell hozzá egy wifi modul és le kell kérdezni az internetes időt. Az sem egy bonyolult dolog.
Remélem tudtam segíteni egy kicsit.
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #823 üzenetére
Én nem arduinot használok, de a lényeg szempontjából ez semmin nem változtat. Megszakítást generálok pl. 1ms-enként, és ezt használom időalapnak.
Ha konkrét megoldás is érdekel, írtam egy fejlesztőkörnyezetet a 8051-es mikrokontrollerekhez, ebben megtalálod példaként ezt az órát is:
Turbo51Studio letöltése
Digital clock példaprogram pascal nyelvenA turbo51 studioval ki is tudod próbálni az órát anélkül, hogy meg kellene építened az áramkört:
Az RTC számolja az órát, percet, napot, stb..., az arduino közben csinálhat mást. Amikor tudni akarod, hogy mennyi az idő, kiolvasod az RTC-ből. Magyarul az arduinotól függetlenül méri az időt. Az akku csak annyit csinál, hogy az RTC akkor is méri az időt, amikor az arduino nem kap tápot.
A checksum-ot, az RTC ramot, és az eepromot egyenlőre hagyd figyelmen kívül
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #836 üzenetére
Szia, a 40mA az abszolút maximum, a határérték, a javasolt 20mA egy lábon. Továbbá ha a kék ledeket 20mA-ről hajtod, ahhoz már fegyverviselési engedély kell, mert ki fogja égetni az agyadat is a fénye
De komolyra fordítva a szót, igen, meg lehet oldani mindent, még ezt is. Kell hozzá pluszban néhány filléres tranzisztor és ellenállás, remélem ezekben otthon vagy.
A tranzisztorok lehetnek BC337 (NPN) és BC327 (PNP) vagy hasonó típusúak.
A vezérlések invertálódnak, erre figyelj oda. Annyi ROW és COLUMN áramkör kell, ahány sorod és oszlopod lesz, a mátrixot nem rajzoltam fel külön, szerintem az menni fog neked is. A SELECT ROW kimenetek lehetnek OC-k is.Még egy jótanács: LED-eket sose köss párhuzamosan, még ha egy sorozatból valók, akkor se. Mindig használj külön előtét ellenállást minden ledhez. Az okokra most nem térnék ki, fogadd el ezt így.
+5VO O +5V
| |
| -
| | |10K
| | |
E| - 4K7
\| | ---
PNP |--o---| |---< SELECT ROW (0)
C/| ---
|
|
---o---ROW
|
+
LED + 330R
-
|
---o---COLUMN
|
C| 1K0
\| ---
NPN |----| |-----< SELECT COLUMN (1)
E/| ---
|
---[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #838 üzenetére
Ilyet rendeltem... Mondom, hogy ki fogja égetni az agyadat
Az NPN tranzisztorok kollektorára kötöd a kék (led-) vezetékeket, a PNP tranzisztorok kollektorára pedig a piros (led+) vezetékeket. Ezután minden egyes leddel sorba kötsz egy-egy 330 ohmos ellenállást, különben el fognak égni az ellenállásaid a terheléstől (ha egy ellenállást teszel több ledhez).
A D3,D4,D5 megy majd a SELECT ROW-okra, a D6,D7,D8 pedis a SELECT COLUMN-okra, bár a te rajzodon pont fordítva vannak, de nincs jelentősége az elnevezéseknek.
Az OC az open-collector kimenetet jelenti, de felejtsd el amit írtam, nem érdekes, csak összezavar téged.
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #840 üzenetére
Szia, igen, úgy nézem, jó lesz a rajzod
Igen, minden piros és kék vezetékre kell egy-egy tranzisztor.
A ledeket így már kötheted párhuzamosan.
Egy nagyfényerejű kék lednek szerintem elég 5mA is, de majd meglátod.
A D6,D7,D8 lábakra nem +5V-ot kell kötni, hanem egy 10K ellenálláson keresztül kötöd a +5V-ra.
Csak azért rajzoltam bele, hogy ha netán mégis OC kimenetet állítanál be az arduinonak, akkor is
le legyen zárva rendesen a tranzisztor, ha nincs rá szükség. De szerintem el is hagyhatod, nem
fogod te OC-re állítani a kimenetet. -
zka67
őstag
Szia,
Pwm kimenet nélkül nincs pwm.
Ne mondj olyat, ami nem igaz Szoftverből is meg lehet oldani a pwm-es fényerőszabályzást.
dave0825: A fényerőszabályzást nem kell feltétlenül a környezethez állítani, lehet azt az időtől is függővé tenni. Az én órám pl. este 9-kor szépen, fokozatosan elhalványul, hogy éjjel ne zavarjon a fénye, és reggel 6-kor fordítva felerősödik. Ha megérted a pwm működését, akkor te is meg fogod tudni csinálni akár szoftverből is.
De segítek: ha halvány fényt akarsz, akkor rövid időre bekapcsolod a ledet, és hosszabb időre pedig ki. Ha erősebb fényt akarsz, akkor hosszabb időre kapcsolod be a ledet, és rövid időre ki. Ha teljes fényerőt akarsz,
akkor folyamatosan bekapcsolva hagyod a ledet. És mindezt legalább 100x mp-enként, hogy ne vedd észre a villogást. -
zka67
őstag
válasz dave0825 #854 üzenetére
Szia, a BC337 és BC327 kötőjel utáni száma csak a feszültségerősítést jelzi, aminek - mivel itt csak kapcsolóként használjuk - nincs jelentősége, a legolcsóbbat kell megvenni. A rajzokon alulnézetben mutatják a tranzisztorokat, erre figyelj oda. A negyed wattos ellenállások nem ide valók, legalább 0.4W-ost, vagy 0.52W-ost vegyél. Egyébként bármilyen általános tranzisztor megfelel erre a célra, én csak azért használom ezeket a típusokat, mert anno vettem belőlük több ezer darabot fillérekért. A BC337 helyett használhatsz BSS170 vagy hasonló MOSFET-et is, ebben az esetben az 1K ellenállást is elhagyhatod, de a fet jóval drágább a tranzisztornál. Magyarul mindegy mit használsz, csak az a lényeg, hogy ne az arduino kimenete legyen terhelve.
-
zka67
őstag
válasz dave0825 #856 üzenetére
Jó is, hogy szóba került az 1K-s ellenállás, mert lemaradtak a rajzodról az 1K-s és a 4K7-es ellenállások.
A BC337-ek bázisa és az arduino kimenetei közé kell egy 1K-s ellenállás, és valószínűleg fog kelleni ezeknek az arduino kimenetek és a táp közé is egy 2K2, mert nem vagyok benne biztos, hogy az arduinoban levő felhúzó ellenállás elég lesz a tranzisztos kinyitásához.
A BC327-ek bázisa és az arduino kimenetei közé kell egy 4K7-es ellenállás, különben azonnal kinyírod az arduino kimeneteit.
Légyszíves javítsd a rajzodon és töltsd fel ide, hogy megnézhessem.
Továbbá te csak BC337-ek vásárlásáról beszélsz, remélem a BC327-ek helyett nem azt akarsz betenni, mert az egyik NPN, a másik PNP tranzisztor.
-
zka67
őstag
válasz dave0825 #863 üzenetére
Hogy miért nem szimmetrikus a kapcsolás? Mert a proci kimenete sem szimmetrikus. A proci kimenetét úgy képzeld el, hogy van egy NPN tranzisztor (a valóságban mosfet), amelyiknek az emittere a gnd-re van kötve, a kollektora a kimenet, és a kollektor és a táp között van egy ellenállás (~20K-50K).
Nos, amikor a kimenet alacsony, azaz nyitva van a tranzisztor, azon elég nagy áram át tud folyni, és ez elég a PNP tranzisztorok kinyitásához. Amikor ez a kimenet magas, az ellenálláson keresztül tud annyi áram folyni, hogy teljesen le tudja zárni a PNP tranzisztort. De az NPN tranzisztorok vezérléséhez már nem elég a belső ellenálláson átfolyó áram. Azaz, ha a kimenet alacsony, akkor az NPN tranzisztort biztonsággal le tudja zárni, ezzel nincs is gond. Viszont ha magas a kimenet, a 20-50K közötti belső ellenálláson keresztül nem folyna annyi áram, ami a tranzisztort ki tudná nyitni. Ezért kell "rásegíteni" egy külső, u.n. felhúzó ellenállással. Az ellenállás értékét úgy kell megválasztani, hogy a proci kimenetét se terhelje túl, amikor az alacsony szinten van, de átfolyjon rajta annyi áram, ami bőven elég a tranzisztor teljes kinyitásához.
Ha komplementer tranzisztoros kimenete lenne a procinak, nem lenne semmi gond, meg tudná hajtani mindkét típusú tranzisztort. De nem ilyen a kimenete, hanem még a "régi időkből" megmaradt felhúzó ellenállásos módszert használják. Ennek is vannak előnyei, mert így egyszerre lehetett ki- és bemenetként is használni egy lábat. Hogy hogyan? Amikor a kimenetre 0-t írsz, akkor a láb kimenetként viselkedik, és lehúzza a vonalat nullára. Ha 1-et írsz a kimenetre, akkor a felhúzó ellenálláson keresztül jut magas szint a kimenetre. De kívülről is működik ugyanez a mutatvány: le tudod húzni nullára a kimenetet, vagy hagyod magasban. És kiolvasva a portot megkapod az így már bemenetként viselkedő láb állapotát.
Próbáltam mindenki számára érthetően leírni, remélem sikerült, és megértetted.
-
zka67
őstag
válasz dave0825 #871 üzenetére
A 330 ohmos ellenállások 0.4W-osak vagy 0.52W-osak legyenek, amilyet kapsz. A többinél lényegtelen a teljesítmény, én pl. kizárólag SMD ellenállásokat használok ilyen esetekben.
@tvamos: Pl. az ATmega2560 összes portja.
(#873) dave0825: Természetesen jó bármilyen ellenállás, nem csak az SMD
[ Szerkesztve ]
-
zka67
őstag
Igazatok van, tévedtem, összekevertem a régebbi Atmel procik kimenetével. De mint említettem, én nem használok arduinot, nekem az lassú, én ARM procikkal foglalkozok. Ha meg valahová elég a lassabb proci is, akkor veszek egy filléres 8051 architektúrájút. Szerintem a 8-bites AVR mikrokontrollerek a legrosszabb ár/teljesítmény arányúak, bár lehet, hogy vannak még ennél is rosszabbak, nem tudom.
Én csak betévedtem ide, és láttam, hogy vannak akik nem boldogulnak egy-egy feladattal, és gondoltam segítek nekik, ezért nem kell rögtön leharapni a fejemet.
-
zka67
őstag
Sziasztok, az eBay-es vásárlásokhoz szeretnék adni egy jótanácsot: ha az ígért határidőig nem érkezik meg a rendelt árutok, akkor azonnal kapcsolatba kell lépni az eladóval, és jelenteni neki, hogy "nem kaptam meg az árut". Ezzel nyittok egy "case"-t, aminek 45 nap a lejárati határideje. Ezt a "case"-t az eladó bármilyen ígéretére se zárjátok le addig, amíg meg nem kaptátok a terméket!
Sok csaló válasz nélkül azonnal visszautalja a pénzeteket, de van aki bepróbálkozik azzal, hogy "azonnal küldök másikat, amint lezártad az ügyet". Ezt semmiképp ne tegyétek meg, mert ezzel aláírjátok azt, hogy rendben megoldódott a problémátok, miközben az árutok a holdba van, és lőttek a pénzeteknek.
Ha a "case" megnyitása után 40 nappal sincs ott az árutok, akkor kérhetitek az eBay-t, hogy intézkedjen, vagy küldje ő vissza nektek a pénzeteket, ugyanis az eBay garanciát vállal arra, hogy ha az árut nem kapjátok meg, akkor vagy az eladó vagy ők visszafizetik a teljes összeget.
Remélem tudtam segíteni egy kicsit, és így már bátrabban mertek vásárolni az eBay-en
-
zka67
őstag
válasz dave0825 #938 üzenetére
Szia, az, hogy az arduinoban levő tranzisztorok 20mA-rel terhelhetők nem az jelenti, hogy nem folyhatna át rajtuk több áram. Csak ha túlterheled a kimeneteit, akkor lesz egy szép pirosan világító IC-d is a ledekhez
Itt csupán arról van szó, hogy az arduino tranzisztorai helyett egy nagyobb "teherbírású" külső tranzisztorokat fogsz használni. Ezt több szempontból is jobb megoldás, mert így ha véletlenül zárlatot csinálsz e ledek környékén, akkor sem az arduino fog az örök vadászmezőkre tévedni, hanem max néhány tranzisztor. Illetve szerintem azok kibírják a zárlatot is, mert a bázisellenálláson keresztül nem kap annyi vezérlést, hogy el is tudjon pukkanni. Az arduino kimenetei elég érzékenyek erre, azonnal elfüstölnek, ha közvetlenül a tápra vagy a földre kötöd őket.
-
zka67
őstag
válasz dave0825 #955 üzenetére
Szia, bocs, hogy ismét beleszólok. A nano tápját felejts el a ledek meghajtásához, felesleges túlterhelni. A nanot hajthatod 12V-ról is, önmagában nem fog melegedni semmi rajta, mivel erre lett méretezve.
A ledeknek viszont tegyél be egy külön kapcsolóüzemű tápegységet, láttam van neked is, használd azt. Beállítod 5V-ra, a nullát összekötöd a nano nullájával, de az 5V-ot nem kötöd össze a nano 5V-jával.
Így még akár a fényerőt is tudod szabályozni, csak nagyon ne menj 5V fölé.
Ehhez a megoldáshoz nem kell semmilyen hűtés, fogsz egy 12V-os tápegységet vagy 9V-ost, és kész.
Az analóg stabilizátorok nagy baja, hogy a bemenő és a kimenő feszültség különbözetét elfűtik a rajta átfolyó árammal arányosan. Én csak néhány mA áramfelvételű áramkörökhöz használok analóg stab ic-ket, különben minden máshoz kapcsolóüzeműt. Filléres alkatrészekből össze lehet rakni (pl. ebay-en vettem 8Ft/db áron MC34063-as IC-t (100db-ot), hozzá tekercset 20Ft/db-ért, schottky diódákat 2Ft-ért. -
zka67
őstag
Szia, én TFT kijelzőt használnék a helyedben. Filléres dolog, színes, touch screen-nel:
3.3V 240x320 2.4" SPI TFT LCD Touch Panel Serial Port Module with PBC ILI9341
És nagyon egyszerű a használata.
-
zka67
őstag
válasz dave0825 #1127 üzenetére
Szia, hogy próbáltad? Minden led-hez tettél ellenállást és úgy kötötted őket párhuzamosan, vagy csak egy ellenállást tettél összesen? Próbálj ki egy darab led-et egy darab ellenállással 5V-ra kötve. Esetleg impulzus üzemben próbáltad? Ha igen, mérd meg a kitöltési tényezőt. A tranzisztorokkal próbáltad? Ha igen, próbáld ki ardu nélkül, úgy, hogy a megfelelő tranzisztorok lábára a megfelelő szinteket kötöd, hogy úgy hogy világít.
-
zka67
őstag
válasz dave0825 #1129 üzenetére
Akkor nincs mese, vagy elkezdesz kisebb ellenállásokat belerakni, vagy egyszerűen elhagyod az ellenállásokat. Ha nem teszel bele ellenállást, akkor viszont ügyelj arra, hogy mindig működjön az ardu, azaz ne fordulhasson elő olyan eset, hogy valamiért megáll egy leden a program. Én a hétszegmenses órámat használom így, a tranzisztorok megvédik a ledeket, de ha megáll a program, akkor azért túl nagy áramot kaphatnak. Ha így túl nagy lenne a fényerő, akkor azt szoftverből tudod korrigálni, úgy, hogy rövidebb ideig tartod csak bekapcsolva a ledeket. Ha pl. 1 kHz a frissítési frekid, az azt jelenti, hogy a max fényerőhöz 100ms-ig kapcsolod be a ledeket, pl. 10 oszlopnál. Ezt a 100ms-et ha lejebb veszed, csökken a fényerő, de a következő oszlopra csak 100ms múlva lépsz. Remélem érted mit akarok mondani.
-
zka67
őstag
válasz dave0825 #1137 üzenetére
Szia, nyugodtan kipróbálhatod ellenállások nélkül, impulzusüzemben. Attól hogy mások még nem próbáltak így vezérelni egy ledet, még nem jelenti azt, hogy nem működőképes a dolog, és hogy tönkremegy a leded.
Mivel programozás közben bemenetre váltanak a pinek, nem fog kinyitni egyetlen tranzisztor sem, nem fog világítani egyetlen led sem. Egyébként azt látnád most is, hiszen világítanának a ledek...
Egyébként '90-ben csináltam egy led-es reklámtáblát, ami a BNV-n 3. díjat nyert, és a konkurencia jött nézegetni, hogy hol van a tápegység, mert nem hitték el, hogy az egész tábla csak 200W-ot fogyaszt full fényerőn, amikor az övék 4kW-ot. Abban a táblában se voltak ellenállások, sőt egy LS373-as kimenete volt az egyik tranzisztor, és nem ment tönkre egyetlen alkatrész sem. A tábla 8cm vastag volt, egy PC-s táp hajtotta,
amit szintén belepréseltünk, a konkurrencia táblája meg 60 centi vastag volt, tele ventillátorokkal.Azóta az összes reklámtábla így működik, nem pazarolnak el fűtésre feleslegesen energiát.
Ha nem hiszel nekem, attól még kipróbálhatod, bekötöd a ledeket ellenállással, és az egyik ellenállást menet közben rövidre zárod. És nem fog tönkremenni a leded
-
zka67
őstag
válasz gyapo11 #1140 üzenetére
Szia, ebben a konkrét esetben nincs miről beszélnünk. A trükk a tranzisztorokban rejlik, azoknak az áramkorlátozó tulajdonságát használom ki. Ha emlékszel még a rajzokra, mindkét tranzisztor bázisán van egy-egy ellenállás, amin átfolyik néhány mA áram. A tranzisztoroknak van egy u.n. bétája, amivel nagyjából meg lehet szorozni a bázisáramot, és megkapod a kollektoráramot. Jól mondom eddig?
Viszont a tranzisztorok CE feszültsége függ a rajta átfolyó áramtól. Minél nagyobb áram folyna át rajta, annál nagyobb lesz ez a feszültség, azaz csökken a ledre jutó feszültség, azaz csökken a leden átfolyó áram is.
A ledek természetesen így nagyobb áramot fognak kapni, mint amit folyamatos működés során huzamosabb ideig elbírnának, de az impulzus üzem miatt semmi bajuk nem lesz. Mint említettem, az óráim is igy működnek, nagyfényerejű, piros, hétszegmenses kijelzőkkel, amikben a ledeknek még ráadásul kisebb is a nyitófeszültségük, max. 1/8-ados kitöltési tényezővel.
A power ledek már más kategóriába tartoznak, pontosan a melegedés miatt. Ha léteznének 600A-es tranzisztorok 40-es bétával, szerintem ezt is meg lehetne oldani...
-
zka67
őstag
válasz dave0825 #1178 üzenetére
Szia, mint említettem, a tranzisztorok invertálnak, lehet, hogy ez lesz a gond nálad. Melyik típust kötötted a row kimenetekre és melyiket a col kimenetekre?
A programodban egy hibát találtam, a col tömböd csak 5 elem hosszú, te viszont sok helyen hivatkozol a 6. elemére is.
-
zka67
őstag
válasz dave0825 #1196 üzenetére
Szia, belinkelhetnéd a programodat.
Csak megkérdezem, hogy ti megszakításokat nem szoktatok használni? Én úgy csinálnám meg a helyedbe, hogy valamelyik timer megszakítással időzíteném a ledeket, A megszakításkor azonnal indítanék egy másik timert, ami a fényerőt fogja szabályozni, azaz annak a megszakításakor egyszerűen csak kikapcsolnám az összes ledet. Ha megszakításokkal dolgozol, akkor tulajdonképpen a programod azt csinálhat közben, amit akarsz, nem kell az időzítésekkel foglalkozni, mert azt a timer-ek elintézik.
Jelen esetben elég neked egy 500Hz-es megszakítás, azzal már 100Hz-es frissítésed lesz. A másik timer-rel pedig 2ms-nál rövidebb időt állítsd be (amit természetesen majd változtathatsz), és kész a fényerőszabályzásod is.
Ha gondolod, szívesen elküldöm neked az órám programját, igaz az nem arduinora készült, hanem egy arm uC-re, de ez a lényegen nem változtat, az elvet szerintem megérted belőle. (Sima C program...)
-
zka67
őstag
válasz gyapo11 #1201 üzenetére
Szia, az arduino oldalán rengeteg példa van fent, ezek közül a legegyszerűbbet betettem ide.
#include <TimerOne.h>
void setup()
{
// Initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards
pinMode(13, OUTPUT);
Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
}
void loop()
{
// Main code loop
// TODO: Put your regular (non-ISR) logic here
}
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timerIsr()
{
// Toggle LED
digitalWrite( 13, digitalRead( 13 ) ^ 1 );
} -
zka67
őstag
válasz dave0825 #1243 üzenetére
Szia, a 2. esetben, a case-s megoldásodnál kimaradtak a break; -ek
A switch utasítás csak elugrik a megfelelő case ágra, és onnan folytatja a program futását. Azaz, miután lefutott a case 1 ág, mivel nincs break, ezért a case 2 ágon folytatja a futást.
Az infrád ismétlését pedig a következőképpen tudod megszüntetni:
Amikor jön az adat, megnézed, hogy az előző adattal megegyezik-e? Ha nem, akkor új kód, feldolgozod, ha igen, megnézed, hogy mennyi idő telt el az előző adat óta. Ha több, mint 250ms, akkor új adatként feldolgozod, ha kevesebb, akkor figyelmen kívül hagyod.
Ezután az utolsó kódot elmented, és törlöd az eltelt időt.
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #1248 üzenetére
Szia, szerintem ennek működnie kell:
Természetesen a gombok kódjait írd át
#define VK1 0x12345678
#define VK2 0x87654321
#define REPEAT_TIME 250
void IRHandler(void) {
static unsigned long pmillis;
static decode_results results, presults = 0;
if (irrecv.decode(&results)) {
irrecv.resume();
if (results == presults) {
if ((millis()-pmillis) < REPEAT_TIME) {
pmillis = millis();
return;
}
pmillis = millis();
presults = results;
switch (results) {
case VK1:
// Key 1 lenyomasakor
break;
case VK2:
// Key 2 lenyomasakor
break;
}
}
}[ Szerkesztve ]
-
zka67
őstag
-
zka67
őstag
válasz dave0825 #1257 üzenetére
Szia, megnéztem a decode_results típust. A következőképpen módosítsd a programot:
#define VK1 0x12345678
#define VK2 0x87654321
#define REPEAT_TIME 250
decode_results results;
void IRHandler(void) {
static unsigned long pmillis, pvalue;
if (irrecv.decode(&results)) {
irrecv.resume();
if (results.value == pvalue) {
if ((millis()-pmillis) < REPEAT_TIME) {
pmillis = millis();
return;
} // Ez hiányzott
}
pmillis = millis();
pvalue = results.value;
switch (results) {
case VK1:
// Key 1 lenyomasakor
break;
case VK2:
// Key 2 lenyomasakor
break;
}
}
}
void loop() {
IRHandler();
} -
zka67
őstag
válasz dave0825 #1251 üzenetére
(#1251) dave0825 Én pont ezért nagyon szeretem ezt a fórumot, de leginkább ezt a topikot, mert az esetek nagyon nagy részében mindig sikerül megoldást találni. Nekem legalábbis ritka volt, amikor nem tudtak itt segíteni az emberek.
(#1250) softguner Zseniális ez a csapatmunka
A C Programozás topikban is hasonlóan segítőkészek az emberek
-
zka67
őstag
válasz dave0825 #1264 üzenetére
Szia, örülök neki, hogy működik a programod
Viszont a REPEAT_TIME-ot nem csökkentened kellene, hanem növelned. Ez mondja meg, hogy mennyi az az idő, amin belül ha ugyan az a kód jön, az ismétlésnek számít. Lehet, hogy ezért ugrik át a beállításoknál. Vedd feljebb 500-ra, szerintem azzal már jónak kell lennie.
a switch (results)-ot át kellett írnom switch (results.value)-ra...
Jaja, én jegyzettömbe írtam a programot
De a presult is megfelelő lett volna...Szerintem sokkal egyszerűbb, átláthatóbb és jóval rövidebb lenne a programod, ha konstans tömbökben tárolnád a megjelenítendő adatokat...
Nem fogom megírni helyetted a programot, tanuld csak szépen a programozást
-
zka67
őstag
válasz dave0825 #1267 üzenetére
Szia, parancsolj:
const unsigned char minutes[60][6] = {
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // perc 0
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // perc 1
...
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000} // perc 59
};
const unsigned char hours[12][6] = {
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // ora 0
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // ora 1
...
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000} // ora 11
};
const unsigned char temperatures[17][6] = {
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // fok 15
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}, // fok 16
...
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000} // fok 30
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000} // ures
};
void checkMinute() {
unsigned char second,minute,i;
second=Clock.getSecond();
minute=Clock.getMinute();
for (i=0; i<6; i++) data[i] = minutes[minute][i];
showpattern();
}
void checkHour() {
unsigned char hour;
hour=Clock.getHour(h12, PM);
for (i=0; i<6; i++) data[i] = hours[hour % 12][i];
showpattern();
}
void checkTemperature() {
unsigned char temperature;
temperature=Clock.getTemperature() - 15;
if (temperature >= 16) temperature = 16;
for (i=0; i<6; i++) data[i] = temperatures[temperature][i];
showpattern();
}vagy szerintem így sokkal szebb, csak másképp kell meghívnod (ebben az esetben természetesen semmi szükség a fenti rutinokra, checkMinutes stb...):
void checkValue(const unsigned char *table) {
unsigned char i;
for (i=0; i<6; i++) data[i] = *table++;
showpattern();
}
checkValue(&minutes[Clock.getSecond()][0]);
checkValue(&hours[Clock.getHour() % 12][0]);
checkValue(&temperatures[Clock.getTemperature()][0]);Remélem a fordító elfogadja a programot, ha meg nem, majd még igazítunk rajta
Szerk: mégiscsak megírtam...
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #1572 üzenetére
Szia, mint említettem, nekem nincs arduinom, viszont a kapcsrajzán látok egy stab ic-t is. A tiéd honnan kapja a tápot, amikor a buck-ról járatod? Mert az is lehet gond, ha a stab ic-re csak 5V-ot küldesz és az levesz belőle, mire a procihoz és a többi kiegészítőhöz jut a táp. Meg tudod mérni, hogy pl. az infra paneleden ilyenkor hány volt a táp?
-
zka67
őstag
válasz dave0825 #1580 üzenetére
Szia, örülök neki, hogy működik. Az infra vevőd 5V-ot kellene, hogy kapjon a tápján. Ez egy háromlábú IC, +5V, GND és OUT a lábai, az IC-től függ, milyen sorrendben. Ha a tápján mérted ezeket a feszültségeket, akkor orr valami nem jó, mert 5V-nak kellene lennie, ha a kimenetén, akkor az nagyjából rendben van.
Tudnál csinálni néhány nagyfelbontású fotót az arduinodról és az infráról? Hátha több szem többet lát...
-
zka67
őstag
válasz dave0825 #1582 üzenetére
Akkor légyszíves mérd meg a stab IC-n a tápot:
OUT
-----
| |
|---------|
| |
| |
| |
-----------
| | | | | |
- - -
GND OUT VINA bal oldali lába a GND és a hűtő pad között. Itt 5 V-ot kell mérned, ha ennél kevesebb, akkor természetes dolog, hogy nem úgy működik az áramköröd, ahogy kell. Az USB-ról táplálva úgy látom a kapcsrajzon, hogy van egy FET a táppal sorba kötve, ebben van egy schottky dióda, amin eshet 2-3 tized volt. Lehet, hogy pont ez hiányzik az áramkörnek. Ha a stab IC-n is 4.6-4.7V-ot mérsz, akkor kösd át az USB-ről a tekercs kimenetét a VCC-re.
-
zka67
őstag
válasz dave0825 #1584 üzenetére
Igen, erre gondoltam. Nem ártana, ha itt 5V lenne...
Nem a nanoval lesz itt gond, hanem a táppal. A ledek világíthatnak ettől, hogy a PNP tranzisztorok 5V-ot kapnak, viszont a bázisukra már csak 4.4V jut, azaz kinyitnak egy picit.Kösd át így a tápot:
BUCK->LED->Induktivitás->Nano VCC(plusz innen a földre a kondi).
Ha meg van az 5V a stab IC jelölt lábain, akkor a proci is megkapja az 5V-ot, meg az infra is, ezeknek már működniük kell rendesen. Ha még mindig világítani fog halványan néhány led, az már programhiba lesz. Nem emlékszem pontosan a programodra, de mielőtt sort váltasz, kapcsold ki az aktív sort, írd be az új oszlop adatait és utána kapcsold be az új sort. Remélem értesz. Azért kell előbb kikapcsolni az aktív sort, mert ha enélkül írod be az új oszlop adatait, az megjelenik az aktív sorban is, mielőtt átváltasz az új sorra. De lehet, hogy így van a programodban, mondom már nem emlékszem rá.
-
zka67
őstag
válasz dave0825 #1588 üzenetére
Szia, ezt nem értem, hogyhogy nincs meg az 5V egy 5V-os tápról? A buck-ról mennyi jön le? Mennyi esik a tekercsen? Mekkora áram folyik át a tekercsen?
Ha a buck-ról 5V jön le, néhány mA-t fogyaszt a nanod infrástól mindenestől együtt, akkor nem eshet két tized volt a tekercsen. Hacsak tényleg nem nyírtad ki a nano prociját. Ezt különben kézzel is meg tudod nézni, ha tűzforró a proci, akkor bizony zárlatot csináltál valamelyik lábán egyszer, az kipurcant, és ezért zabálja az áramot. Ha nem, akkor majd keressük tovább a hibát, de mindenesetre ez így még biztosan nem jó.
-
zka67
őstag
válasz dave0825 #1626 üzenetére
Szia, ha a buck kimenetén 5V van, és a tekercsen át a VCC-re kötötted, a tekercsen esik 0.07V, akkor nem lehet a stab ic lábán 0.2V-al kevesebb.
Mérd végig a vezetékeket, hogy hol tűnik el az a két tized volt. Először a buck kimenet és a stab ic lába között mérd meg. Ha itt több van, mint a tekercsen eső feszültség, akkor szerintem valamit elkötöttél.
Menj végig a vezetéken, a buck kimenetére tedd a műszer egyik pontját, és a műszer másik pontjával haladj végig a vezetékeken a tekercsig. Írd le, hogy melyik vezeték hova megy és hány volt esik rajta. Ezután a műszer másik pontját tedd át a tekercs másik végére, azt is írd fel. Mérd meg, hogy a tekercs e pontja és a stab ic között mennyit mérsz.
Esetleg kösd át így a vezetékeket:
BUCK
+5V-----o-------------LED MODUL TÁP----
| |
) |
) |
) |
| |
o----ARDU VCC-- LED MODUL
| | |
=== ARDU |
--- NYÁK |
| ARDU GND| |
BUCK----o-------------o---------------o
GND LED MODUL
GNDA lényeg az lenne, hogy a buck-ról minél közelebbről kapja az ardu a tápot, míg a ledek mehetnek hosszabb vezetékkel is. Elkötés lesz ez... vagy annyira vékony vezetéket használtál, hogy olyan nincs is. 30mA-nél nem eshet két tized volt egy vezetéken, ilyen nincs.
[ Szerkesztve ]
-
zka67
őstag
válasz dave0825 #1636 üzenetére
Szia, ugye te is azt látod, amit én: 4.93V+0.07V=5.00V.
Akkor az ardu tápján hogy lehet még egy tized volttal kevesebb, ha a 4.93V-ot vezetékkel kötötted rá?
Cseréld ki a GND és a táp vezetékeit vastagabbra, legalább 0.5mm2-esekre. Pl. a riasztós kábelekben találsz a vékony vezetékek mellett egy piros és egy fekete vastagabbat, na olyasmire.Előtte azért kíváncsiságból megmérhetnéd a kondi és az ardu VCC és a kond és az ardu GND közötti vezetékeken mekkora fesz esik. Ha 0V-nál többet mérsz, cseréld a vezetéket.
-
zka67
őstag
válasz dave0825 #1641 üzenetére
A led-ek világítása ezek szerint mégiscsak szoftveres probléma lesz...
Nézd meg a mátrixban, hogy melyik ledek világítanak halványan. Szerintem ilyesmi mintázatot fogsz kapni, ahol a . nem világít, O teljes fénnyel világít, x halványan világít:
123456
1 ..O.xO
2 O.x..x
3 x.....
4 ..OO..
5 ..xxO.azaz a következő sorban is világítanak halványan azok a ledek, amik az előzőben be voltak kapcsolva, vagy fordítva.
Az "elveszik az áram a vastagabb vezetékben" mondatodon én is hatalmasat röhögtem
[ Szerkesztve ]
-
zka67
őstag
válasz gyapo11 #1724 üzenetére
Viszont óvatosan kell bánni az olcsó kínai cuccokkal, mert szerintem elég sok selejtes alkatrészt árulnak. Értem ezalatt, hogy a nem tudják a gyártó által specifikált értékeket. Vettem például DS1307-es RTC chipeket, amik napi 20-30mp-et késnek/sietnek, tápot adva rájuk nem állnak be alapértékre, hanem random időről kezdik a futást. Igaz, fillérekért adták, de külső kondival kellett kalibrálnom őket egyesével, ami a munkaidőt tekintve jóval többre jött ki, mint ha megvettem volna a normális chipeket.