This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei_mirel.birtia [2025/05/19 23:29] andrei_mirel.birtia [Hardware Design] |
pm:prj2025:avaduva:andrei_mirel.birtia [2025/05/26 20:11] (current) andrei_mirel.birtia [Software Design] |
||
---|---|---|---|
Line 10: | Line 10: | ||
<note tip> | <note tip> | ||
- | +---------------+ +----------------+ | + | **Diagrama bloc** |
- | | Display | | LED status | | + | |
- | | OLED 0.96" | +--------+-------+ | + | {{:pm:prj2025:avaduva:diagrama_mirel.png?600|}} |
- | +-------+-------+ | | + | |
- | | v | + | |
- | v +-------+-------+ | + | |
- | +-------+-------+ | | | + | |
- | | |<------------+ ATmega328P | | + | |
- | | Senzor umid. | I2C/SPI | MCU | | + | |
- | | sol (ADC) | +---+---+---+---+ | + | |
- | +-------+-------+ | | | | + | |
- | | | | +---> PWM -> Servo + cremalieră | + | |
- | | | +-------> GPIO -> Pompa apă | + | |
- | | +----------> GPIO -> LED indicator | + | |
- | | | + | |
- | v | + | |
- | Rezervor apă | + | |
- | | + | |
ATmega328P preia măsurători ale umidității solului prin ADC, procesează valorile și le afișează pe ecranul LED. Când umiditatea scade sub prag, microcontroller-ul activează pompa pentru reumplerea seringii și apoi servo-motorul pentru administrarea precisă a apei pe un interval adaptat nevoilor plantei. | ATmega328P preia măsurători ale umidității solului prin ADC, procesează valorile și le afișează pe ecranul LED. Când umiditatea scade sub prag, microcontroller-ul activează pompa pentru reumplerea seringii și apoi servo-motorul pentru administrarea precisă a apei pe un interval adaptat nevoilor plantei. | ||
</note> | </note> | ||
Line 48: | Line 34: | ||
* Buzzer | * Buzzer | ||
**3.2 Tabela conexiuni piese** | **3.2 Tabela conexiuni piese** | ||
- | | **Componentă** | **Pin MCU (nume, nr.)** | **Funcție** | | + | | **Componentă** | **Pin MCU (nume, nr.)** | **Funcție** | |
- | | Senzor umiditate sol | PC0 (ADC0, pin 23) | ADC – măsurare umiditate sol | | + | | ----------------------------- | ------------------------------------- | --------------------------------------- | |
- | | LCD 16×2 I2C (MCP23017) | PC4 (SDA, pin 27)<>PC5 (SCL, pin 28) | I2C – comunicație display | | + | | **Senzor umiditate sol** | PC0 (ADC0, pin 23) | ADC – măsurare umiditate sol | |
- | | Servo-motor cu cremalieră | PB1 (OC1A PWM, pin 13) | PWM – poziționare cremalieră | | + | | **LCD 16×2 I2C (MCP23017)** | PC4 (SDA, pin 27) ↔ PC5 (SCL, pin 28) | I2C – afișare umiditate + stare sol | |
- | | Pompă de apă (via 2N2222) | PB2 (pin 14) | GPIO – ON/OFF pompă | | + | | **Servo-motor cu cremalieră** | PB1 (OC1A PWM, pin 13) | PWM – poziționare piston (buton manual) | |
- | | Tranzistor 2N2222 (driver pompă) | Bază ← PB2 (pin 14)<>Colector → pompă<>Emitter → GND | Driver pompa | | + | | **Pompă de apă (prin releu)** | PB2 (pin 14) | GPIO – comutare releu | |
- | | LED status | PB0 (pin 12) | GPIO – indicator vizual | | + | | **Releu pompa** | IN ← PB2 (pin 14), VCC 5V, GND | Activează pompa manual (cu buton) | |
- | | Buton Reset | PD2 (INT0, pin 32) | Digital input cu întrerupere | | + | | **LED roșu (sol uscat)** | PD5 (pin 9) | GPIO – aprins când solul e uscat | |
- | | Buzzer | PD6 (OC0A PWM, pin 10) | PWM/GPIO – semnal sonor | | + | | **LED galben (sol mediu)** | PD6 (pin 10) | GPIO – aprins când solul e moderat | |
+ | | **LED verde (sol umed)** | PD7 (pin 11) | GPIO – aprins când solul e umed | | ||
+ | | **Buton Servo – Înainte** | PD2 (INT0, pin 32) | Digital input cu pull-up | | ||
+ | | **Buton Servo – Înapoi** | PD3 (INT1, pin 1) | Digital input cu pull-up | | ||
+ | | **Buton Activare pompă** | PD4 (pin 2) | Digital input cu pull-up | | ||
**3.3 Schematic** | **3.3 Schematic** | ||
+ | |||
+ | {{:pm:prj2025:avaduva:schematic_pm.png?600|}} | ||
+ | |||
**3.4 Implementarea Hardware** | **3.4 Implementarea Hardware** | ||
+ | |||
+ | **3.5 Bill of Materials** | ||
</note> | </note> | ||
Line 65: | Line 61: | ||
<note tip> | <note tip> | ||
- | Arduino IDE | + | **Stadiul actual al implementarii software** |
+ | * Toate functionalitatile de baza au fost implementate si testate: | ||
+ | * Citirea umiditatii solului cu un senzor analogic | ||
+ | * Afișarea valorii umiditatii si a starii solului (umed, mediu, uscat) pe un ecran LCD I2C | ||
+ | * Aprinderea automata a unui LED corespunzator starii solului (rosu, galben sau verde) | ||
+ | * Controlul manual al unui servo prin doua butoane (impinge/trage pistonul) | ||
+ | * Activarea pompei de apa printr-un al treilea buton (pentru umplerea seringii) | ||
+ | * Pompa este controlata printr-un releu conectat la microcontroller | ||
+ | |||
+ | **Structura modulara (C++)** | ||
+ | |||
+ | Proiectul este implementat modular, folosind clase separate pentru fiecare componenta: | ||
+ | * SenzorUmiditate – gestioneaza citirea valorii de la senzorul de umiditate | ||
+ | * AfisajLCD – gestioneaza initializarea si afisarea pe LCD (valoare + stare sol) | ||
+ | * ControlServo – controleaza servo-motorul cu pozitii predefinite | ||
+ | * PompaApa – gestioneaza activarea pompei prin GPIO/releu | ||
+ | * LeduriStareSol – gestioneaza cele 3 LED-uri in functie de umiditate | ||
+ | |||
+ | **Motivatia alegerii bibliotecilor** | ||
+ | |||
+ | //LiquidCrystal_I2C// | ||
+ | * Justificare: Permite comunicarea cu LCD-ul prin doar 2 fire (SDA/SCL) în loc de 6+ fire | ||
+ | * Avantaj: Economisește pini digitali pentru alte componente | ||
+ | * Performanță: Protocol I2C stabil și rapid pentru actualizări frecvente | ||
+ | //Servo.h// | ||
+ | * Justificare: Biblioteca standard Arduino pentru controlul precis al servo-motorului | ||
+ | * Funcționalitate: Generează semnale PWM cu timing exact pentru poziționarea servo-ului | ||
+ | * Compatibilitate: Optimizată pentru ATmega328P | ||
+ | |||
+ | **Elementul de noutate al proiectului** | ||
+ | |||
+ | Sistemul permite controlul manual al unei irigari precise folosind o seringa actionata cu cremaliera. Proiectul combina logica manuala si indicatoare vizuale clare (LED-uri, LCD), fiind ideal pentru invatare si prototipare. | ||
+ | |||
+ | **Utilizarea functionalitatilor din laborator** | ||
+ | |||
+ | //ADC (Analog-to-Digital Converter)// | ||
+ | * Aplicație: Citirea senzorului de umiditate (pin A0) | ||
+ | * Implementare: analogRead() pentru conversia valorii analogice în digitală | ||
+ | * Rezoluție: 10-bit (0-1023) pentru precizie mare | ||
+ | //PWM (Pulse Width Modulation)// | ||
+ | * Aplicație: Controlul servo-motorului (pin 9) | ||
+ | * Implementare: Biblioteca Servo generează semnale PWM de 50Hz | ||
+ | * Funcție: Poziționarea precisă a pistonului seringii | ||
+ | //I2C (Inter-Integrated Circuit)// | ||
+ | * Aplicație: Comunicația cu LCD-ul (pini SDA/SCL) | ||
+ | * Avantaj: Comunicare serială cu doar 2 fire | ||
+ | * Eficiență: Libereazã pini pentru alte componente | ||
+ | //GPIO (General Purpose Input/Output)// | ||
+ | * Input: 3 butoane cu pull-up intern | ||
+ | * Output: Control pompă (releu) și 3 LED-uri indicator | ||
+ | * Debouncing: Implementat prin delay pentru stabilitate | ||
+ | |||
+ | **Scheletul proiectului si interactiunea functionalitatilor** | ||
+ | |||
+ | <code> | ||
+ | void loop() { | ||
+ | int umiditate = senzor.citeste(); | ||
+ | lcd.afiseazaUmiditate(umiditate); | ||
+ | lcd.afiseazaStare(umiditate); | ||
+ | leduri.actualizeaza(umiditate); | ||
+ | if (digitalRead(BUTON_INAINTE) == LOW) { | ||
+ | servo.impinge(); | ||
+ | } | ||
+ | if (digitalRead(BUTON_INAPOI) == LOW) { | ||
+ | servo.trage(); | ||
+ | } | ||
+ | if (digitalRead(BUTON_POMPA) == LOW) { | ||
+ | pompa.porneste(); | ||
+ | } else { | ||
+ | pompa.opreste(); | ||
+ | } | ||
+ | delay(100); | ||
+ | } | ||
+ | </code> | ||
+ | Fluxul de date: | ||
+ | * Senzor → ADC → Procesare → LCD + LED-uri | ||
+ | * Butoane → GPIO → Logică control → Servo/Pompă | ||
+ | * LCD ← I2C ← Microcontroller → PWM → Servo | ||
+ | |||
+ | **Calibrarea senzorului de umiditate** | ||
+ | * Sol uscat: Măsurare în sol complet uscat → valoare ~800-1000 | ||
+ | * Sol umed: Măsurare în sol saturat cu apă → valoare ~200-400 | ||
+ | * Sol moderat: Măsurare în sol normal → valoare ~400-600 | ||
+ | //Valoarea citita este afisata si determinata textual + vizual prin LED-uri.// | ||
+ | |||
+ | **Demo** | ||
+ | * Nu este implementat complet, lipseste mecanismul de impingere al apei cu ajutorul servomotorului si lipseste displayul | ||
+ | * Link: https://www.youtube.com/watch?v=82IfjY7yO0Q | ||
</note> | </note> | ||