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   790 / 845
(#) MATA válasza Ragathol hozzászólására (») Ápr 26, 2023 /
 
Oké köszönöm de hogyan fordította le hibával?
(#) Ragathol válasza MATA hozzászólására (») Ápr 26, 2023 / 1
 
Feltételeztem hogy olyan libeket használ, amikkel már dolgozott a multban, szóval végig néztem a korábbi projekteket az oldalon és össze szedtem ami kellet ehez a projekthez.
Tessék az egész egy csomagban.
(#) MATA válasza Ragathol hozzászólására (») Ápr 26, 2023 /
 
Hálás köszönetem a segítségért most már csont nélkül lefordította!
(#) Ragathol válasza MATA hozzászólására (») Ápr 27, 2023 /
 
Nincs mit.
(#) SzilCsong válasza KoblogPerGyok hozzászólására (») Ápr 27, 2023 /
 
Még mielőtt nagyon belemerülnék az adatok mentésébe, úgy néz ki, hogy dinamikus memóriagondok is lesznek.

Mivel sd-ről olvasni nagyon hosszadalmas lenne, ezért memóriába kellene tartani az összes kártyakódot.
Ha most felveszek egy
  1. byte tomb[400][4];

(a 400 a kártyák száma dimenzió, a 4, a 4db byte kártya egyedi azonosító)
ha ezt így feltöltöm, már 91%-nál tartok a dinamikus memóriából, az UNO-nál.
(#) KoblogPerGyok válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Eleve nem lehet jó, mert byte. Azaz 400-különböző kártyaszám nem lehetséges. 1byte 256, azaz 144 egyforma lesz.
Miért hoszadalmas az SD olvasás? A leglassabb eszköz maga az Arduino.
A hozzászólás módosítva: Ápr 27, 2023
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Ápr 27, 2023 /
 
https://forum.arduino.cc/t/maximum-speed-that-the-arduino-can-read-...5905/7

Ha elolvastad volna az előre gyártott megoldásomat, ami kiküszöböl sok problémát, és az SD kártyát sem teszi tönkre, akkor 1 megyitás és 10 keresés, majd bezárás, olyan 10*20 +2*11ms körül lenne. Ami 250ms. De ekkor 1024 előregyártott adatból keresne, illetve mivel a linken 10 sor, de sok adat van, a 2 ms több, mint ami neked kellett volna. De maradhatsz a memóriáknál is, beégetheted EEP-romba is, és csak keresel benne. De nekem mindegy. Leírtam mindent amit akartam, nem figyeltél rá.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Ápr 27, 2023 /
 
Sőt. 11ms a megyitás, olvaás, bezárás. Értelmes keresssel kb épp ennyi lenne.
(#) Skori válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Talán nem pont uno/nano-t kellene hsználni, hanem valami kicsivel nagyobb memóriával rendelkezőt. Pl. ESP8266-hoz még SD kártya sem kellene (de lehet, ha mindenképpen szeretnéd), bőven elég nagy a flash, és a memória is sokkal több, meg se kottyanna egy ekkora tömb.
(#) SzilCsong válasza KoblogPerGyok hozzászólására (») Ápr 27, 2023 /
 
De ki fogom próbálni a te módszeredet is, mihelyst eljutok odáig, hogy felfogjam, előtte már belekezdtem egy módszerbe és tényleg baromi lassú a feltöltés, de ez lehet a program hibája miatt.
Ugye elnézed nekem, hogy nem vagyok penge az arduinoba és lehet, neked ami egyszerűnek tűnik, másnak nem biztos, hogy az.
(#) SzilCsong válasza Skori hozzászólására (») Ápr 27, 2023 /
 
Az a gond az ESP-vel, hogy nincs elég I/O rajta, van ugyan NodeMcu-m, de baromi lassú rátölteni
(#) Skori válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Esetleg BluePill? Az is egy "atomrakéta" egy nano-hoz képest. Sok I/O is van, és néhány tized másodperc rátölteni egy programot.
A hozzászólás módosítva: Ápr 27, 2023
(#) SzilCsong hozzászólása Ápr 27, 2023 /
 
Van 4db számom, pl : 126,177,123,123 ezt milyen függvénnyel tudom összerakni, hogy ez legyen:
126177123123 ?
//Bocsi, a konyhanyelvért,
(#) Skori válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Használhatod egyben is 32 bites számként... Pl. csak rámutatsz egy pointerrel...
A hozzászólás módosítva: Ápr 27, 2023
(#) SzilCsong válasza Skori hozzászólására (») Ápr 27, 2023 /
 
Ezt most nem értem
Van egy 4-es for ciklus
kiolvassa a kártya azonosítóját bájtonként és ez kéne valahogy összerakni egy számmá
A hozzászólás módosítva: Ápr 27, 2023
(#) KoblogPerGyok válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
mutasd meg mivel írsz az sd-re és mond el mennyi ideig ír.
(#) Skori válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Tedd be ezt a ciklust ide, hogy lássuk miről van szó!

Amúgy meg kb. így:
uint8_t azonosito[4];
uint32_t* azonosítoszam;

azonositoszam = (uint32_t*)azonosito; // tömb címének másolása

x = *azonositoszam; //így hivatkozhatunk rá vagy másolhatjuk 32 bites egész számként, pl. az x változóba, vagy bárhova

Kiírni pedig hexa-ban lenne érdemes, mert akkor a sima karakterek összefűzése is ugyanúgy korrekt eredményt ad, mint a matek.
A hozzászólás módosítva: Ápr 27, 2023
(#) lalca válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Huh, de bonyolítjátok.
Nyilván kell egy idő, ds3231.
Minden nap pl. éjfélkor létrehoz egy date.csv-t, pl. ma 0427.csv .
Fejléc:
myFile = SD.open("0427.csv", FILE_WRITE);
myFile.println("Time",";","ID");
myFile.close();

Adatokhoz beírja az időt pl. 083240 (8 óra 32 perc 40 másodperc) majd a kártyát.
myFile = SD.open("0427.csv", FILE_WRITE);
myFile.println(time,";",char1,char2,char3,char4);
myFile.close();

Nem konkrét program, csak a logikája.
(#) SzilCsong válasza KoblogPerGyok hozzászólására (») Ápr 27, 2023 /
 
  1. for (int j= 0; j< 40; j++)
  2.   {
  3.     Serial.print(j) ; Serial.print( " :  ");  
  4.     for (byte i= 0; i< 4; i++)
  5.       {
  6.       testTable.writeCell(j, 0,tomb[j][i]);                        // itt sajna csak az utolsó bytot mneti a kártyára
  7.       Serial.print(tomb[j][i] < 0x10 ? " 0" : " ");                // ez azért kell, hogy ne egybe, hanem tagoltan írja ki az azonosító számot
  8.       Serial.print(tomb[j][i]);                                    //HEX-be írja ki
  9.       }
  10.       Serial.println();
  11.   }
  12.  Serial.println("-------------read all table content at once ----------------------");
  13.  testTable.printTable(); //print entire table content to serial monitor
(#) pipi válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Könvertálod string-gé, és összefűzöd
(#) lalca válasza lalca hozzászólására (») Ápr 27, 2023 /
 
Mégse.
A hozzászólás módosítva: Ápr 27, 2023
(#) SzilCsong válasza pipi hozzászólására (») Ápr 27, 2023 /
 


Köszi, erre gondoltam előtte is, de nem tartottam túl elegánsnak, de ha nincs más.....
  1. Serial.println("-------------read all table content cell by cell ----------------------");
  2.  
  3. for (int j= 0; j< 40; j++)
  4.   {
  5.     String number;
  6.      Serial.print(j) ; Serial.print( " :  ");  
  7.     for (byte i= 0; i< 4; i++)
  8.       {
  9.       number = number + String(tomb[j][i]);  
  10.                                                                     // testTable.writeCell(j, 0,tomb[j][i]);                        // itt sajna csak az utolsó bytot mneti a kártyára
  11.       Serial.print(tomb[j][i] < 0x10 ? " 0" : " ");                // ez azért kell, hogy ne egybe, hanem tagoltan írja ki az azonosító számot
  12.       Serial.print(tomb[j][i]);                                    //HEX-be írja ki
  13.       }
  14.       testTable.writeCell(j, 0,number);
  15.       number= "";
  16.       Serial.println();
  17.   }
  18.  Serial.println("-------------read all table content at once ----------------------");
  19.  testTable.printTable(); //print entire table content to serial monitor
(#) lalca válasza lalca hozzászólására (») Ápr 27, 2023 /
 
myFile = SD.open("0427.csv", FILE_WRITE);
myFile.print(time);
myFile.print(";");
myFile.print(byte1);
myFile.print(byte2);
myFile.print(byte3);
myFile.print(byte4);
myFile.print('\n');
myFile.close();

A ; jelzi az excelnek új oszlop, a '\n' új sor.
A byte-ok pedig egybefűzve jelennek meg, default decimális kódolással.
(#) SzilCsong válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Tehát a
  1. testTable.writeCell(j, 0,number);

ilyenkor ír az SD-re és jelentős időt igényel, itt ez esetbe csak 40 db kártyát szimuláltam és majd 10 másodperc volt, 100db esetén le se fut a program, valamiért annyitól már kifekszik.
Ez nem lesz jó ide.
(#) lalca válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
De nem egyszerre olvasol 40 kártyát.
Amit írtam kis probléma, ha byte<10 v. 100.

if(byte<10) myFile.print('0');
if(byte<100) myFile.print('0');
myFile.print(byte);

Vagy mindegy?
A hozzászólás módosítva: Ápr 27, 2023
(#) pipi válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Használhatsz string-et
https://linuxhint.com/integer-to-string-arduino/

  1. int a = 1234;    /*Initialize a string with value 1234*/
  2. int b = 567;    /*Initialize a string with value 1234*/
  3.  
  4. String myStr;    /*New string is defined*/
  5.  
  6. myStr = String(a)+String(b);   /*Convert Int to String*/
  7. Serial.print("Integer Converted to String: ");
  8. Serial.println(myStr);

Nem teszteltem, csak firkantottam...
Persze a mezei hagyományos tömbös megoldás lehet gyorsabb, takarékosabb
(#) SzilCsong válasza pipi hozzászólására (») Ápr 27, 2023 /
 
Ezt megoldottam saját magához adtam hozzá, spórolás van ...
(#) SzilCsong válasza lalca hozzászólására (») Ápr 27, 2023 /
 
Ezzel mindig a végére fog írni?
(#) lalca válasza SzilCsong hozzászólására (») Ápr 27, 2023 /
 
Igen.
Ezt átnézheted Bővebben: Link .
A hozzászólás módosítva: Ápr 27, 2023
(#) meone hozzászólása Ápr 28, 2023 /
 
Sziasztok!

Adott egy Setup alkotó részek:
-Arduino uno
-Egy RFM96 (LoRa) – Rádió-shield (868MHz)
-GPS modul (NEO-6MV2)
-DHT22 T, RH szenor és egy
-csapadékmérő aminek reed reléje van
Találtam egy programkódot aminek egy részét értem, és ki is egészítettem már.
Maga a mért adatok továbbítása LoRaWAN hálózaton történik.
A kapcsolat meg van, de még nem teljes a kód amit át akarok küldeni.

Van olyan valaki itt aki elmagyarázná, hogy a kód hogyan tevődik össze, mivel egy részét értem, és addig nem tudok hozzányúlni, mert nem tudom hogy tevődik össze.
A szituáció a következő.
A program beolvassa a GPS illetve a szenzorok adatait.
Ez után összepakolja egy tömbbe majd elküldi paylodon, LoRán keresztül a GW-nek majd az továbbítja a szervernek ahol feldolgozódik.
Amit nem értek, hogy a program az egyes mért értékeket megfelelő byte részekbe teszi sorosan egymás után illetve tesz hozzá elhatárolást.
A kód egy része így néz ki.
  1. uint8_t mydata[17] ={0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE, 0xF, 0x10};
  2.  
  3. static osjob_t initjob;
  4. bool newGPSdata = false;

A mydata[17] egy 17 elemű tömb amibe érkeznek a mért adatok.
Valaki elmagyarázná, hogy a számsor mit takar, illetve az utolsó 3 érték.
Csak egy pár példa, hogy ha bővíteni akarom értsem, hogy mit kell bele tenni.

Maga a program eseményvezérelt.
Hasonló mint ez a kód: ttn-otaa-pro-mini-sensors.ino.

GPS megszólítása értékek kinyerése:
  1. void get_coords () {
  2.   bool newData = false;
  3.   unsigned long chars;
  4.   unsigned short sentences, failed;
  5.   //float flat,flon,faltitudeGPS,fhdopGPS,humidity,temperature;
  6. // For one second we parse GPS data and report some key values
  7.    for (unsigned long start = millis(); millis() - start < 1000;) {
  8.     while (gpsSerial.available()) {
  9.       char c = gpsSerial.read();
  10.       Serial.write(c); // uncomment this line if you want to see the GPS data flowing
  11.       if (gps.encode(c)) { // Did a new valid sentence come in?
  12.         newGPSdata = true;
  13.       }
  14.     }
  15.   }
  16. }

Majd itt dolgozódik fel a teljes adatmenyiség, itt kerülnek a tömbbe az adatok.
  1. void do_send(osjob_t* j) {
  2.   // Check if there is not a current TX/RX job running
  3.   if (LMIC.opmode & OP_TXRXPEND) {
  4.     Serial.println(F("OP_TXRXPEND, not sending"));
  5.   } else {
  6.       float temperature, humidity, fhdopGPS, lat, lon, alt, date,time;
  7.       int16_t int16_temperature, int16_humidity, int16_hdopGPS, int16_hvopGPS,int16_alt;
  8.       int32_t int32_lat, int32_lon;
  9.       unsigned long age;
  10.       byte sat=0;
  11.  
  12.       temperature = dht.readTemperature();
  13.       humidity = dht.readHumidity();
  14.       int16_temperature = round(100.0 * temperature);
  15.       int16_humidity = round(100.0 * humidity);
  16.       mydata[0] = (byte) (int16_temperature >> 8);
  17.       mydata[1] = (byte) (int16_temperature & 0x00FF);
  18.       mydata[2] = (byte) (int16_humidity >> 8);
  19.       mydata[3] = (byte) (int16_humidity & 0x00FF);
  20.      
  21.       if (newGPSdata) {
  22.                 lat=gps.location.lat();
  23.                 lon=gps.location.lng();
  24.                 int32_lat = round(1000000.0*(lat+90.0));
  25.                 int32_lon = round(1000000.0*(lon+180.0));
  26.                 alt = gps.altitude.meters();
  27.                 int16_alt = round(alt);
  28.                 sat = gps.satellites.value();
  29.                 date = gps.date.value();
  30.                 time = gps.time.value();
  31.                 int16_hdopGPS = gps.hdop.value();
  32.                 int16_hvopGPS = gps.hdop.value();
  33.                 mydata[4] = (byte) (int32_lat >> 24);
  34.                 mydata[5] = (byte) ((int32_lat >> 16) & 0x00FF);
  35.                 mydata[6] = (byte) ((int32_lat >> 8) & 0x0000FF);
  36.                 mydata[7] = (byte) (int32_lat & 0x000000FF);
  37.                 mydata[8] = (byte) (int32_lon >> 24);
  38.                 mydata[9] = (byte) ((int32_lon >> 16) & 0x00FF);
  39.                 mydata[10] = (byte) ((int32_lon >> 8) & 0x0000FF);
  40.                 mydata[11] = (byte) (int32_lon & 0x000000FF);
  41.                 mydata[12] = (byte) (int16_alt >> 8);
  42.                 mydata[13] = (byte) (int16_alt & 0x00FF);
  43.                 mydata[14] = sat;
  44.  
  45.                 //mydata[15] =;
  46.                 //mydata[16] =;
  47.             } else {
  48.                 mydata[14] = 0;
  49.             }
  50.       get_coords();
  51.    
  52.       LMIC_setTxData2(1, (uint8_t*) mydata, sizeof(mydata), 0);
  53.      Serial.println(F("Packet queued"));
  54.   }
  55.   // Next TX is scheduled after TX_COMPLETE event.
  56. }


Az egyes változók definícióját és típusát is értem, azt is értem, hogy hogyan kerülnek bele az egyes adatokat változókba.
Viszont erről teljesen nagy a homály:
Idézet:

mydata[4] = (byte) (int32_lat >> 24);
mydata[5] = (byte) ((int32_lat >> 16) & 0x00FF);
mydata[6] = (byte) ((int32_lat >> 8) & 0x0000FF);

illetve ezt sem értem:
Idézet:

mydata[12] = (byte) (int16_alt >> 8);
mydata[13] = (byte) (int16_alt & 0x00FF);
mydata[14] = sat;

Hogyan tevődik össze akkor az adatom, mert nem tudom elképzelni.
Valaki valami gyakorlati példával el tudja mondani?
Azt értem, hogy mondjuk a "sat" a tömb 14.-eleme.
De konkrétan ezt nem értem: (int16_alt >> 8) illetve (int16_alt & 0x00FF).
Hogyan egészítsem ki ha mondjuk újabb 16-os vagy 32-es váltózóm van?

Elnézést a specifikus kérdésért, de remélem jó helyre írtam a hozzászólásomat.

Köszönöm előre is a segítséget.
Következő: »»   790 / 845
Bejelentkezés

Belépés

Hirdetés
XDT.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