Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Az else-if szerkezet könnyen meg tud vezetni, javaslom az átgondolását! Én mindig kapcsos zárójelezem őket, és akkor egyből látszik hogy ki kivel van. Látatlanban ez is okozhat gondot! Meg bőszen nyomogasd a ctrl+t kombót, ez megformázza a kódot! Ez is sokat segít!
A hozzászólás módosítva: Okt 3, 2021
azt hiszem megvan
itt csak 575 a legnagyobb érték, ezt kéne megnövelnem
Hát akkor írj az 575 helyett, olyan nagyobb számot, amilyet szeretnél...
Azt viszont nem érem, miért nem lehet feltenni normálisan az egész kódot, vagy legalább a hozzá tartozó részletet. Egy-két sorból ne várd, hogy bárki is kitalálja mit is akarsz konkrétan...
vagy
ha invertálni kell a PWM jelet (pl. katódvezérelt LED esetén. https://create.arduino.cc/projecthub/wieselly/arduino-tutorial-usin...0dbbd1Bővebben: Link
Nem poti a fényerőszabályzó hanem egy LDR de nagyon nem tudom úgy megcsinálni hogy a fényerő növekedés/csökkenés lineáris legyen (a map-al nem sikerült ugyhogy változtattam rajta) . 16 lépésben növekszik ill. csökken de nem vagyok vele megelégedve. Ez már egy másik kód, ebbe nem is kell a
bright = map(reading, 0, 1023, 255, 0); Régi motoros íta , hogy kevés az info ugyhogy beillesztem a fontos részt.
(Azt kéne csinálnia , hogy LDR méri a szobába bejövő napfényt és ha beborul az ég kisegiti a kevés fényt ha kisüt a nap gyengiti a ledet)
Nem vagyok nagy arduinos, de nekem első olvasatra két dolog tűnt fel...
1. A "sunValue" és "reading" változók értékei mindig egyezni fog egymással, lévén, hogy mindkettőbe az LDR értékét tárolod. A különbség talán csak annyi, hogy míg a "sunValue" változó egy globális változó, addig a "reading" csak lokális változó. (De ha benéztem, a nagyok majd kijavítanak.) Ebből nekem felmerül, miért kell egyáltalán ugyan azt az értéket két változóban tárolni? 2. A fénymérő LDR kimeneti feszültsége nem biztos, hogy lineárisan változik a fényviszonyhoz képest, ezt figyelembe kell venni, meg azt is, hogy a szemed se biztos, hogy lineáris fényerőváltozásként fogja érzékelni a PWM által lineárisan szabályozott világítást. (Bár ahogy látom, a "reading" változóba lévő értékvizsgálat számértékeinek, és a "bright" változóba írt számértékeinek lépcsője sem lineáris.) Ezt programban kell lekódolni. Próbálgatással, vagy fénymérő eszközzel... És egy a ráadás, ha a fénymérő a beltérben van, és azt befolyásolja a szabályozott fény, akkor az máris bezavar az egész szabályozási láncba. A hozzászólás módosítva: Okt 3, 2021
Azt írod nem lineáris, de azt már nem, hogy hogyan nem lineáris. A kódból feltételezem hogy 590 feletti értéknél már telítve van, tehát onnan nincs hasznos érték. Szerintem a map lesz még mindig a barátod, de inkább így:
map(reading, 0, 590, 0, 255). Így a nullához a 0, és 590-hez a 255 értéket adja lineárisan. Elvileg. Próba? Amúgy érdemes lenne konzolba kiírnod az értékeit, és máris látnád hogy mi történik megvilágítva/sötétben. A reading értékét is írasd ki, meg a mappel kapott értéket is párban! Serial.print( reading); Serial.print(" / "); Serial.println(map(reading, 0, 590, 0, 255)); Így mit mutat? A hozzászólás módosítva: Okt 3, 2021
A sunValue csak azért van hogy az lcd-re kiírja a mért értéket.
Idézet: „ 2. A fénymérő LDR kimeneti feszültsége nem biztos, hogy lineárisan változik a fényviszonyhoz képest,” szinte biztos , hogy nem lineárisan változik (és pont ez szivat meg) Idézet: „(Bár ahogy látom, a "reading" változóba lévő értékvizsgálat számértékeinek, és a "bright" változóba írt számértékeinek lépcsője sem lineáris.)” az meg pont a próbálgatás miatt van igy megadva de nem vegyok vele megelégedve Idézet: „Szerintem a map lesz még mindig a barátod, de inkább így: map(reading, 0, 590, 0, 255).” ezzel kezdtem de nem jó. És miután nem lett jó beraktam azt a sok else if -et
A probléma az, hogy mind a bemenő, mind a kimenő érték nemlineáris. A fényerő mérése a kódból következtetve feszültségosztóval van létrehozva, annak a karakterisztikája exponenciális, míg a LED fényerőssége logaritmikus. Több módszert is lehet erre megoldás. Az egyik, hogy egy közbülső, lineáris (vagy inkább ahhoz közelítő) értéket hozol létre, majd ezt igazítod a LED áram/fényerő karakterisztikájához. Ennek az az előnye, hogy van egy emberi léptékkel értékelhető adatod a fényerőhöz. A másik módszer, hogy közvetlenül transzformálod az exponenciális értéket a logaritmikus skála bemenetére. Itt elegendő egy eltolási konstans hozzá, hogy a 2 elem munkapontját egymásra helyezd. Ez technikailag annyit jelent, hogy egy konstanssal el kell tolni a bemeneti értéket, praktikusan csak simán le kell vonni belőle egy számot. Természetesen az erősítést, azaz a munkapont tartományát előbb be kell állítani, ez egy sima szorzással megoldható. Ez a képlet így néz ki: .
A másik módszer, amit inkább használnék, az egy közbülső érték előállítása. Ez a módszer lényegesen bonyolultabb, ezért kezdők számára nem ajánlatos (ezért nem írom itt le. akit érdekel a téma, annak figyelmébe ajánlom a Steinhart-Hart közelítést), viszont univerzálisabb, jobban implementálható más paraméterekkel rendelkező be- és kimenetekhez. Elvileg a te módszered is (táblázatos) jó lehet, amennyiben sikerül megfelelően kitölteni a táblázatodat. Én inkább egy tömböt használnék a helyedben az ELSE IF szerkezet helyett. Egy egyszerű kódot gondolnék elsőre kipróbálásként, remélem segít:
Természetesen a paramétereket a saját hardveredhez kell igazítani (célszerű a soros porton kiiratni a számított értékeket, hogy az esetleges konverziós hiba látszódjon).
Na igen, gondoltam, hogy valami ilyesmi van a háttérben.
A map() fügvény az biztos, hogy lineáris konvertálást végez (nagyon apró hibával). Bár ha neked csak annyi lenne a célod, hogy egy szobában mindig azonos fényerőd legyen napszaktól függetlenül, akkor szerintem azt máshogy kellene megoldani. Konkrétan a szoba fényerejét mérni az LDR -el, és a PWM értékét egy számlálóval egyesével csökkenteni vagy növelni, és egy minimális hiszterézis betenni.
Ezzel az a baj, hogy a bemeneti értéked soha nem lesz nulla (0,590). A map 2. és 3. paraméterét kísérleti úton határozd meg, azaz a legkisebb és a legnagyobb bejövő fényerősségnél nézd meg, hogy mekkora értékeket olvasol be és ezeket írd a függvénybe.
A reading legkissebb értéke 235, azaz ez alatt ki kell kapcsolni a világítást, és a legnagyobb 590 azaz itt már max fényerő kéne legyen
Ha nem lineáris mappelést akarsz, akkor bármilyen görbét le lehet írni néhány ponttal, és a pontok között pedig lineáris interpolációt lehet használni. Én a SY-HS230-as páratartalom szenzornál pl. ezt csináltam (natív C, de a lényeg ugyanaz):
Az eredmény itt százalékban van 0..100 tartományban. A SY_HS230_points tartalmazza, hogy 10, 20 .. stb. százalékos páratartalomhoz milyen AD érték tartozik. Nálam ezt az adatlapban megadták, de könnyebb egy tömbben átírogatni a számokat, mint a sok sok if. Ha ezen a tartományon kívül esik az AD értéke, akkor visszatér a min vagy max értékkel. Közötte kikeresi azt a két számot, ami közé esik az AD értéke, pl. 221 és 278, amihez a 30 és 40% tartozik, majd ezen adatok alapján kiszámolja a tényleges AD érték alapján ebben a tartományban lineárisan az eredményt kerekítve. Oké, lehet, hogy kezdőknek ez így túl bonyolult, de ha már megírtam itt hagyom. Valakinek még jó lehet. A hozzászólás módosítva: Okt 3, 2021
Idézet: „feszültségosztóval van létrehozva, annak a karakterisztikája exponenciális,” Erre szánnál nekem egy gondolatot? Mitől lesz exponenciális a görbe ha feszültség osztó állítja elő? Az ldr tudtommal lineáris. Nem kekeckedem, csak nem értem.
Teljesen jogos a kérdés. A feszültségosztó egyik értéke konstans, az soha nem változik. Tehát nem a feszültségosztó hanem az azzal létrehozott jel lesz nemlineáris (akkor lenne lineáris, ha mind a két érték egyszerre változna azonos mértékkel, egymáshoz képest ellenkező előjellel, mint pl. egy potméter). A kimeneti feszültség a 2 ellenállás arányától függ, R1/R2. Ha az R1 konstans és csak az R2 változik, akkor az egy nemlineáris függvény (1/X). Azért neveztem exponenciálisnak, mert az átlag kommunikációban ezzel lehet a legjobban kifejezni a lineáristól való eltérést, úgymond ezt mindenki ismeri. De valójában ez a függvény hiperbolikus, amivel viszont úgy gondolom, hogy sokan nem tudnak mit kezdeni. A lényeg, hogy ha az LDR-t egy feszültségosztó egyik tagjaként használjuk, akkor a kimeneti feszültség nem lesz lineáris az LDR ellenállás változásával.
Az LDR sem lineáris alkatrész, a szem karakterisztikája végképp nem az.
Egyszerűbben is meg lehet oldani a feladatot, ahogy Régi motoros írta. Valószínűleg van egy fényerő, ami már jónak mondható. Legyen kb. bármilyen LDR és ellenállás alkotta feszültségosztó, egyszer kell kalibrálni, miszerint ez a "jó fényerő" a helységben. A hozzászólás módosítva: Okt 3, 2021
Egyetértünk, hiszen ezt írtam, hogy sem a bemeneti jel, sem pedig a kimeneti (áram/fényerősség karakterisztika) nem lineáris.
Hát erre nem gondoltam, pedig logikus! Köszi!
Esetleg ha nem 1xszer hanem többször (5-10 minta 2-5 perc alatt )mérnél és azt átlagolnád ki .
Igaz a fényerő nem túl gyorsan változik ... habár villám, reflektorok villanása megzavarhat.
Hello! Vagy nem értem, vagy nem értelek. Miért akarsz két eltérő karakterisztikából kihozni egy állandó értéket? Ha méred a fényerőt a kívánt ponton, és ha kevés rá adsz, ha sok leveszel a fényből. Mint ahogy bármely szabályzó tenne. Ha meg trend szabályozás a cél, akkor az alapjelet változtatod a kívánalom szerint..
majkimester megoldása lineáris becslésével ismét zseniális, tömör, gyakorlatban tökéletes pontosságú, kivételes gyakorlati programozó tudást bizonyít.
Pontosabb a több matek miatt, ezért bonyolultabb megoldás: Excelben grafikont rajzolni, majd meghatároztatni ezt a görbét polinomiális (azaz legjobban lefedő) egyenletet. majkimester számaival: x = mért érték ={100, 119, 155, 211, 278, 348, 417, 481, 536, 587, 634}; y = százalék. 2-od fokú, pontatlanabb: y = 0.7786x2 + 48.512x + 24.57. 3-ad fokú, pontosabb: y = -0.6461x3 + 12.408x2 - 9.7642x + 95.121. 4-ed fokú - mazohistáknak : y = 0.0577x4 - 2.0307x3 + 23.427x2 - 42.303x + 122.12. Hasonlóképp a PT100 hőmérséklet érzékelők egyenleténél "tetszőleges" pontossággal meghatározható az ellenállás-hőmérséklet összefüggés a gyári egyenlet alapján. Azért érdemes elgondolkodni: mekkora pontosság kell? Van gyakorlati jelentősége, hogy 34% vagy 36% a mért légnedvesség vagy Jonni-nál a fényerő? A hozzászólás módosítva: Okt 4, 2021
Köszi. Az általad irt polinomiális egyenlet is jó lenne, de a gyakorlatban vagy lebegőpontosan számolod (ami erőforrás zabáló), vagy a polinomokat fixpontosan mondjuk 256-tal szorozva tárolod (ami persze szintén pontatlansághoz vezet), majd a végén skálázod az eredményt. Emiatt és akár az x2 kiszámolása miatt is fixpontosan is 32 biten kellene számolni, de az is csak másodfokúig jó, mert az x3 még abba sem férne bele. Összegezve a 8 bites kontrolleren jobban jár az ember az általam irt közelítéssel, mert ott a legbonyolultabb művelet a 16 bites integer szorzás/osztás.
Az excel-t egyébként sokszor érdemes használni ha ilyesmi problémát old meg az ember, akár az algoritmus ellenőrzésére is. Az ember végigpörgeti a bemenő adatokat 0..1023 között, majd soros portra kinyomva (rendes környezetben akár szimulátorban) a függvény által visszaadott értékeket, azt lehet excel-ben ábrázolni, és összevetni azzal amit szeretnénk. Egyből kiderül, hogy minden értékre az elvárt eredményt kapjuk-e.
A kérdés feltevője egy vezérlési problémát vetett fel, te meg szabályozásról beszélsz. Ez a lényeges különbség a kettő között.
Egyébként a szabályozás sem lenne teljesen jó kompenzálás nélkül, mert az LDR fényesség érzékelése és szemé más és más a mesterséges és a természetes fényre (ez a fülnél is jelen lévő tulajdonság, hogy a mélyebb hangokat más hangerővel halljuk), mivel más-más a hullámhosszuk. De nem ez volt a feladat, hanem egy vezérlési probléma megoldása. Úgy gondolom, hogy egy táblázatos formában felírt karakterisztika (vagy Majki megoldása is) elfogadhatóvá teszi a fényérzékelést (ami hullámhossztól is függ, mivel a kékebb fénynek nagyobb az energiája). Egy sima szabályozás számszerűen stimmelne, de érzékelésben már nem.
Közelít a dolog.. Bocsánat a belevau-ért... Anno 12-15 éve volt egy felkérés gyártóasztalok-mesterséges-természetes fényű hangár (üvegpiramisok a tetőn). Feltétel: munkaasztalon mindig azonos fényerő és színhőmérséklet. Elengedtem a dolgot, mert: jött a felhő, jött az eső és az a fránya Nap is felkelt meg lenyugodott más színnel. Nem tudom, utána ki oboázott a dolgon, csak annyit hallottam, hogy elfelejtette, hogy az emberi szem automatikusan állítja a színhőmérsékletet is meg hogy a Nap nagyon tud ám besütni, amikor a prizmaszerű üvegtetőn keresztül odaköszön (a világ LEDtermelése sem lenne elég akkora fényerőhöz), aztán jön egy madárraj... Különben érdekes feladat, diplomamunkának országos elsőbe elmenne szerintem Elnézést kérek, hogy beleszóltam! (egy hétköznapi LED-es LCD backligh vezérlése sem lineáris, mert ugye ha nagyon sötét van, akkor alacson, ha meg nagyon világos van, akkor nulla, tehát haranggörbe az is)
Sziasztok!
Egy kezdő kérdés: ARDUINO-nál RESET után, ha kimenetnek állítjuk a lábakat, akkor van-e meghatározott szintje a lábaknak vagy véletlenszerű is lehet, mint például a PIC-nél ( nem láttam a doksiban, ha tudtok erről, akkor egy link jó lenne erről is ! ) !? Előre is köszönöm a segítséget!
Reset alatt lebegnek a lábak (high-Z impedancia), reset után minden kimenet GND, minden port 0b00000000, ha nem Arduino környezet alatt néznéd, akkor minden egyéb regiszter felveszi a 0 értéket (kivéve ha az adatlap másként specifikálja), de az Arduino bootloader a reset után mindent beállít, hogy neki megfelelő legyen (timerek, negszakítások, stb).
Nekem erről az a kérdés ugrott be, na és ha nincs bootloader?
Mert én ISP -n keresztül programozom, és direkt kivettem a bootloadert, hogy ne foglalja a helyet...
Igazad van. Nem a bootloader állítja be, hanem az Arduino IDE által lefordított hex legeleje tartalmazza a beállításokat, utána helyezkedik el a setup(), ami egyszer fut le, majd a loop() függvény, ami önmagát ismétli. Köszi, hogy felhívtad erre a figyelmem.
Nem lehet véletlen, mert mind a DDR, mind a PORT regiszter törlődik, azaz a kimenetük alacsony szintre kerül RESET után. A DDR alacsony szintje alapján lesz az adott PIN bemenet. Ha ilyenkor kapcsolod át kimenetként, akkor alacsony szintű lesz a kivezetés. De ha a PORT regisztert átírod magas szintre és utána váltasz át kimenetre, akkor magas szintű lesz a kimenet.
|
Bejelentkezés
Hirdetés |