This shows you the differences between two versions of the page.
|
pm:prj2025:ccristi:alex.moldoveanu0510 [2025/05/27 00:11] alex.moldoveanu0510 [Hardware Design] |
pm:prj2025:ccristi:alex.moldoveanu0510 [2025/05/30 09:10] (current) alex.moldoveanu0510 [Software Design] |
||
|---|---|---|---|
| Line 29: | Line 29: | ||
| Pentru flexibilitate si usurinta in demonstratie, toate functiile pot fi declansate si manual, la comanda, indiferent de momentul din zi. | Pentru flexibilitate si usurinta in demonstratie, toate functiile pot fi declansate si manual, la comanda, indiferent de momentul din zi. | ||
| - | {{:pm:prj2024:ccontasel:merge.png |}} | + | {{:pm:prj2025:ccristi:poza2.png?300|}} |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Listă de componente: | Listă de componente: | ||
| + | |||
| + | • Arduino Uno | ||
| + | • Water Pump | ||
| + | • Light Sensor | ||
| + | • Speaker | ||
| + | • Clock Module | ||
| + | • Breadboard | ||
| + | • Cables | ||
| + | • LEDs | ||
| + | |||
| + | Mai jos se regaseste desgnul orientativ in Tinkerpad: | ||
| + | |||
| + | {{:pm:prj2025:ccristi:poza.png|}} | ||
| + | |||
| + | Mai jos se ragaseste o poza hardware a proiectului: | ||
| + | |||
| + | {{:pm:prj2025:ccristi:poza3.png?300|}} | ||
| + | |||
| + | De asemenea si un video demonstrativ: | ||
| + | |||
| + | https://youtu.be/8lZL-eniPDA | ||
| + | |||
| + | ===== Software Design ===== | ||
| + | |||
| + | |||
| + | Design-ul software va fi realizat in Arduino IDE. | ||
| + | |||
| + | Am utilizat SoftwareSerial si DFRobotDFPlayerMini drept biblioteci. | ||
| + | |||
| + | <code> | ||
| + | |||
| + | #include "Arduino.h" | ||
| + | #include "SoftwareSerial.h" | ||
| + | #include "DFRobotDFPlayerMini.h" | ||
| + | #include "LiquidCrystal_I2C.h" | ||
| + | |||
| + | // LCD pe adresa 0x27, cu 16 coloane si 2 randuri | ||
| + | |||
| + | LiquidCrystal_I2C lcd(0x27, 16, 2); | ||
| + | |||
| + | SoftwareSerial mySoftwareSerial(10, 11); // RX, TX | ||
| + | DFRobotDFPlayerMini myDFPlayer; | ||
| + | |||
| + | void printDetail(uint8_t type, int value); | ||
| + | |||
| + | int play_in_progress=0; // if = 1 then player is working | ||
| + | |||
| + | const int buttonPin = 2; | ||
| + | const int buttonPin2 = 7; | ||
| + | const int relayPin = 2; | ||
| + | int buttonState = 0; | ||
| + | |||
| + | // Intervalul de intrare | ||
| + | const int inputMin = 1; | ||
| + | const int inputMax = 1021; | ||
| + | |||
| + | // Intervalul de ieșire | ||
| + | const int outputMin = 1; | ||
| + | const int outputMax = 30; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | mySoftwareSerial.begin(9600); | ||
| + | Serial.begin(115200); | ||
| + | pinMode(buttonPin, INPUT); | ||
| + | pinMode(buttonPin2, INPUT); | ||
| + | pinMode(relayPin, OUTPUT); | ||
| + | digitalWrite(relayPin, HIGH); | ||
| + | | ||
| + | lcd.begin(); | ||
| + | lcd.backlight(); | ||
| + | lcd.clear(); | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("Sistem activ"); | ||
| + | |||
| + | myDFPlayer.begin(mySoftwareSerial); | ||
| + | } | ||
| + | |||
| + | void music_switch() { | ||
| + | if(play_in_progress == 0) { | ||
| + | myDFPlayer.play(1); //Play the first mp3 | ||
| + | play_in_progress = 1; | ||
| + | } | ||
| + | else { | ||
| + | myDFPlayer.pause(); //stops the music | ||
| + | play_in_progress = 0; // no longer playing | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void manual_watering() { | ||
| + | |||
| + | digitalWrite(relayPin, LOW); | ||
| + | while (buttonState == HIGH) { | ||
| + | buttonState = digitalRead(buttonPin2); | ||
| + | } | ||
| + | |||
| + | digitalWrite(relayPin, HIGH); | ||
| + | |||
| + | lcd.begin(); | ||
| + | lcd.backlight(); | ||
| + | lcd.clear(); | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("Sistem activ"); | ||
| + | | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | int soundVolume = ((analogRead(A1) - inputMin) * (outputMax - outputMin + 1) / (inputMax - inputMin + 1)) + outputMin; | ||
| + | myDFPlayer.volume(soundVolume); | ||
| + | |||
| + | int waterSensor = analogRead(A2); | ||
| + | int lightSensor = analogRead(A0); | ||
| + | |||
| + | Serial.print(F("Valoare senzor de lumina: ")); | ||
| + | Serial.println(lightSensor); | ||
| + | Serial.print(F("Valoare senzor de umiditate: ")); | ||
| + | Serial.println(waterSensor); | ||
| + | |||
| + | if (waterSensor < 100 && lightSensor < 50) { | ||
| + | digitalWrite(relayPin, LOW); | ||
| + | |||
| + | lcd.clear(); | ||
| + | lcd.setCursor(0, 0); | ||
| + | lcd.print("Udare automata"); | ||
| + | |||
| + | delay(2000); | ||
| + | digitalWrite(relayPin, HIGH); | ||
| + | } | ||
| + | |||
| + | buttonState = digitalRead(buttonPin); | ||
| + | if (buttonState == HIGH) { | ||
| + | music_switch(); | ||
| + | } | ||
| + | delay(100); | ||
| + | |||
| + | buttonState = digitalRead(buttonPin2); | ||
| + | if (buttonState == HIGH) { | ||
| + | manual_watering(); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | <code> | ||
| + | setup() – initializeaza comunicarea seriala, seteaza pinii si porneste modulul audio DFPlayer. | ||
| + | |||
| + | music_switch() – comuta intre redarea si oprirea muzicii in functie de starea curenta. | ||
| + | |||
| + | manual_watering() – activeaza pompa atata timp cat butonul de udare manuala este apasat. | ||
| + | |||
| + | loop() – ruleaza continuu, citeste senzorii, ajusteaza volumul, face udarea automata si gestioneaza actiunile butoanelor. | ||
| + | </code> | ||
| + | ===== Rezultate Obţinute ===== | ||
| <note tip> | <note tip> | ||
| - | * ** Arduino Uno | + | Care au fost rezultatele obţinute în urma realizării proiectului vostru. |
| - | * ** Water Pump | + | |
| - | * ** Light Sensor | + | |
| - | * ** Speaker | + | |
| - | * ** Clock Module | + | |
| - | * ** Breadboard | + | |
| - | * ** Cables | + | |
| - | * ** LEDs | + | |
| </note> | </note> | ||
| + | |||
| + | Irigarea s-a realizat automat in functie de umiditatea solului, un senzor analogic declansand pornirea unei pompe de apa printr-un releu, la sesizarea lipsei de lumina data de la fotorezistenta. | ||
| + | |||
| + | Dupa udare, utilizatorul a fost notificat sonor printr-o melodie redata de un buzzer (+ vizual pe LCD). | ||
| + | |||
| + | Sistemul a functionat stabil, fara blocaje, cu afisari corecte si control fiabil al releului, optimizat printr-o logica eficienta de initializare. | ||
| + | |||
| + | ===== Concluzii ===== | ||
| + | |||
| + | Proiectul propus ofera o solutie practica si eficienta pentru monitorizarea si udarea automata a plantelor, fara ca utilizatorul sa intervina zilnic. Prin folosirea senzorilor si a componentelor de afisare si control, sistemul poate gestiona parametri importanti precum umiditatea solului, temperatura si nivelul apei. | ||
| + | |||
| + | Proiectul este usor de refacut, adaptabil si poate fi extins. Desi a fost gandit pentru plante de apartament, structura modulara permite folosirea lui si in aplicatii mai complexe, inclusiv in sisteme IoT. | ||
| + | ===== Download ===== | ||
| + | |||
| + | <note warning> | ||
| + | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | ||
| + | |||
| + | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
| + | </note> | ||
| + | |||
| + | |||
| + | ===== Jurnal ===== | ||
| + | |||
| + | <note tip> | ||
| + | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
| + | </note> | ||
| + | |||
| + | ===== Bibliografie/Resurse ===== | ||
| + | |||
| + | <note> | ||
| + | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
| + | </note> | ||
| + | |||
| + | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
| + | |||
| + | - Pentru modulul MP3: https://www.instructables.com/Tutorial-of-MP3-TF-16P/ | ||
| + | Cat si datasheetul: https://www.electronicoscaldas.com/datasheet/DFR0299-DFPlayer-Mini-Manual.pdf?srsltid=AfmBOopRyqEZlLLECGWZad9qkzdOQHsyO3ZfRmh8OgPTLugA3A6b7Q1f | ||
| + | |||
| + | - Releu datasheet: https://www.electronicoscaldas.com/datasheet/DFR0299-DFPlayer-Mini-Manual.pdf?srsltid=AfmBOopRyqEZlLLECGWZad9qkzdOQHsyO3ZfRmh8OgPTLugA3A6b7Q1f | ||
| + | |||
| + | - ALPHA TEST: displayul LCD: https://www.optimusdigital.ro/ro/optoelectronice-lcd-uri/62-lcd-1602-cu-interfata-i2c-si-backlight-galben-verde.html?search_query=lcd+&results=215 | ||