Scurtă Introducere în C++
C++ este un limbaj de programare foarte răspândit. Spre deosebire de alte limbaje de programare, este unul dintre puținele limbaje populare care este compilat. Asta înseamnă că pentru ca un program (i.e. o succesiune de instrucțiuni scrise folosind regulile limbajului) să poate fi rulat, trebuie convertit de o componentă numită compilator în limbaj specific mașinii pe care va rula. În cazul Arduino, acest procedeu este extrem de avantajos - asta deoarece programul compilat are o dimensiune suficient de mică pentru a încăpea în memoria Arduino și în același timp, fiind transcris în limbajul pe care mașina îl înțelege cel mai bine, programul va rula cu viteză maximă.
Principalul neajuns al limbajelor compilate - și în special al C++ - este că atunci când scriem un program în acest limbaj va trebui să gestionăm memoria noi înșine.
Totalitatea instrucțiunilor de bază disponibile pentru Arduino se găsesc aici. Acestea pot fi extinse în orice moment cu ajutorul bibliotecilor software - diferite funcții sau obiecte pe care alți programatori le-au scris și pe care le poți utiliza în programele tale fără să le rescrii.
Cel mai simplu!
Acest exemplu este cel mai simplu program valid pentru Arduino. Nu va face însă nimic:
void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
Ce sunt?
{ … }: În limbajul de programare C++, acoladele{și}sunt folosite pentru a delimita blocuri de cod, ceea ce înseamnă că toate instrucțiunile cuprinse între aceste acolade sunt considerate ca fiind parte a aceluiași bloc de cod. De exemplu, putem folosi acoladele pentru a delimita corpul unei funcții. În acest exemplu, acoladele sunt folosite pentru a delimita blocul de cod al funcțieisetup. Orice cod care urmează după acoladele de închidere a blocului de cod al funcției nu va mai fi considerat parte din această funcție. Acolo unde se găsesc acoladele, acestea pot fi folosite și pentru a marca începutul și sfârșitul unui bloc de cod condițional (de exemplu, un blocif-else), sau pentru a marca începutul și sfârșitul unui bloc de cod de tip buclă (de exemplu, un blocwhilesaufor).void setup() { … }: În limbajul de programare pentru plăcile Arduino, funcțiasetupeste o funcție specială care este apelată o singură dată atunci când Arduino este pornit sau resetat și este folosită pentru a configura placa Arduino. Această funcție este obligatorie în orice program pentru Arduino și trebuie să fie prezentă, chiar dacă nu este necesar să facă nimic în interiorul ei. În cadrul funcției voidsetup, programatorul poate configura pini digitali sau analogici, poate inițializa comunicarea cu alte dispozitive (de exemplu, un modul Bluetooth sau un senzor) poate inițializa biblioteci și obiecte.void loop() { … }: În limbajul de programare pentru plăcile Arduino, funcțiavoid loop()este o funcție specială care este apelată continuu pe durata funcționării programului pe placa Arduino. Această funcție este obligatorie în orice program pentru Arduino și este locul în care se scrie codul care va fi executat în mod repetat, la fiecare iterație a buclei principale a programului. În cadrul funcțieivoid loop(), programatorul poate scrie cod pentru a citi și procesa date de la senzori sau alte dispozitive, periodic, poate controla ieșirile digitale ale plăcii (cum ar fi LED-uri sau motoare), poate scrie date pe afișaje sau alte dispozitive de ieșire.
Să aprindem un LED!
Programul următor va aprinde și va stinge periodic un LED.
int ledPin = 4; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
Ce sunt?
;: În limbajul de programare C++,;este un simbol utilizat pentru a marca sfârșitul unei instrucțiuni. Fiecare instrucțiune în C++ trebuie să fie închisă cu un ;, altfel compilatorul va afișa o eroare de sintaxă. Fără utilizarea simbolului ;, compilatorul nu va ști unde se termină o instrucțiune și unde începe alta, ceea ce va duce la erori în procesul de compilare a programului.int ledPin = 4;: În limbajul de programare C++ pentru Arduino,int ledPin = 4;este o instrucțiune de declarație și inițializare a unei variabile de tip întreg, numităledPin, cu valoarea4. Această instrucțiune este utilizată pentru a defini un număr de pin pe placa Arduino care va fi utilizat pentru a controla un LED sau alt dispozitiv digital. În acest exemplu,inteste tipul de date al variabileiledPin, care reprezintă un număr întreg. VariabilaledPineste declarată și inițializată cu valoarea4. Această valoare reprezintă numărul pinului de pe placa Arduino la care este conectat un LED. După această instrucțiune, variabilaledPinpoate fi utilizată în program pentru a face referire la pinul specific al plăcii Arduino.pinMode(ledPin, OUTPUT);: În limbajul de programare pentru plăcile Arduino, instrucțiuneapinModeeste folosită pentru a configura modul de funcționare al unui pin de pe placa Arduino. Această instrucțiune specifică dacă un pin dat este utilizat ca intrare sau ieșire digitală. Sintaxa instrucțiuniipinModeeste următoarea:pinMode(pin, mode);undepinreprezintă numărul pinului pe care dorim să îl configurăm, iarmodereprezintă modul de funcționare pe care dorim să îl setăm pentru acel pin, care poate fiINPUT(intrare) sauOUTPUT(ieșire). În general, este important să configurăm corect modul de funcționare al pinilor pe placa Arduino, deoarece aceștia pot fi utilizați în diferite moduri pentru a comunica cu diferite dispozitive și senzori, pentru a controla motoare sau alte dispozitive de ieșire, sau pentru a citi date de la senzori sau alte surse de intrare.OUTPUT: În limbajul de programare pentru plăcile Arduino,OUTPUTeste denumirea unei constante ce reprezintă una dintre valorile posibile pentru modul de funcționare al unui pin digital, care indică în acest caz faptul că pinul respectiv va fi folosit ca ieșire digitală.LOW,HIGH: În limbajul de programare pentru plăcile Arduino,LOWșiHIGHsunt două constante care reprezintă valorile posibile pentru starea unui pin digital. ValoareaLOWindică faptul că pinul respectiv are o tensiune de ieșire de 0V, ceea ce poate fi utilizat pentru a controla dispozitive care necesită o tensiune de intrare de 0V. ValoareaHIGH, pe de altă parte, indică faptul că pinul respectiv are o tensiune de ieșire de 5V, ceea ce poate fi utilizat pentru a controla dispozitive care necesită o tensiune de intrare de 5V. Curentul maxim care poate trece prin circuitul care conține un pin Arduino este de 40mA.digitalWrite(ledPin, HIGH);: FuncțiadigitalWrite()este o funcție în limbajul de programare pentru plăcile Arduino, utilizată pentru a seta starea unui pin digital. Aceasta poate fi utilizată pentru a controla dispozitive care necesită un semnal digital, cum ar fi LED-uri, motoare sau alte componente electronice. Sintaxa funcției este următoarea:digitalWrite(pin, value);, undepineste numărul pinului digital pentru care se setează starea, iarvalueeste valoarea stării, care poate fiHIGHsauLOW.delay(1000);: Funcțiadelay()este o funcție în limbajul de programare pentru plăcile Arduino, utilizată pentru a aștepta un anumit interval de timp în milisecunde. Sintaxa funcției este următoareadelay(time);undetimeeste timpul de așteptare în milisecunde. De exemplu,delay(1000);va aștepta timp de 1 secundă. Această funcție poate fi utilă într-o varietate de scenarii, cum ar fi întârzierea unui anumit număr de milisecunde între două instrucțiuni consecutive sau crearea unui interval regulat de timp între două acțiuni, ca în cazul programului de mai sus.
Să culegem date!
Programul următor va trimite textul hello, world către calculatorul la care este conectat Arduino, o dată pe secundă, la nesfârșit:
void setup() { Serial.begin(9600); } void loop() { Serial.println("hello, world"); delay(1000); }
Ce sunt?
Serial: ObiectulSerialeste un obiect în cadrul limbajului de programare pentru plăcile Arduino, care permite comunicarea serială între placa Arduino și un alt dispozitiv, precum un calculator sau un alt microcontroler. Mai multe detalii aici: cum comunică Arduino?Serial.begin(9600);:“hello, world”: Textulhello, worldcuprins între ghilimele duble, drepte“reprezintă valoarea unui șir de caractere. Mai multe detalii aici: tipuri de date.Serial.println(“hello, world”):Serialeste un obiect definit în biblioteca standard a Arduino și este utilizat pentru comunicarea serială între placa Arduino și computer. Funcțiaprintln()este folosită pentru a trimite un mesaj împreună cu caracterul pentru o linie nouă către calculator, vizibil din Serial Monitor, iar în acest caz mesajul trimis este“hello, world”. În general,Serial.println()este utilizat frecvent în aplicațiile Arduino pentru a afișa date și informații utile în timpul procesului de dezvoltare și depanare.
Condiții
Programul de mai jos aprinde LED-ul conectat la pinul 4 al Arduino, dacă sunetul recepționat de microfonul conectat la pinul A0 este puternic:
int soundPin = A2; int ledPin = 4; void setup() { pinMode(ledPin, OUTPUT); pinMode(soundPin, INPUT); Serial.begin(9600); } void loop(){ int soundState = analogRead(soundPin); Serial.println(soundState); if (soundState > 400) { digitalWrite(ledPin, HIGH); delay(100); }else{ digitalWrite(ledPin, LOW); } }
Ce sunt?
int soundState = analogRead(soundPin);: Instrucțiunea este utilizată pentru a citi valoarea intrări analogicesoundPinși a o stoca într-o variabilă întreagă numităsoundState.analogRead(soundPin)este o funcție în biblioteca standard a Arduino care citește valoarea analogică de la pinul specificat (în acest caz,soundPin) și o convertește într-o valoare digitală între 0 (corespunzătoare 0V) și 1023 (corespunzătoare 5V). Această valoare digitală este apoi atribuită variabilei întregisoundState. În general, această instrucțiune este utilizată în aplicațiile Arduino care implică utilizarea senzorilor analogici, precum senzorii de lumină, de temperatură sau de sunet. Aceste senzori produc semnale analogice care trebuie citite și convertite într-o valoare digitală pentru a fi utilizate în programul Arduino.soundState > 400: ExpresiasoundState > 400în C++ este o expresie de tip boolean, care evaluează dacă valoarea stocată în variabilasoundStateeste mai mare decât 400. Dacă valoarea stocată însoundStateeste mai mare decât 400, expresia va returna valoareatrue(adevărat). În caz contrar, expresia va returna valoareafalse(fals). Această expresie poate fi utilizată în cadrul instrucțiunilor de decizie (condiționale), cum ar fi instrucțiuneaif, pentru a lua decizii bazate pe valoarea variabilei soundState.if (soundState > 400) { … }: Cu expresiaif (soundState > 400) { … }, instrucțiuneaifverifică dacă valoarea variabileisoundStateeste mai mare decât 400 și în cazul în care acest lucru se întâmplă, programul va executa instrucțiunile cuprinse între acolade{ … }.if (…) { … } else { … }: Instrucțiunile de decizieif-elsesunt utilizate în C++ pentru a permite programului să ia decizii în funcție de o condiție dată. Sintaxa generală a unei astfel de instrucțiuni este:if (conditie) { // blocul de cod care se va executa dacă condiția este adevărată } else { // blocul de cod care se va executa dacă condiția este falsă }
Unde
conditieeste o expresie care trebuie evaluată ca adevărată sau falsă. Dacă condiția este adevărată, atunci se va executa blocul de cod din primul set de acolade, iar dacă este falsă, atunci se va executa blocul de cod din al doilea set de acolade. Blocurile de cod pot conține una sau mai multe instrucțiuni. De exemplu, să presupunem că vrem să verificăm dacă un număr este par sau impar și să afișăm un mesaj corespunzător. Un exemplu de cod care folosește instrucțiuneaif-elsepentru a realiza acest lucru ar fi:int numar = 5; if (numar % 2 == 0) { Serial.println("Numarul este par."); } else { Serial.println("Numarul este impar."); }
În acest exemplu, variabila
numareste verificată pentru a vedea dacă numărul conținut este par sau impar. Dacă restul împărțirii numărului la 2 este 0 (operatorul de rest%), atunci numărul este par și se va afișa mesajulNumarul este par.. Dacă restul împărțirii nu este 0, atunci numărul este impar și se va afișa mesajulNumarul este impar..