int a=2; int b=3; int c=4; int d=5; int e=6; int f=7; int g=8; int D1=13; int D2=9; int D3=10; int D4=A5; int num =0; int x=0; int y=0; int z=0; int w=0; int speed =3000; unsigned long previousMillis = 0; // a,b,c,d,e,f,g int num_array[10][7] = { { 1,1,1,1,1,1,0 }, // 0 { 0,1,1,0,0,0,0 }, // 1 { 1,1,0,1,1,0,1 }, // 2 { 1,1,1,1,0,0,1 }, // 3 { 0,1,1,0,0,1,1 }, // 4 { 1,0,1,1,0,1,1 }, // 5 { 1,0,1,1,1,1,1 }, // 6 { 1,1,1,0,0,0,0 }, // 7 { 1,1,1,1,1,1,1 }, // 8 { 1,1,1,1,0,1,1 }}; // 9
// this functions writes values to the sev seg pins void Num_Write(int number) { int pin= 2; for (int j=0; j < 7; j++) { digitalWrite(pin, num_array[number][j]); pin++; } }
A megoldás a modulo. Ez a tízzel való osztás maradéka:
modulo 142 = 2
142/10 (egész számon) = 14
modulo 14 = 4
14/10 (egész számon) = 1
modulo 1 = 1 (nem meglepő módon).
Attól függően, hogy mekkora számtartományon dolgozol, léterhozol egy (átmeneti) változót az egyes, tizes, százas, ezres, stb. helyiértékre, és amikor értéket akarsz kiíratni, akkor "leosztod" a munkaváltozód aktuális értékét erre.
A másik alternatíva, hogy eleve helyiértékekkel számolsz, ennek viszont van pár hátránya, ami nem várt eredményt adhat.
A kijelzés lehetőleg ne legyen 20 Hz-nél pörgősebb, mert nem fog látszani rendesen a 7 szegmenses. Magyarul ne frissítsd minden adandó alkalommal. :-)
//Logic to print digit/character on 7 segment display S.setNumber(cnt); S.refreshDisplay(); delay(100);//storing the button states incPrev = inc; decPrev = dec;
Az egyszerűbb az sn74hc595 shift register. Kicsit egyszerű, de van hozzá jó könyvtár, amiben a számok is implementálva vannak.
A második szint a max7219/7221, ez már azért szofisztikáltabb cucc, szintén alkalmas 7 szegmenses meghajtásra és mivel árammal hajt, így előtétellenállások sem kellenek.
Odáig még nem jutottam el, hogy az időjel alapján milyen logika mentén csinál szabályozójelet. Egy dologra tudok gondolni, ez pedig az, hogy a ledek érzékelhető/látható fényereje a lineáris kitöltési tényezőhöz képest fordítottan exponenciális, tehát két szomszédos kitöltési tényező az alsó (nem világító) részen jóval nagyobb érezhető fényességváltozással jár, mint a felsőbb részen. Sőt, én 80 százalék feletti lépéseknél soha nem láttam eltérést, még 5-ös léptetésnél sem. Ezt a negatív exp függvény egészen jól kompenzálhatja, már ha ez szempont.
Mondjuk szerintem az ATMegák Arduino keretrendszerben pwm kimenetet generálva nem feltétlenül adnak nagyon vidám eredményt. Bár fogalmam sincs, hogy a halak ebből mennyit érzékelnek.
=30*A31+225*KÉPZ.EXP(-HATVÁNY((A31-3); 2)) Ez az excel képlet, amit be kell illeszteni, az első oszlop 0-tól 8,5-ig, 0.1-es lépésekkel, ez pedig a második oszlop végig (az A31 a hivatkozás, ennek az első sorban A1-nek kell lennie, és onnan kell lehúzni).
Próbálom ezt a rémálmot megfejteni. Eddig nagy vonalakban odáig jutottam el, hogy több lehetséges állapot alapján (amelyet a jelek szerint idő vezérel) csökkenti vagy növeli a ledek fényességét.
Magát a fényességet a korábban idézett borzalmas képlet állítja be, konkrétan ez:
Az x egy működési változól, erre késpőbb visszatérek.
Az X_DIFF egy konstans, fix 3 az értéke.
A SLOPE szintén konstans, pontosan 10 az értéke.
Az exp az e-alapú exponenciálist számolja, vagyis e értéke a paraméterben megadott hatványon).
A pow a hatványozás függvénye, ahol az első paraméter az alap, a második paraméter a hatvány, itt tehát a 2. hatvány működik.
Először helyettesítsük be a cuccokat:
fading = e^(-(x-3)^2) * (255 - 10 * 3) + 30x.
Átrendezve:
fading = 30x + 225 * e^(-(x-3)^2).
fadig értelmezési tartománya 0-tól (teljes fényerő bekapcsolva) 255-ig (kikapcsolva) terjed. Az Excel itt a barátunk (bár a CASIO 991 még inkább az lenne), és segít megoldani, hogy a fading értelmezési tartományára x értékének közelítőleg 0 és pontosan 8,5 között kell lennie, a 8,5-et is beleértve. De... Ha a teljes tartományt nézzük, akkor van egy galiba, nevezetesen 2,5 körül a fading értéke átlépi a bűvös 255-öt, majd kicsúcsosodik x = 3,1 körül, majd visszamegy x = 4,8 körül egy újabb minimumra, ahonnan nagyjából lineárisan emelkedik végig. Lásd az ábrát. Tehát x értéke 0 és közelítőleg 2,5 között lehet. Nekünk az lenne a célunk, hogy a minimumot (ahol viszonylag lineáris, de kis meredekséggel) feljebb hozzuk, ne 0 legyen, hanem valahol 1--1,5 között.
x értékét a kódban több ponton direktben állítják. Van x = 0; x = X_DIFF; (vagyis feloldva x = 3;), továbbá x += X_DIFF / dawnDuration, illetve x -= X_DIFF / dawnDuration. Ez utóbbi kis magyarázatra szorul. x = 0 a teljes fényerő. x = X_DIFF, vagyis x = 3 elméletileg 315-öt ad eredményül. Őszintén szólva fogalmam sincs, hogy az Arduino IDE ezt hogyan fordítja le a 0 és 255 között értelmezhető char típusú változó értékére (valószínűleg vág, de ezt tesztelni kellene), de tételezzük fel, hogy ez így normális működést eredményez. A következő rész az x módosítása (vagyis a fokozatos világostás a -=-vel és a sötétítés a +=-vel, ami az aktuális x értékéből vesz el vagy az értékéhez ad hozzá 3 / dawnDuration-t, ami a kód alapján egy másodpercben kifejezett érték, de a kód maga konkrét értékadást nem tartalmaz (ez egyébként egy baromi nagy kódolási hiba). Az értéke egyébként meglehetősen széles tartományon belül mozoghat, 86400-at, vagyis teljes 24 órát is láttam, de arra nem sikerült rájönnöm, hogy ennek így mi értelme van.
Sebaj.
Magát a fényerőállítást a light_fading() függvény csinálja, ami a mian_screen fülön van alul. Ennek is a legvége az érdekes a fenti képlettel és az analogWrite függvényhívással, ami konkrétan a kimenetet vezérli.
Namost. Az a fő kérdés, hogy miként lehet a maximális fényerőt valamennyire csökkenteni? a helyes válasz az, hogy fading értékének minimalizálásával. Ezt a teljes fenti körforgás megértésével (illetve a most hiányzó értékű dawnDuration változó értékének számszerűsítésével) lehetne többé-kevésbé modellezni, majd javaslatot tenni arra, hogy ebben az eszelősen nagy katyvaszban hol, mit és hogyan kellene megváltoztatni (nagyjából kísérleti úton) ahhoz, hogy sikerrel járjunk. Vagy.
Van egy kotvány megoldás, ami egy sornyi kód, brute-force, minden léltező konvencióval szembe megy és a már most is gyalázatos kódon rettenetesen sokat ront tovább. De -- elvben -- megoldja a problémát.
if (fading < 20) fading = 20;
vagy nagyon elborultan:
fading = (fading < 20) ? 20 : fading;
A 20 értékét változtatva a kódban lehet a maximális fényerőt változtatni, de bele lehet írnia kódba, hasonlóan a többi változóhoz, hogy eepromból olvassa, illetve akár állíthatóvá tenni, hogy oda visszaírva a következő restartnál is már a jó érték legyen benne.
Hardveresen egyébként a feszültség csökkentésével lehetne megoldani, de erre a feltételezhetően több wattnyi teljesítmény miatt annyira nincs egyszerű és olcsó módszer.
Az utolsó nyákomat április negyedikén rendeltem, és tegnap itt volt vele a futár, teljesen normális szállítással, nem DHL-el.
Az előző 11 nap alatt ért ide a rendeléstől számítva. És ezek lila színűek, amiknél a gyártás alapból +2 nap.
Amióta nem kerül bele a Magyar Posta képviselte fekete lyukba, amiből információ még Hawking-sugárzás formájában sem jut ki, hihetetlen sebességgel jönnek a panelek.
köszönöm, akkor marad az easyeda. Amire nekem kell, arra a biztosan elég, meg a JLCPCB oldal támogatja - na annyi pénzért SENKI más nem készít 100x100mm-es nyákot, nekem meg az bővel jó.
Nem egyszerű a kérdésre a válasz, de megpróbálom. Mint mindig, itt is attól függ, hogy mi a használati cél.
Alapvetően a Fritzing egy végtelenül egyszerű, elsősorban dugpaneles áramkörtervezésre (inkább dokumentálásra) való korábban ingyenes alkalmazás. Az, hogy most 8 dollárt kérnek érte, ágya vigye.
Hogy mennyire jó, az attól függ, hogy mire kell. Amikor én néztem (és ez még az EAGLE előtt volt, és azt biza legalább 6 éve kezdtem használni), akkor a legnagyobb bajom az volt vele, hogy nem volt átjárható a dugpanel, az áramkörtervező, és a nyomtatott áramköri tervező. Vagyis amit dugpanelen összeraktál, abból nem csinált neked áramkört, abból nem tudtál nyákot tervezni. Ez azóta változhatott (nálam talán a 0.65 verzió volt fent).
Arduinos megoldásokhoz szerintem teljesen jó, dugpanel tervezéshez vagy dokumentáláshoz kiváló, értelmes THT nyákot még bőven meg lehet vele tervezni, ha nincs túl sok alkatrészed és nem kell ground plane (korábban nem tudta, hogy most tudja-e, azt nem tudom).
De! Mivel kötöttek (voltak) az alkatrészek, így nyilván nem tudtál 4-5-6 raszteres ellenállások között választani, vagy ha a tranzisztorod nem raszteres lábkiosztású volt, hanem fél raszteres, akkor így jártál, mert csak az eredeti 1 raszteres kiosztással tudtál nyákot tervezni. Nagyjából itt hagytam abba az e célból való alkalmazását). SMD nem volt (akkor).
Ha nem kell dugpanel és komolyabban is akarsz tervezni, akkor KiCad vagy EasyEDA. Mindkettő ingyenes, de van még pár hasonló, egészen jól működő alternatíva (ne kérdezd, nem emlékszem a nevükre).
említetted ezt a Fritzing kapcsolási rajzot. Semmi bajom azzal, ha egy programért fizetni kell, ez így normális, 8 euró nem a világ. Te viszont gondolom ismered. Mennyire vált be?
Cseppet még korán van, megpróbáltam értelmezni a kódot, de nem nagyon ment.
A ledek világosságát a light_fading() függvényben állítja a kód, ezt a (main_screen) fülön találod az IDE-ben.
Magának a fényerőnek az értékét a fading változó adja meg, ha ez 255, akkor ki van kapcsolva, ha 0, akkor teljes fényerőn megy (legalábbis ha a Fritzing kapcsolási rajzot nézem, abból ez következik).
Az érték kiszámításához egy lenyűgözően idióta sort használ:
Ezt így itt kiemelem, mert a rossz kód genotípusa.
A megfejtéshez sima matematikai ismeretek, továbbá az x, az X_DIFF, és a SLOPE változók lehetséges értékei, illetve az értékek alakulásának rendje kellene.
Ha estig nem lesz meg, megpróbálom megfejteni. De erősen megsimogatnám a kódot író embert egy szívlapáttal, nekifutásból.
Építettem egy akvárium világítás vezérlőt Arduino nano-val. Az Instructables oldalról van, úgy néz ki, hogy működik rendesen. Azt kellene megoldanom, hogy a max fényerőt a LED világításnál, hogyan tudnám módosítani ?
Azt látom, hogy a PWM-el szabályozza a FET-et az Arduino , csak arra nem tudtam rájönni, hogy ahhoz mit kellene átírnom, hogy ne menjen teljesen 100%-ig fel a fényerő. Mert itt amint nézem 0-255-ig szabályoz fel , tehát teljesen 100%-ig.
A DHT11 legendásan hitvány precizitás tekinetében. A DHT22 egy fokkal jobb nála.
Ha rákeresel, valahol van egy youtube video a különböző kombinált szenzorok összehasonlításával. Páratartalmat egyébként sem túl egyszerű mérni.
Az Arduino keretrendszert úgy 2 évente kvázi újradrótozzák, így azok a könyvtárak, amelyek mondjuk 4 éve jól mentek, az új verzióban nem biztos, hogy működnek. Ha jól vannak karbantartva, akkor az IDE-ben frissíthetők (sőt, szól is miatta, hogy van frissíthető könyvtár).
Most írom másodszor , mert az előbb mikor küldtem volna elszállt.
" radio.setChannel(100); // csatorna 2400-2525 mhz 0-125 "
ez nagyon egyszerűnek tűnik ki fogom próbálni.
Az unsignedről pedig olvastam és nem jöttem rá , így hogy írtad beugrott.
Ahogy elemezted teljesen érthető volt , de nem fogom használni .
Először "0xE8E8F0F0E1LL " ezzel működött adó és vevő oldalon. Én úgy koppintottam egy példaprogramból .
De most átálltam erre az egyszerűbb csomópontos címzésre.
ezek csomópontok címei
" 00000 " szobai ez a bázis
" 00001 " udvar közvetlenül beszél a bázissal
" 00002 " tartály közvetlenül beszél a bázissal
" 00021" padlás csak a " 00002 " ön keresztül tud beszélni a bázissal
Az első 00000 és 00001 már három éve működik , most tovább akarom bővíteni .
Ez egy meteorológiai adatgyűjtő állomás , elég sok van a netten .
udvari :
- DHT11 páratartalom
- Dallas 18B20 hőmérséklet
szobai :
- DHT11 páratartalom
- Dallas18B20 hőmérséklet
- 100 Kohm termisztor radiátor előremenő
- 100 Kohm termisztor radiátor visszatérő
- RTC óra
- SD kártya
- 16x2 LCD kijelző
- led minden méréskor villan
Mikor megy akkor évekig megbízható , de ha újra kell tölteni a programot , akkor 5 x lefordítja a programot aztán hibát jelez . Mindent újra telepítek , akkor megint jó.
UNO klónokat használok, még így hatszor drágább mint a bolti állomás , de szeretek vele bütykölni.
A hőfokot nagyon pontosan méri, a párát már nem annyira.