LED - LCD

În cele ce urmează vom folosi pe lângă, mediul de dezvoltare Visual Studio Code, în care am instalat în prealabil extensia PlatformIO, necesare în vederea scrierii codului aferent platformei Sanguino (Atmega644P) vom folosi simulatorul Proteus al celor de la Labcenter Electronics.

Schema electrică realizată în Proteus este prezentată în imaginea de mai jos:

iar mediul de dezvoltare arată ca în imaginea de mai jos:

în cele ce urmează voi prezenta codul utilizat:

/*
Conectarea LCD la Sanguino
 * LCD RS la pinul digital pin 22
 * LCD Enable la pinul digital pin 23
 * LCD D4 la pinul digital pin 24
 * LCD D5 la pinul digital pin 25
 * LCD D6 la pinul digital pin 26
 * LCD D7 la pinul digital pin 28
 * LCD R/W la masa
LED-ul
* Catodul la pinul digital 13
* Anodul la +5V printr-o rezistenta de 1k  
*/
#include <Arduino.h>
#include <LiquidCrystal.h> // incarc libraria pentru afisorul LCD

 // constantele sunt variabile cu valoare fixa
const int ledPin =  13; // pinul unde este conectat LED-ul
const long interval = 500; // intervalul de timp in care se va aprinde ledul (in milliseconde)

// variabile a caror valoare se va modifica
int ledState = HIGH;  // ledState utilzat pentru a seta LED-ul ON sau OFF (HiGH => LED=OFF)
unsigned long previousMillis = 0; // variabila care va stoca timpul cand starea LED-ului a fost actualizata

// intializez libraria si asociez pinii Sanguino la LCD
const int rs = 22, en = 23, d4 = 24, d5 = 25, d6 = 26, d7 = 27;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// declar functiile utilizate
void blinkLed();// fuctia care aprinde un LED

void setup() { // aceasta functie va fi rulata o data

  lcd.begin(16, 2); // setez nr. de coloane si de linii ale LCD-ului
  lcd.print("salut, lume!"); // Afisez un mesaj la LCD
  pinMode(ledPin, OUTPUT); // setez pinul digital aferent ledPin ca iesire

}

void loop() { //acesta functie va fi rulata la infinit

  lcd.setCursor(0, 1); // setez cursorul la coloana 0, linia 1 (pe randul 2)
  lcd.print(millis()/1000);  // afisez nr. de secunde de la ultimul reset
  blinkLed(); // apelez functia ce aprinde LED-ul
}

void blinkLed() { // acesta functie va aprinde un led
// verifica daca e trecut timpul pentru a schimba satrea LED-ului (ON sau OFF)
// daca diferenta dintre timpul curent (currentMillis) si ultimul timp (previosMillis) salvat
// este mai mare decat timpul impus prin variabila (interval) 

  unsigned long currentMillis = millis(); // stochez in curentMillis timpul curent

  if (currentMillis - previousMillis >= interval) {  // verific daca s-a scurs intervalul de timp dorit
    // daca da, atunci,
    previousMillis = currentMillis; //salvez timpul current

    if (ledState == HIGH) {// daca LED-ul este OFF atunci schimb starea lui in ON si invers
      ledState = LOW;
    } else {
      ledState = HIGH;
    }

    digitalWrite(ledPin, ledState); // setez starea pinului cu variabila ledState stabilita anterior
  }
}

Librăriile folosite sunt:

Videoclipul cu simularea în cele ce urmează:

Întreg proiectul (codul sursă și fișierul pentru Proteus) poate fi descărcat de aici LCD_Blink_LED.zip