Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:fstancu:dbolontoc [2023/05/25 23:48]
daniel.bolontoc [Software Design]
pm:prj2023:fstancu:dbolontoc [2023/05/28 09:28] (current)
daniel.bolontoc [Descriere generală]
Line 78: Line 78:
  
  ===== Software Design =====  ===== Software Design =====
-   ** Mediu de dezvoltare: Arduino IDE ** + 
-   +[[https://​github.com/​DanielDXB/​SmartDeskSys|Source Code - GitHub]] 
-  * biblioteci folosite+ 
 +** Mediu de dezvoltare: Arduino IDE ** 
 + 
 +  * Aceste linii de cod includ librăriile necesare pentru a utiliza funcțiile pentru afișajul LCD I2C, senzorul DHT, comunicația prin I2C și modulul de ceas RTC (Real-Time Clock):
  
   #include <​LiquidCrystal_I2C.h>​   #include <​LiquidCrystal_I2C.h>​
Line 86: Line 89:
   #include <​Wire.h>​   #include <​Wire.h>​
   #include <​virtuabotixRTC.h>​   #include <​virtuabotixRTC.h>​
 +
 +  * Aici se realizează inițializarea obiectelor pentru comunicarea cu afișajul LCD, senzorul DHT și modulul RTC. Parametrii 0x27, 16 și 2 pentru obiectul lcd indică adresa I2C a afișajului LCD, numărul de coloane și numărul de linii al afișajului. Parametrii 11 și DHT11 pentru obiectul dht indică pinul digital la care este conectat senzorul DHT și tipul acestuia (DHT11). Parametrii 6, 7 și 8 pentru obiectul myRTC indică pinii digitali la care este conectat modulul RTC:
 +
 +  LiquidCrystal_I2C lcd(0x27, 16, 2);
 +  DHT dht(11, DHT11);
 +  virtuabotixRTC myRTC(6, 7, 8);
 +
 +  * Aici este definit un nou simbol personalizat pentru afișajul LCD. Este un simbol de grad utilizat pentru a afișa temperatura în grade Celsius:
 +
 +  byte degree_symbol[8] = {
 +    0b00111,
 +    0b00101,
 +    0b00111,
 +    0b00000,
 +    0b00000,
 +    0b00000,
 +    0b00000,
 +    0b00000
 +  };
 +
 +  * Aceste linii de cod declară și inițializează variabilele pentru pini și modul de afișare. buttonPin și buttonPin2 indică pinii digitali la care sunt conectate butoanele. displayMode este o variabilă care stochează modul curent de afișare (0 pentru temperatură,​ 1 pentru umiditate și 2 pentru timp):
 +
 +  const int buttonPin = 2;
 +  const int buttonPin2 = 3;
 +  int displayMode = 0;
 +
 +  * Aceste linii de cod declară și inițializează variabilele pentru starea butoanelor și debounce (evitarea fluctuațiilor induse de zgomot). buttonState și lastButtonState memorează starea actuală și ultima starea a butonului principal. buttonState2 și lastButtonState2 memorează starea actuală și ultima starea a butonului secundar. lastDebounceTime este folosit pentru a memora momentul ultimei modificări a stării butonului.
 +
 +  int buttonState = HIGH;
 +  int lastButtonState = HIGH;
 +  int buttonState2 = HIGH;
 +  int lastButtonState2 = HIGH;
 +  unsigned long lastDebounceTime = 0;
 +
 +  * Aceasta este funcția setup() care se execută o singură dată la pornirea sistemului. În această funcție, se inițializează afișajul LCD, se activează iluminarea de fundal, se creează simbolul personalizat de grad, se setează cursorul afișajului la poziția (0, 0) și se afișează un mesaj de început. De asemenea, se configurează pinii butoanelor ca intrări cu rezistențe pull-up interne și se inițializează senzorul DHT:
 +
 +  void setup() {
 +    lcd.init();
 +    lcd.backlight();​
 +    lcd.createChar(1,​ degree_symbol);​
 +    lcd.setCursor(0,​ 0);
 +    lcd.print("​ Smart Desk Sys");
 +  ​
 +    pinMode(buttonPin,​ INPUT_PULLUP);​
 +    pinMode(buttonPin2,​ INPUT_PULLUP);​
 +  ​
 +    dht.begin();​
 +  }
 +
 +  * Aceasta este funcția loop() care rulează într-o buclă continuă. În această buclă, se citesc stările butoanelor și se compară cu stările anterioare pentru a detecta apăsările butoanelor. În funcție de starea butoanelor, se modifică modul de afișare.
 +
 +Dacă starea butonului principal (buttonPin) se modifică, se actualizează buttonState și, dacă noul starea este LOW (butonul a fost apăsat), displayMode este incrementat cu 1 folosind operatorul modulo 3 pentru a trece la următorul mod de afișare (temperatură,​ umiditate, timp).
 +
 +Dacă starea butonului secundar (buttonPin2) se modifică, se actualizează buttonState2 și, dacă noul starea este LOW (butonul a fost apăsat), displayMode este incrementat cu 2 și apoi este aplicat operatorul modulo 3 pentru a trece la modul de afișare anterior (rotație în direcție inversă).
 +
 +În funcție de valoarea displayMode,​ se afișează informațiile corespunzătoare pe afișajul LCD. Dacă displayMode este 0, se citește temperatura cu ajutorul senzorului DHT și se afișează pe afișaj împreună cu simbolul personalizat de grad. Dacă displayMode este 1, se citește umiditatea și se afișează pe afișaj. Dacă displayMode este 2, se actualizează timpul folosind modulul RTC și se afișează pe afișaj.
 +
 +La sfârșitul buclei, se actualizează lastButtonState pentru a memora starea butonului principal pentru următoarea iterație a buclei:
 +
 +  void loop() {
 +    int reading = digitalRead(buttonPin);​
 +    int reading2 = digitalRead(buttonPin2);​
 +  ​
 +    if (reading != buttonState) {
 +      buttonState = reading;
 +      if (buttonState == LOW) {
 +        displayMode = (displayMode + 1) % 3;  // Toggle display mode between temperature,​ humidity, and time
 +      }
 +    }
 +  ​
 +    if (reading2 != buttonState2) {
 +      buttonState2 = reading2;
 +      if (buttonState2 == LOW) {
 +        displayMode = (displayMode +2) % 3;  // Toggle display mode in the opposite direction
 +      }
 +    }
 +  ​
 +    if (displayMode == 0) {
 +      float temperature = dht.readTemperature();​
 +      lcd.setCursor(0,​ 1);
 +      lcd.print("​Temp:​ ");
 +      lcd.print(temperature);​
 +      lcd.write(1);​
 +      lcd.print("​C"​);​
 +      lcd.print(" ​   ");
 +    } else if (displayMode == 1) {
 +      float humidity = dht.readHumidity();​
 +      lcd.setCursor(0,​ 1);
 +      lcd.print("​Humidity:​ ");
 +      lcd.print(humidity);​
 +      lcd.print("​%"​);​
 +    } else if (displayMode == 2) {
 +      myRTC.updateTime();​
 +      lcd.setCursor(0,​ 1);
 +      lcd.print("​Time:​ ");
 +      if (myRTC.hours < 10) {
 +        lcd.print("​0"​);​
 +      }
 +      lcd.print(myRTC.hours);​
 +      lcd.print(":"​);​
 +      if (myRTC.minutes < 10) {
 +        lcd.print("​0"​);​
 +      }
 +      lcd.print(myRTC.minutes);​
 +      lcd.print(":"​);​
 +      if (myRTC.seconds < 10) {
 +        lcd.print("​0"​);​
 +      }
 +      lcd.print(myRTC.seconds);​
 +      lcd.print(" ​  "​);​
 +    } 
 +    lastButtonState = reading;
 +  }
 +  ​
 +===== Concluzii =====
 +
 +  * Efectiv schema fizica e plina de fire.
 +  * Display-ul LCD trebuie setat manual cu "​surubelnita"​ de grosime nanometrica.
 +  * Codul in Arduino desi are sens si probabil functioneaza intr-o simulare pe calculator, cand il incarci pe placuta sufletul...
 +<​note>​
 +**Sunt AS pe lipit componente cu pistolul!** ​
 +</​note>​
 +  ​
 +Download:
 +
 +<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
pm/prj2023/fstancu/dbolontoc.1685047723.txt.gz · Last modified: 2023/05/25 23:48 by daniel.bolontoc
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0