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   653 / 839
(#) mateatek válasza wbt hozzászólására (») Szept 14, 2020 / 1
 
A szűz csippnél keressél rá az "larduino isp"-re. Ezzel tudod feltölteni a bootloadert, vagy a programot. A "larduino isp" működik LGT csippel is és atmegával is. Az LGT8F328D (nem P, hanem D) csippeket szinte csak ezzel lehet programozni. Bootloaderrel nem nagyon, mert azoknak annyira rossz a belső órajele.
Szerk: A Larduino ISP kapcsolásánál van egy felhúzó ellenállás. Sok helyen nem jelölik. Ez nélkül életképtelen.
A hozzászólás módosítva: Szept 14, 2020
(#) mateatek válasza wbt hozzászólására (») Szept 14, 2020 /
 
Idézet:
„Olvasom a 283 oldalt, próbálom is, néha elakadok”


Ha jól értem, akkor az ADC-t olvasod. Az ADC-je rendesen 12 bites. A módosulás az arduinóra alkalmazott libekben van. A lib-ben úgy írták le a mérést, hogy 2 mérés átlagát fogod kapni. Ez kissé időigényes. Ha gyorsan akarsz mérni és ezzel az MCU-val lehet is, akkor nem árt külön függvényt írni rá, hogy ne kétszer mérjen egy analogRead() parancsra. Egy méréssel is jól mér és a belső referencia feszültsége is megbízható.
(#) nemgyuri válasza usane hozzászólására (») Szept 14, 2020 /
 
Szia! Ez a problémám volt nekem is, de nem tudtam megoldani, csak megkerülni...
Egy mintával megmutatnád?
(#) usane válasza nemgyuri hozzászólására (») Szept 15, 2020 /
 
Szia!

Nem tudom, hogy tényleg ugyanaz-e a problémád, elmondom nálam mi volt.
Nekem számjegyek érkeztek egy uint8_t tömbbe aminek a mutatója állt rendelkezésemre.
Ezek 1 byte decimális értékének számjegyei voltak, tehát max 255. A végén egy stringzáró karakter is volt, szerencsére. Ha e tömb elemeit egyesével nézzük az nem túl célravezető, mert a számjegyek ASCII kódjait kapjuk. Ez egy WiFi-kommunikáció során kapott érték volt egyébként.(uint8_t *payload).
Ebből a kívánt 1 byte-os érték:
  1. uint8_t akarmi = atoi((char *)payload);
(#) wbt válasza nemgyuri hozzászólására (») Szept 15, 2020 /
 
Megy végre az ADC, de zajosabb, mint egy M328, de hát 12 bites 10 helyett, belefér. Érdekes egy állat ez a uC, tartogat meglepetéseket, ma megpróbálom túlhajtani
(#) mateatek válasza wbt hozzászólására (») Szept 15, 2020 /
 
Rendes tápról, nem a számítógép USB-ről táplálva, feszültség referenciát használva a méréshez stabil tud lenni. 1 millivoltos felbontású méréshez azért már kell rendes körítés is.
(#) usane hozzászólása Szept 16, 2020 /
 
Üdv!

Következő dolgot szeretném megvalósítani, ha lehet. ESP32 - Arduino IDE környezet.
Lesz rengeg változóm, amit előre deklarálok. Wifin jönnek adatcsomagok (ESP32). Kulcs-érték páros, lehet, hogy JSON formátumban, lehet, hogy nem majd eldöntöm (android app fogja küldeni). Az adatcsomag char[] formában áll rendelkezésemre, ebből akartam kivenni a kulcs nevét az értéket pedig átadni ennek a nevű már ledeklarált változónak, és ezt nem így:
  1. if (érkezett kulcs == "xy") xy = érkezett érték;

az összes értékre (mert rengeteg van) és nem egyfajta csomag jön, más-más adatok.
hanem az adatfoyalmból szeretném kivennni a változó nevét és azt felhasználni.
Tehát, ha az érkezett kulcs = "my_var" és az értéke = 25 akkor -> kulcsnev(ami jelenleg my_var, de bármi lehet) = ertek (ami most 25);
Természetesen a my_var az előre deklarált változók egyike.
Az érték átadása bárminek nem nehéz mert érték, de az értékből változó nevet kreálni az a fő feladat.
A hozzászólás módosítva: Szept 16, 2020
(#) vargham válasza usane hozzászólására (») Szept 16, 2020 /
 
(#) usane válasza vargham hozzászólására (») Szept 16, 2020 /
 
Szia!

Ismerem a lib.et, de a linkelt oldal is direkt értékadást használ.
Amit én szereetnék az legfeljebb valami pointeres trükkel lehetne megvalósítható, de mivel mint írtam különböző adatcsomagok jönnek, így azzal sem vagyok biztos.
Így legfeljebb azt tudom csinálni, hogy a deserializációban mindent változót megadok, csak azt még nem tudom a lib mit ad értéknek ha az adott kulcs nincs a csomagban. Ha hiány esetén semmit akkor nincs gond, de ha kinullázza azt a változót akkor az összes(rengeteg) kulcsra még egy feltételvizsgálatot is kell végeznem. És mivel a csomagokat websockettel szeretném küldözgetni, a sok feltételvizsgálat nem tudom mennyire lassítaná be a dolgot.
Mindenesetre most ezt igyekszem tesztelni.
(#) nemgyuri válasza usane hozzászólására (») Szept 16, 2020 /
 
Szia! Kb ez volt a problémám, hétvégén megpróbálom a mutatott megoldásoddal.
(#) sargarigo válasza usane hozzászólására (») Szept 16, 2020 /
 
ESP32 esetén szerintem érdemesebb Stringet használni ha van elég idő, a vas bírja. És akkor már sokkal könnyebb a dolog, nem kell pointerkedni. Később kipróbálom konkrétan is
(#) szili83 válasza mateatek hozzászólására (») Szept 17, 2020 /
 
Én is arra tudok gondolni. Mindegy egyenlőre potival kiváltom, és ha megjön amit linekltél, akkor próba.
(#) majkimester válasza usane hozzászólására (») Szept 17, 2020 / 1
 
Amit szeretnél azt modernebb nyelvekben (java, C#) reflection-nek hívják, ahol például egy osztály változóját csak az osztály referencia és a mező neve alapján is lehet olvasni/írni.
Natív C++-ban ilyen nincs, de vannak megkerülő megoldások, pl: Link
De a reflection drága, nem lesz gyorsabb mint az if else if.
(#) usane válasza majkimester hozzászólására (») Szept 17, 2020 /
 
Igen ezt keresem
Köszönöm, átnézem mit tudok vele kezdeni, és milyen sebességet produkálhat.
(#) vargham válasza usane hozzászólására (») Szept 17, 2020 /
 
Adatcsomagok feldolgozására if else vagy switch case. Ahogy fentebb a kolléga írta, más nyelveken van reflection. Javaban már én is implementáltam vele kommunikációs protokollt.
(#) sargarigo válasza usane hozzászólására (») Szept 17, 2020 /
 
Legalább a változók kötött sorrendben érkeznek? Van olyan hogy valami nem jön? Jó lenne picit többet tudni az adatcsomagod jellemzőiről, hátha meglátunk benne valami hasznosat.
Véleményem szerint a más nyelvek hasonló megoldásai is eléggé drágák, hiszen attól hogy nyelvi szinten támogatja, még végre kell hajtani a lépéseit..
A hozzászólás módosítva: Szept 17, 2020
(#) mateatek válasza KoblogPerGyok hozzászólására (») Szept 17, 2020 /
 
Köszönöm a linket. Sikerült elindítanom a timereket.
(#) asch válasza usane hozzászólására (») Szept 18, 2020 / 1
 
C-ben C++-ban futásidőben már nincsen meg a mezők neve információ, ezért nem lehet ilyet könnyen csinálni. Kicsit hasonló a serialization problémához: főleg kódgenerátorokkal lehet megoldani viszonylag szépen. A kódgenerátor valamilyen bemenet (pl egy táblázat) alapján forráskódot ad ki magából, amit aztán ugyanúgy kezelünk, mintha kézzel írt lenne, azaz betesszük a projektbe és fordítjuk, stb.

Például egy táblázat alapján egy template akár az általad írt C kódot is előállíthatja, amit aztán fordítasz, stb.

Eggyel hatékonyabb megoldás lehet, ha a táblázat alapján sorszám indexet adsz a mezőknek, és ezen sorszámok alaján konstansokat definiálsz C-ben (pl define-nal), és ezek alapján már lehet switch case-t használni (ami tipikusan ugrótáblára fog fordulni, ha az indexek 0-tól kezdve "tömören" kihagyás nélkül jönnek, így egészen hatékonyan fog működni). Ennek hátránya, hogy ha a protokollt frissíted az egyik oldalon, akkor törékenyebb lehet a visszafelé kompatibilitás. Másik hátránya, hogy a másik oldalra (Android) is generálni kell a kulcsszavakat (bár ez a másik esetben is szebb megoldás, mert ha generálunk konstansokat, és azokat használjuk, akkor nem lesz elírásból hiba).

Nyilván ilyen kódgenerátort csak akkor érdemes írni, ha valóban sok változóról van szó, különben felesleges erőfeszítés.
(#) KoblogPerGyok válasza usane hozzászólására (») Szept 18, 2020 /
 
Helló!

Miért nem tömbökkel oldod meg? Pl kétdimenziós string() tömbbel? Ha jön az adat, azaz a kulcs, akkor megkeresheted, hogy melyik tömbindexhez tartozik az adott kulcs. Na már ha van, akkor egy újabb változó, ami annak megfelelően veszi fel az értéket, és ezzel a segéddel hívod meg a függvényt.

Pl adatok[10][2]

adatok[1][1]="Az egyik változód neve"
adatok[2][2]=0 A kezdőértéke

adatok[2][1]="A másik változód neve"
adatok[2][2]=0 A kezdőértéke
.
.
.

Keresést meg kell oldani:

Ha úgy szeretnéd ahogy most van (Túl van bonyolítva szerintem..)
i=1;
do while tömbméret or adatok[i][1]="VEGE"
if adatok[i][1]==Myvar1 'Amit kaptál máshonnan

Myvar1=atoi(adatok[i][2]) 'Hogy szövegből egész legyen, de ezt a változód típusa adja meg
}
if adatok[i][1]==Myvar2 'Amit kaptál máshonnan

Myvar2=atoi(adatok[i][2]) 'Hogy szövegből egész legyen, de ezt a változód típusa adja meg
}
i++

De Lux verzió: Ha a küldő oldalon beteszel egy kis else-ágat, akkor azt is meg lehetne oldani, hogy a tömb még a használata előtt helyesen, minden értékel feltöltődjön. Vagy eleve 2X akkora tömböt használsz, mint amennyi lehetséges, az utolsó használt eleme meg pl legyen VEGE, és akkor addig mehet a keresés.
A hozzászólás módosítva: Szept 18, 2020
(#) sargarigo válasza KoblogPerGyok hozzászólására (») Szept 18, 2020 /
 
Én is így fogtam volna neki a dolognak, de a kérdező már az elején leszögezte, hogy nem így :
  1. if (érkezett kulcs == "xy") xy = érkezett érték;

Ezért kérdeztem hogy az adatfolyamról lehet-e valamit még tudni, folytonos-e, kötött-e a sorrendje, stb. De erre már nem kaptunk választ.
(#) vargham válasza KoblogPerGyok hozzászólására (») Szept 18, 2020 /
 
Erre létezik C++ konténer, a neve map.
C++ map
Így nem kell implementálni a keresést, beillesztést, stb. Ráadásul így a kulcs lehet string, az érték pedig szám.
A hozzászólás módosítva: Szept 18, 2020
(#) KoblogPerGyok válasza sargarigo hozzászólására (») Szept 18, 2020 /
 
OK!

Tényleg. Nem olvastam el "értőn" a kérdést. Bocs!
(#) KoblogPerGyok válasza vargham hozzászólására (») Szept 18, 2020 /
 
Ez jó nagyon!

Ha a kérdező nem is, de én használni fogom!
(#) sargarigo válasza KoblogPerGyok hozzászólására (») Szept 18, 2020 /
 
Már megérte!
(#) usane hozzászólása Szept 18, 2020 /
 
Üdv!

Elnézést a kései válaszért, most jutottam gép elé.
sargarigo: Az adatfolyamot én küldöm websocketen. Olyanná alakítom amilyenre akarom(amilyenre tudom bizonyos határok között). Többfajta adatfolyam fog érkezni, különböző időkben. Pl: ha megnyomom az 1-es gombot az APP-on akkor elküld valamit. Ha megnyomom a 2-es gombot akkor egészen más adatok érkeznek, 3-asra megint más. Folyamatban van a fejlesztés, mind az appon mind az ESP-n ezért még nem tudom pontosan mikor mit fogok küldeni, de ha összerakom akkor ismert lesz, hogy mi érkezik, tehát tudok rá feltételt szabni. Ezt akartam leegyszerűsíteni a reflection-al, hogy tök mindegy mi érkezik, kiveszem a változónevet is meg az értékét is az adatból, de ezt már elvetettem. Valami tömbszerű dolgon is gondolkodtam, de ez a Vargham által ajánlott map jónak tűnik.

Mindenkinek nagyon köszönöm az ötleteket.
A hozzászólás módosítva: Szept 18, 2020
(#) sargarigo válasza usane hozzászólására (») Szept 18, 2020 /
 
Akkor én a helyedben egyszerűen megindexelném az adó oldalon, és nem kell változónevet küldeni (tehát gyorsabb lesz). Tehát megy az index, utána az érték.
A fogadó oldalon meg venném az indexet, és a következő adatot már tenném is a tömb indexedik helyére.
Az indexeket pedig hogy ne kelljen fejben tartani melyik melyik, egyszerűen #define sorokkal adnám meg. Végeredmény, hogy egyetlen bájton átment a változóneved, egységesen tudsz kezelni mindent, és nincs benne if.
Natívan szinte nulla a költsége
(#) usane válasza sargarigo hozzászólására (») Szept 18, 2020 /
 
Akartam még folytatni, csak közben megzavartak, ezért gyorsan befejeztem a hozzászólást.
Egy adatfolyamban nem egy adat jön hanem több. Pl, most csináltam egy 6000byte (LED-ek adatai) plusz a websocket meg JSON 12kB. Ez az adatcsomag is fog még növekedni 1500 bájttal, plusz a járulékok. Az előző alapján ez még 3kB. Ezekkel elvileg már nincs bajom, tömbben megy, a lib tömbbe rakja, - hacsak nem akarom őket egyenként indexelni valamiért de isten ments, hogy ilyesmire vetemedjek. Aztán biztos, hogy fogok küldeni ehhez az adathalmazhoz kötődő 2-2 bájtot tömbelemenként, az 3000 bájt. Ezt még nem tudom hogy hozzácsapom-e vagy külön csomagot kap. Aztán még pár darab egyéb változó.
Támogatom az ötletedet a csomagazonosítóval kapcsolatban, ez van most napirenden. Így álltam hozzá most.
Megnézem mire tudom használni a Vargham által ajánllott map aztán valami majd csak kisül belőle.
A slusz poén, hogy ezeket az adatokat visszafelé is tudni kell küldenem úgy, hogy az app is tudja mi hová kerüljön.
Ez a terv.
(#) sargarigo válasza usane hozzászólására (») Szept 18, 2020 /
 
Ha jól értem, akkor van néhány mondjuk háromféle üzemmódod amik adatokat akarnak küldeni, de üzemmódon belül már ugyanúgy nem? Mert akkor elég ha az üzemmódot indexeled, aztán jöhetnek az adatok nyersen az üzemmódnak megfelelő tömbbe. Ebből már helyesen ki tudod venni ami és amennyi éppen kell. Nem lesz kavarodás. Mintha komplett rekordot küldenél el.
(#) usane válasza sargarigo hozzászólására (») Szept 18, 2020 /
 
Így van. Jól érted. Nem egészen üzemmód, de fogjuk rá, és ezekhez kötöttek a csomagok. Vagyis egy adott csomag minig ugyanaztokat a változókat tartalmazza.
Én is így gondolom, csomagazonosító alapján már remélem nem lesz bonyolult a helyrerakás.
(#) Lamprologus hozzászólása Szept 25, 2020 /
 
Hogyan lehet egyszerűen megoldani PC újra telepítésénél, hogy az Arduino IDE alá telepített könyvtárakat ne egyesével kelljen újra összevadászni.
Következő: »»   653 / 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