Pentru a pune o pauza in rularea codului executat de catre Arduino pana acum foloseam functia delay(). Dar aceasta functie nu este recomandata a fi folosita decat in cazurile in care testam codul. In locul acestei functii vom folosi functia millis() sau chiar micros().

De ce nu trebuie sa folosim functia delay()? Deoarece aceasta functie "spune" procesorului sa faca o pauza de x milisecunde (cate declaram ca parametru) iar acest lucru nu este de dorit. Nu am vrea ca procesorul sa faca o pauza ci ca el sa ruleze continuu.

Pentru acest lucru vom folosi functia millis(). Codul sursa este usor de folosit si voi exemplifica mai jos cum se face.

int perioada = 1000;
unsigned long timpAcum = 0;
int i = 0;

void setup() {
 Serial.begin(9600);
 Serial.println("Testare functie millis() in locul functiei delay()");
 Serial.println();
}

void loop() {
 while (millis() > timpAcum + perioada) {
    timpAcum = millis();
    Serial.print("Secunda curenta: ");
    Serial.println(i);
    i++;
  }
  //aici putem pune orice alt cod dorim sa-l rulam
}

Plecand de la acest cod vom face un numarator cu afisare pe un display LCD. In cazul de fata voi folosi un display LCD 2004 cu interfata I2C pentru a folosi cat mai putine conexiuni la Arduino.

Codul modificat este urmatorul:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3E, 20, 4);
int perioada = 1000;
unsigned long timpAcum = 0;
int i =0;

void setup() {
  lcd.begin(); 
  lcd.setCursor ( 0, 0 ); 
  lcd.print (" www.");  
  lcd.setCursor (0, 1 ); 
  lcd.print ("electronicstore");
  lcd.setCursor (0, 2 );
  lcd.print ("            .ro");
  lcd.setCursor (0, 3 );
  lcd.print ("****************");
  delay (2000); 
  lcd.clear(); 
}

void loop() {
  while (millis() > timpAcum + perioada) {
    timpAcum = millis();
    i++;
  }
  lcd.setCursor(0, 0);
  lcd.print("Numarator cu millis");
  lcd.setCursor(0, 1);
  lcd.print("Valoare: ");
  lcd.print(i);
}

Nu suntem limitati la a folosi doar un singur timp pentru o rula o bucata de cod cu intarziere, putem folosi chiar mai multi timpi.

In exemplul de mai jos vom afisa pe display atat un numarator la fiecare secunda cat si diferite alte mesaje pe ultimul rand setate la 6 secunde.  Mesajele sunt in numar de 4 si vor fi afisate in mod repetitiv.

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3E, 20, 4);
int perioada = 1000;
int perioada2 = 6000;
unsigned long timpAcum, timpAcum2 = 0;
int x, y = 0;
const char* mesaj[] = {"mesajul 1", "mesajul 2", "mesajul 3", "mesajul 4", "mesajul 5"};

void setup() {
  lcd.begin(); 
  lcd.setCursor ( 0, 0 ); 
  lcd.print (" www.");  
  lcd.setCursor (0, 1 ); 
  lcd.print ("electronicstore");
  lcd.setCursor (0, 2 );
  lcd.print ("            .ro");
  lcd.setCursor (0, 3 );
  lcd.print ("****************");
  delay (2000); 
  lcd.clear();
  timpAcum = timpAcum2 = millis();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("Numarator cu millis");
  
  while (millis() > timpAcum + perioada) {
    timpAcum = millis();
    lcd.setCursor(0, 1);
    lcd.print("Valoare: ");
    lcd.print(x);
    x++;
  }

  while (millis() > timpAcum2 + perioada2) {
    timpAcum2 = millis();
    lcd.setCursor(0, 3);
    lcd.print(mesaj[y]);
    y++;
    if (y == 4) { y = 0; }
  }
}

 

  

 

Nu sunt comentarii

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