Skip to content

OneWire si DallasTemperature incluse in biblioteca ATmega-CLib

August 6, 2012

Am finalizat portarea celor doua biblioteci Arduino. Singura bataie de cap mai serioasa a fost trecerea de la specificarea pinului magistralei prin parametrii virtuali, specific Arduino (pin 1, 2, 3, etc.), la parametrii fizici (PB1, DDRB, PINB, etc.). Setarile respective (desemnarea pinului la care este atasata magistrala OneWire) se specifica de catre utilizator in header-ul bibliotecii. Totul merge foarte bine si exemplele furnizate de autorul original pot fi reproduse in C fara probleme. Insa am cate ceva de spus despre fiecare biblioteca:

OneWire: Este scrisa excelent si este proiectata sa deserveasca si alte tipuri de senzori, in afara celor de temperatura. Nu cred ca este nevoie sa se intervina asupra codului.

DallasTemperature: Este scrisa de o persoana cu experienta in automatizari, care probabil s-a confruntat de multe ori cu necesitatea de a reinoii echipamente vechi la care nu se mai stia numarul de senzori de temperatura, tipul si ID-ul lor, tipul de alimentare a magistralei (parazitic sau nu), etc. Practic, ai toate mecanismele pentru investigare magistrala, dar si pentru exploatarea propriuzisa, dupa ce investigarea s-a terminat si senzorii au fost identificati. Din acest punct de vedere, biblioteca este excelenta. Are totusi o multime de neajunsuri:

  • Fiind scrisa in C++, codul este ineficient si redundant – consumul de memorie este mare, chiar daca este tradusa in C, conceptul ramane;
  • Variabila ScratchPad este privata, nepermitand accesul direct pentru prelucrarea eficienta a datelor;
  • Pentru conversii in Celsius si Fahrenheit foloseste calcule in virgula mobila – e ok,dar nu si pentru device-uri cu memorie mai mica. Din cauza asta esti fortat sa folosesti functii de conversie care risipesc resurse.

La nivel de hobby, dar si atunci cand abordezi cazuri concrete si decizi tipul de alimentare a magistralei, si numarul de senzori, se poate lucra dupa urmatorul algoritm:

  • Construiesti o mica magistrala cu un singur soclu, pentru senzor unic (sau, ma rog, poate sa fie oricat de mare si cu oricate socluri, atat timp cat ai inserat un singur senzor pe magistrala);
  • Inserezi fiecare senzor pe rand si citesti ID-ul cu care etichetezi apoi senzorul (o mica eticheta de hartie, agatata de pinii senzorului)

In felul acesta scap de codul de cautare, am datele fiecarui senzor in parte si pot sa le stabilesc cate un alias, in functie de zona in care este plasat. Apoi, codul este cat se poate de eficient, fara chestii „abstracte”. Faptul ca traim in Romania si lucram cu Celsius este si mai bine – conversia este mai usoara, folosind numere intregi. Problema este, cum fac? Si codul original este util, nu stii niciodata cand ai nevoie de el… dar banuiesc ca atunci se poate rezolva rapid folosind limbajul Arduino si dupa identificarea senzorilor, se poate trece la scrierea de cod mai eficient.

P.S.: La o comparare a scketch-ului original Arduino, „Simple”, cu un program echivalent scris in C, obtii:

  • scketch-ul Simple = 6272 bytes (arduino-0023)
  • program echivalent in C = 1601 bytes (avr-gcc 4.7.1) – probabil ca in Atmel Studio 6 se obtine o dimensiune si mai mica a codulu.
Lasă un comentariu

Va rog, nu folositi limbaj de messenger. Multumesc!

Completează mai jos detaliile despre tine sau dă clic pe un icon pentru autentificare:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s

%d blogeri au apreciat asta: