Oldalforrás megtekintése Korábbi változatok Hivatkozások Exportálás PDF-be Share on ... Google+ Twitter LinkedIn Facebook Pinterest Telegram Tartalomjegyzék avr_libc standard könyvtár dtostrf() Szintaktika Példa dtostre() Szintaktika atoi() Szintaktika Példa itoa() Szintaktika Példa atof() Szintaktika atol() Szintaktika strtod() Szintaktika qsort() Szintaktika Példa avr_libc standard könyvtár Az avr_libc egy, az Arduino telepítésével együtt installált könyvtár, ami egy egyszerű lib felhívással (#include<stdlib.h>) elérhető. A legtöbb funkciója az Arduino standard hívásokon keresztül is elérhető, de van néhány hasznos, ott meg nem található funkciója is. Ennek a könyvtárnak nem feladata az összes AVR funkció közlése, csak néhány általam érdekesnek és hasznosnak tartott funkciót ismertetek itt. Leírása itt található: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g6c140bdd3b9bd740a1490137317caa44 Az oldalon is szereplő funkciók összefoglalása a referencia-oldalon található. dtostrf() float / double konvertálása karakter-lánccá, normál formátumban: "[-]d.ddd". Szintaktika dtostrf (value, width, prec, out) value (float, double): bemeneti érték width (signed char): egész helyiérték pozíciók száma prec (unsigned char): törtrész pozíciók száma out (char*): kimenet - A törtrészt, ha annak a megjelenítési helye kisebb, mint a számé, kerekíti. - Az egészrész kezdeti üres pozícióit szóközzel tölti fel. - Negatív with érték az eredményt balra igazítja, egyébként az igazítás jobbra történik A funkció különösen előnyös I2C kommunikáció esetén; a mérésadatok továbbításához (lásd a lenti példát). Példa #include <Wire.h> char t[10]; //empty array where to put the numbers going to the master volatile int Val; // variable used by the master to sent data to the slave void setup() { Wire.begin(8); // Slave id #8 Wire.onRequest(requestEvent); // function to run when asking for data Wire.onReceive(receiveEvent); // what to do when receiving data Serial.begin(9600); // serial for displaying data on your screen } void loop() { int aRead = analogRead(A0); //plug a potentiometer or a resistor to pin A0, so you can see data being transfer float x = aRead/1024.0*5.0; //generate a float number, with this method you can use any time of data pretty much dtostrf(x, 3, 2, t); //convers the float or integer to a string. (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, empty array); Serial.println(Val); // print the character delay(500); } // function: what to do when asked for data void requestEvent() { Wire.write(t); } // what to do when receiving data from master void receiveEvent(int howMany) {Val = Wire.read();} dtostre() float / double konvertálása karakter-lánccá, kitevős formátumban: "[-]d.ddde±dd". Szintaktika dtostre (value, out, prec, flag) value (float, double): bemeneti érték out (char*): kimenet prec (unsigned char): törtrész pozíciók száma flag (unsigned char): egész helyiérték pozíciók száma Ez a funkció nekem nem működött. atoi() Karakter-lánc konvertálása int-té. Szintaktika (int) = atoi (char*) char*: bemeneti karakterlánc A funkció visszatérési típusa: int. - A karakterlánc egész-részét konvertálja (a tizedespont előtt) - Nem ügyel a túlcsordulásra Példa #include<stdlib.h> char buff1[]="12345.67"; int i; void setup() { Serial.begin(9600); } void loop() { i = atoi(buff1); Serial.print(" :"); Serial.println(i); delay(100000); } A monitor tartalma: :12345 itoa() int konvertálása Karakter-lánc-cá. Szintaktika itoa(val, char*, radix) val (int/long): bemeneti int / long char*: kimeneti karakterlánc radix: szükséges buffer mérete, 2..36 Példa char buf[12]; // "-2147483648\0" lcd.printIn(itoa(random(1024)-512, buf, 10)); atof() Karakter-lánc konvertálása float-tá. Szintaktika (float) = atof (char*) char*: bemeneti karakterlánc A funkció visszatérési típusa: float - A karakterlánc tartalmát konvertálja (a tizedesértékekkel együtt) - Nem ügyel a túlcsordulásra Példaként lásd: atoi atol() Karakter-lánc konvertálása long-gá. Szintaktika (long) = atol (char*) char*: bemeneti karakterlánc A funkció visszatérési típusa: long - Nem ügyel a túlcsordulásra Példaként lásd: atoi strtod() Karakter-lánc konvertálása double-é. Szintaktika (long) = double strtod(const char *str, char **endptr) str*: bemeneti karakterlánc endptr: pointer, ami a konvertált karakterlánc utáni részre mutat A funkció visszatérési típusa: double. - Érvénytelen művelet esetén 0.0-val tér vissza. Példa: // példaprogram: OB121, http://www.ob121.com/doku.php?id=hu:arduino:reference char str[30] = "20.30300 This is test"; char *ptr; double ret; void setup() { Serial.begin(9600); } void loop() { ret = strtod(str, &ptr); Serial.println(ret); delay(10000); } qsort() Tömb tartalmának a sorbarendezése. Szintaktika void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) A qsort egy felhívandó eljárás az alábbi paraméterekkel: base: az első elemre mutató pointer nitems: a tömbelemek száma size: egy elem mérete (byte-ban) a tömbben compar: ez a funkció hasonlítja össze a tömbelemeket Az eljárásnak nincs visszatérési értéke. Példa // OB121.com példaprogram - Vámos Sándor (2019) // Tömb sorbarendezés alkalmazása az Arduino-n int values[] = { 88, 56, 100, 2, 25 }; int cmpfunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } void setup() { Serial.begin(9600); } void loop() { int n; Serial.println("before sorting:"); for( n = 0 ; n < 5; n++ ) { Serial.println(values[n]); } qsort(values, 5, sizeof(int), cmpfunc); Serial.println("after sorting:"); for( n = 0 ; n < 5; n++ ) { Serial.println(values[n]); } delay(100000); }