====== 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) 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 [[hu:arduino:ref_list|referencia-oldalon]] található. ===== dtostrf() ===== {{anchor:dtostrf}} [[hu:arduino:variables#float|float]] / [[hu:arduino:variables#double|double]] konvertálása [[hu:arduino:variables#char_array|karakter-lánc]]cá, 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 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() ===== {{anchor:dtostre}} [[hu:arduino:variables#float|float]] / [[hu:arduino:variables#double|double]] konvertálása [[hu:arduino:variables#char_array|karakter-lánc]]cá, 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() ===== {{anchor:atoi}} [[hu:arduino:variables#char_array|Karakter-lánc]] konvertálása [[hu:arduino:variables#int|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 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() ===== {{anchor:itoa}} [[hu:arduino:variables#int|int]] konvertálása [[hu:arduino:variables#char_array|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() ===== {{anchor:atof}} [[hu:arduino:variables#char_array|Karakter-lánc]] konvertálása [[hu:arduino:variables#float|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|atoi]] ===== atol() ===== {{anchor:atol}} [[hu:arduino:variables#char_array|Karakter-lánc]] konvertálása [[hu:arduino:variables#long|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|atoi]] ===== strtod() ===== {{anchor:strtod}} [[hu:arduino:variables#char_array|Karakter-lánc]] konvertálása [[hu:arduino:variables#double|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() ===== {{anchor:qsort}} [[hu:arduino:variables#array|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); }