Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   703 / 839
(#) sargarigo válasza Jonni hozzászólására (») Okt 3, 2021 /
 
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
(#) Jonni válasza sargarigo hozzászólására (») Okt 3, 2021 /
 
azt hiszem megvan

  1. bright = map(reading, 0, 575, 255, 0);


itt csak 575 a legnagyobb érték, ezt kéne megnövelnem
(#) Régi motoros válasza Jonni hozzászólására (») Okt 3, 2021 /
 
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...
(#) icserny válasza Jonni hozzászólására (») Okt 3, 2021 /
 
  1. bright = map(reading, 0, 1023, 0, 255);

vagy
  1. bright = map(reading, 0, 1023, 255, 0);

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
(#) Jonni válasza icserny hozzászólására (») Okt 3, 2021 /
 
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.

  1. sunValue = analogRead(LDR);        // napfény mérés
  2.   RTC.read(dateTime);
  3.   int bright = 255;  //alapértelmezett érték, ha sötét van akkor max a világítás
  4.   if (dateTime.Hour >= lightStartHour && dateTime.Hour < lightEndHour) {
  5.     lightValue = HIGH;
  6.     int reading = analogRead(LDR);        // ldr olvasása
  7.     if (reading < 230) bright = 0;        // ... alatt kikapcsolja a világítást
  8.     else if (reading < 235) bright = 1;   //  kicsi fényerő
  9.     else if (reading < 244) bright = 6;   //  kicsi fényerő
  10.     else if (reading < 258) bright = 10;  //  kicsi fényerő
  11.     else if (reading < 270) bright = 22;  //  kicsi fényerő
  12.     else if (reading < 305) bright = 48;  //  kicsi fényerő
  13.     else if (reading < 340) bright = 87;  //  kicsi fényerő
  14.     else if (reading < 375) bright = 115; //  közepes fényerő
  15.     else if (reading < 388) bright = 128; //  közepes fényerő
  16.     else if (reading < 410) bright = 143; //  közepes fényerő
  17.     else if (reading < 428) bright = 160; //  közepes fényerő
  18.     else if (reading < 445) bright = 171; //  közepesnél erősebb fényerő
  19.     else if (reading < 480) bright = 199; //  közepesnél erősebb fényerő
  20.     else if (reading < 515) bright = 227; //  közepesnél erősebb fényerő
  21.     else if (reading < 545) bright = 238; //  közepesnél erősebb fényerő
  22.     else if (reading < 568) bright = 246; //  közepesnél erősebb fényerő
  23.     else if (reading < 590) bright = 255; // ...-nál max fényerő
  24.   } else {
  25.     lightValue = LOW;
  26.     bright = 0;
  27.   }
  28.   analogWrite(lightPin, bright);        //lábra küld pwm
  29. }                         //világítás automatizálás vége


(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)
(#) Régi motoros válasza Jonni hozzászólására (») Okt 3, 2021 /
 
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
(#) sargarigo válasza Jonni hozzászólására (») 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
(#) Jonni válasza Régi motoros hozzászólására (») 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
(#) Jonni válasza sargarigo hozzászólására (») Okt 3, 2021 /
 
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
(#) Josi777 válasza Jonni hozzászólására (») Okt 3, 2021 / 1
 
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: KI=(BE*x)-y..
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:
  1. byte KI;   // LED PWM értéke
  2. unsigned int BE;  // LDR beolvasott értéke
  3. const unsigned int BEmin=100, BEmax=1200, Felbontas=8;
  4. byte fenyesseg[]={01,03,06,10,17,22,34,56}; // A tömb elemeinek a száma a felbontás
  5. void calc() {
  6.   float vol=(BEmin-BEmax)/Felbontas;
  7.   KI=(BE-BEmin)/vol;
  8.   KI=fenyesseg[KI];
  9. }

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).
(#) Régi motoros válasza Jonni hozzászólására (») Okt 3, 2021 /
 
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.
(#) Josi777 válasza Jonni hozzászólására (») Okt 3, 2021 /
 
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.
(#) Jonni válasza Josi777 hozzászólására (») Okt 3, 2021 /
 
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
(#) majkimester válasza Jonni hozzászólására (») Okt 3, 2021 / 4
 
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):

  1. #define SY_HS230_POINTS_LEN  11
  2. //                                                ***  10%  20%  30%  40%  50%  60%  70%  80%  90%  ***
  3. PGVAR u16 SY_HS230_points[SY_HS230_POINTS_LEN] = {100, 119, 155, 211, 278, 348, 417, 481, 536, 587, 634};
  4.  
  5.  
  6. u08 SENSOR_fit_SY_HS230_curve(u16 sampleval)
  7. {
  8.   u08 i;
  9.   u16 range;
  10.   u16 valdiff;
  11.   u08 minpercent;
  12.   u08 percent;
  13.  
  14.   if (sampleval <= SY_HS230_points[0])                     return 0;
  15.   if (sampleval >= SY_HS230_points[SY_HS230_POINTS_LEN-1]) return 100;
  16.  
  17.   i=1;
  18.   while (SY_HS230_points[i] < sampleval) i++;
  19.   range      = SY_HS230_points[i] - SY_HS230_points[i-1];
  20.   valdiff    = sampleval          - SY_HS230_points[i-1];
  21.   minpercent = 10 * (i-1);
  22.  
  23.   percent = minpercent + (10*valdiff + range/2) / range;
  24.   return percent;
  25. }


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
(#) sargarigo válasza Josi777 hozzászólására (») 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.
(#) Josi777 válasza sargarigo hozzászólására (») Okt 3, 2021 / 3
 
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.
(#) Bakman válasza Josi777 hozzászólására (») Okt 3, 2021 /
 
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

LDR.jpg
    
(#) Josi777 válasza Bakman hozzászólására (») 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.
(#) sargarigo válasza Josi777 hozzászólására (») Okt 3, 2021 /
 
Hát erre nem gondoltam, pedig logikus! Köszi!
(#) Kera_Will válasza Jonni hozzászólására (») Okt 4, 2021 /
 
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.
(#) proli007 válasza Josi777 hozzászólására (») Okt 4, 2021 /
 
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..
(#) HeZ válasza majkimester hozzászólására (») Okt 4, 2021 / 1
 
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
(#) majkimester válasza HeZ hozzászólására (») 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.
(#) Josi777 válasza proli007 hozzászólására (») Okt 4, 2021 / 1
 
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.
(#) wbt válasza Josi777 hozzászólására (») Okt 4, 2021 / 1
 
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)
(#) kissi hozzászólása Okt 4, 2021 /
 
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!
(#) Kovidivi válasza kissi hozzászólására (») Okt 4, 2021 /
 
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).
(#) Régi motoros válasza Kovidivi hozzászólására (») Okt 4, 2021 /
 
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...
(#) Kovidivi válasza Régi motoros hozzászólására (») Okt 4, 2021 /
 
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.
(#) Josi777 válasza kissi hozzászólására (») Okt 4, 2021 /
 
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.
Következő: »»   703 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem