In aceasta parte vom folosi functii personalizate in codul sursa. Aceste functii ne ajuta facand codul sursa mai ordonat, mai usor de citit si de modificat.

Iar ca exemplu vom porni de la clasicul sketch blink, cel care aprinde si stinge un led la intervale predefinite.

Codul sursa de la care vom porni modificarile este cel de mai jos:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);                      
  digitalWrite(LED_BUILTIN, LOW);  
  delay(1000);                  
}

Pentru inceput vom crea functia noastra personalizata, functie care va aprinde si stinge acest led aceasta este scrisa astfel:

int led = 13;
int durata;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  bistabil(led, 1000);
}

void bistabil(int led, int durata) {
  digitalWrite(led, HIGH);
  delay(durata);
  digitalWrite(led, LOW);
  delay(durata);
}

Dupa cum observam functia personalizata se numeste void bistabil() si aceasta are 2 parametri pentru o functionare corecta.

Functia incepe cu void. Acest void este un tip de date (precum int, char etc) care spune functiei ca aceasta nu va returna nimic. 

Cei 2 parametri sunt urmatorii:

-led este numarul pinului la care este conectat ledul nostru;

-durata semnifica intarzierea pe care o dorim exprimata in milisecunde.

Dupa cum se observa aceasta functie este apelata in bucla loop() foarte simplu cu ajutorul comenzii:

bistabil(led, 1000);

  In acest moment aceasta functie pare inutila, dar, daca dorim sa facem codul mult mai complex, atunci aceasta functie ne va ajuta. Cum o va face va voi arata in urmatorul exemplu:

int led = 13;
int durata;

void setup() {
   pinMode(led, OUTPUT);
}

void loop() {
   bistabil(led, 1000);
   bistabil(led, 300);
   bistabil(led, 3200);
   bistabil(led, 800);
   bistabil(led, 1600); 
}

void bistabil(int led, int durata) {
  digitalWrite(led, HIGH);
  delay(durata);
  digitalWrite(led, LOW);
  delay(durata);
}

In exemplul de mai sus executam 5 cicluri de aprindere si stingere a ledului, toate cele 5 cicluri avand timpi diferiti. Daca nu foloseam o functie atunci codul sursa ar fi aratat cu mult mai stufos si mai greu de modificat.

Daca dorim sa aducem imbunatatiri functiei atunci mai putem adauga diferiti parametri precum in exemplul de mai jos:

int led = 13;
int durata1, durata2;

void setup() {
   pinMode(led, OUTPUT);
}

void loop() {
   bistabil(led, 1000, 500);
}

void bistabil(int led, int durata1, int durata2) {
  digitalWrite(led, HIGH);
  delay(durata1);
  digitalWrite(led, LOW);
  delay(durata2);
}

Putem observa ca aceasta functie modificata permite ca ledul sa poata fi aprins pe o durata diferita de cea in care este stins.

Putem de asemenea sa cream o functie care returneaza anumite date. Pentru acest lucru vom crea o functie care va aduna pur si simplu 2 numere si va returna suma lor.  In urmatorul exemplu vedem cum se poate face acest lucru:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("rezultatul este: ");
  Serial.println(calculeaza(10, 2));
  delay(1000);                 
}

int calculeaza(int x, int y) {
  int z = x + y;
  return z;
}

 Pentru ca o functie sa returneze o valoare va trebui ca aceasta sa inceapa cu int, precum in exemplul nostru. In caz contrar va genera o eroare la compilare si programul nu va functiona.

Putem de asemenea sa preluam rezultatul functiei si sa o returnam acesteia pentru un nou calcul. Pentru a face acest lucru vom folosi urmatorul cod sursa:

int z = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (z == 0) { z = calculeaza(10, 2); } else { z = calculeaza(10, z); }
  Serial.print("rezultatul este: ");
  Serial.println(z);
  delay(1000);                 
}

int calculeaza(int x, int y) {
  int z = x + y;
  return z;
}

Mai sus observam ca initial vom declara variabilei z valoarea 0. 

Apoi in bucla loop() prima instructiune este de tipul if ...else. Aceasta instructiune verifica daca variabila z are valoare 0 ceea ce inseamna ca este la prima executare a instructiunii si va fi executata comanda calculeaza(10, 2) din bucla if. Incepand cu a 2-a rulare a buclei loop() variabila z are o valoare diferita de 0 ceea ce va duce la rularea codului calculeaza(10, z) din bucla else.

 

 

Nu sunt comentarii

Acest website foloseste cookie-uri pentru o experienta placuta in timpul navigarii.