This shows you the differences between two versions of the page.
info2:laboratoare:04 [2019/03/26 15:09] george.stoica0310 [Exerciții] |
info2:laboratoare:04 [2021/03/23 09:19] (current) alexandru.vochescu [II. Ecran interactiv desenabil] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 04 - Citire de pe pini ===== | + | ===== Laboratorul 04 - Aplicații ===== |
===== Scop ===== | ===== Scop ===== | ||
- | * familiarizarea cu citirea datelor de la senzori | + | * aprofundarea cunoștințelor parcurse în primele 3 cursuri și laboratoare |
- | * familiarizarea cu butoane | + | |
- | * măsurarea voltajului de intrare pe pini | + | |
- | ===== Cuvinte cheie ===== | ||
- | * pinMode, digitalRead, analogRead, INPUT | ||
- | * buton, senzor, pullup, pulldown | ||
- | ===== Utilizarea serialei ===== | + | ===== I. Casă inteligentă ===== |
- | Pentru a afișa datele citite de pe pini de la senzori ne dorim să utilizăm Seriala de pe Arduino. Seriala este un utilitar similar cu **cout** din C++ | + | |
- | ====== Mod utilizare Seriala ====== | + | În cadrul acestui proiect vom simula funcționalitatea unei case inteligente. Facilitățile principale pe care ni le dorim sunt: |
- | **Funcții:** | + | * Iluminare inteligentă: în funcție de nivelul de luminozitate se vor aprinde treptat linii de led-uri (Lumină puternică -> toate led-urile stinse, Întuneric -> toate led-urile aprinse) |
- | * Serial.print(cuvânt) - Afișează cuvânt fără spațiul | + | * Muzică ambientală: setați 3 intervale de nivel de luminozitate în cadrul cărora se va reda câte o melodie o singură dată. Melodiile trebuie să fie create de voi din note (puteți alege orice melodie pe care să o generați). |
- | * Serial.println(cuvânt) - Printează cuvânt iar următorul print se va face pe linia următoare | + | * Iluminare controlată sonor: pentru fiecare bătaie din palme (sau zgomot puternic) se va aprinde o linie de led-uri. |
- | <code arduino.c> | + | * Afișarea parametrilor ambientali: la apăsări repetate pe logo, se vor afișa pe ecranul din led-uri valorile parametrilor ambientali (temperatură, luminozitate, nivelul de zgomot), dar și celelalte valori de la senzori: accelerație și busolă. |
- | void setup() | + | * În caz de cutremur (la scuturarea plăcii), se va reda o sirenă de poliție. |
- | { | + | * Grafic de variație a temperaturii: afișați în consolă folosind print valoarea temperaturii o dată pe secundă. |
- | Serial.begin(9600); // Setăm frecvența pentru Serial Monitor | + | * Afișaj aleator: La începutul programului, creați manual un vector din minim 10 Icon-uri preferate (precum HEART). În bucla principală de rulare a programului, verificați regulat cât timp a trecut de la pornirea plăcii (running_time din Input). La fiecare multiplu de 5 secunde de cand a pornit execuția codului pe placa, afișați un Icon aleator din vectorul creat. |
- | Serial.println("Am început programul"); | + | |
- | } | + | |
- | void loop() | + | ====== II. Ecran interactiv desenabil ====== |
- | { | + | |
- | Serial.print("Salut"); // Printează Salut la infinit111 | + | |
- | } | + | |
- | </code> | + | |
- | La rularea codului de mai sus, în Serial Monitor se va afișa Salut la infinit fără spații între cuvinte: "SalutSalutSalutSalutSalutSalut" | + | În cadrul acestui proiect vom crea o tablă pe care putem desena folosind puncte. În momentul în care apăsăm logo-ul (senzorul de atingere), se va genera un led aprins în colțul de stânga jos. Folosind butonul A, putem “mișca” led-ul aprins în sus pe coloana pe care acesta se află în acest moment. Folosind butonul B, putem “mișca” led-ul la dreapta pe linia pe care acesta se află acum. Odată ce am ajuns pe poziția pe care vrem să lăsăm led-ul aprins, apăsăm încă o dată logo-ul. Pentru a genera un nou “led aprins”, se va apăsa încă o dată logo-ul. |
- | <code arduino.c> | + | Cerințe adiționale: |
- | int buton = 2; | + | * Coloanele și liniile sunt considerate circulare: odată ce am ajuns la capăt de coloană/linie, led-ul va reveni la începutul coloanei/liniei |
- | void setup() | + | * **Nu** putem avea două led-uri aprinse pe aceeași poziție; când mut un led aprins peste un led deja aprins, acesta “va sări” la prima poziție liberă în direcția de mișcare |
- | { | + | |
- | Serial.begin(9600); // Setăm frecvența pentru Serial Monitor | + | |
- | Serial.println("Am început programul"); | + | |
- | pinMode(buton, INPUT); | + | |
- | } | + | |
- | int buttonState = 0; | + | |
- | void loop() | + | |
- | { | + | |
- | buttonState = digitalRead(buton); | + | |
- | Serial.print("Starea butonului este: "); // Mesaj ce precedează valoarea | + | |
- | Serial.println(buttonState); | + | |
- | } | + | |
- | + | Cerințe avansate: | |
- | </code> | + | * Dacă în momentul generării punctului, se află deja un punct în colțul din stânga jos al ecranului, acesta se va genera pe prima poziție liberă de pe prima linie. Dacă linia este ocupată complet, se va trece la linia următoare. |
- | + | * Stingerea unui led: Dacă pe poziția pe care am “mutat” un led se află deja un led aprins, acesta se va aprinde și stinge repetat (o dată la 100 ms). Utilizatorul va avea la dispoziție două acțiuni: | |
- | Outputul codului de mai sus va vi: | + | - Fie apasă logo-ul, iar led-ul se va stinge. |
- | + | - Fie apasă unul din cele doua butoane (A sau B), iar led-ul se va mișca pe poziția noua. Astfel led-ul “suprapus anterior” va rămâne aprins. | |
- | Am început programul | + | |
- | + | ||
- | Starea butonului este 0 | + | |
- | + | ||
- | Starea butonului este 0 | + | |
- | + | ||
- | Starea butonului este 0 | + | |
- | + | ||
- | //Am apăsat pe buton// | + | |
- | + | ||
- | Starea butonului este 1 | + | |
- | + | ||
- | Starea butonului este 1 | + | |
- | + | ||
- | Starea butonului este 1 | + | |
- | + | ||
- | ===== Folosirea unui buton ===== | + | |
- | Veți avea nevoie de: | + | |
- | * Un Arduino Uno | + | |
- | * Un button | + | |
- | * O rezistență de 1k ohmi | + | |
- | + | ||
- | Modul de folosire a butonului: | + | |
- | {{:info2:laboratoare:arduino_button.png?400|200}} | + | |
- | + | ||
- | În situația de mai sus, pinul 4 trebuie setat pe INPUT | + | |
- | iar citirea datelor de la buton se face folosind ** int date = digitalRead(4) ** | + | |
- | + | ||
- | ===== analogRead vs digitalRead ===== | + | |
- | + | ||
- | * digitalRead funcționează pe toți pinii, rezultatele sale sunt fie **HIGH** fie **LOW**. | + | |
- | * analogRead returnează valori între 0 - 1023, iar analogRead poate fi folosit doar pe pinii **analogici**: A0 - A5. Exemplu: pinMode(A0, INPUT) | + | |
- | + | ||
- | ===== Senzor de lumina ===== | + | |
- | Mod de utilizare: | + | |
- | {{:info2:laboratoare:photoresistor_arduino.png?400|200}} | + | |
- | + | ||
- | Senzorul de lumină este un rezistor cu rezistența variabilă în funcție de lumină. | + | |
- | + | ||
- | Citirea datelor pe cazul de mai sus: | + | |
- | * Setăm pinul A0 pe INPUT | + | |
- | * folosim o variabilă light_sensor să citim datele folosind **analogRead** | + | |
- | + | ||
- | ===== Exerciții ===== | + | |
- | - Folosiți interfața seriala pentru a afișa la infinit un mesaj de tipul: "Salut, numele meu este X și am Y ani". Mesajul trebuie să fie afișat unul pe linie, iar X și Y trebuie să fie variabile în cod (Nu folosiți direct valorile voastre). | + | |
- | - Realizați un circuit cu un buton și un led. Când butonul este apăsat, ledul trebuie să se aprindă. Inițial, legați rezistența spre GND, similar cu imaginea de mai sus, ulterior, legați butonul să vină spre GND. Observați diferența. | + | |
- | - Realizați un circuit cu un senzor de lumină și afișați datele citite de acesta pe interfața serială. **BONUS** Când lumina scade sub un anumit nivel, aprindeți un LED. | + |