This shows you the differences between two versions of the page.
pm:prj2024:sseverin:doru_vlad.gheorghiu [2024/05/24 15:05] doru_vlad.gheorghiu |
pm:prj2024:sseverin:doru_vlad.gheorghiu [2024/05/27 10:26] (current) doru_vlad.gheorghiu |
||
---|---|---|---|
Line 28: | Line 28: | ||
- Se repetă procesul în loop până când microcontrolerul este deconectat de la sursa de curent. | - Se repetă procesul în loop până când microcontrolerul este deconectat de la sursa de curent. | ||
- | {{:pm:prj2024:sseverin:electric_design_gheorghiu_vlad.png?700x400|General Diagram}} | + | {{:pm:prj2024:sseverin:diagrama_gheorghiu_vlad.png?700x400|General Diagram}} |
=== Hardware Design === | === Hardware Design === | ||
Line 97: | Line 97: | ||
</code> | </code> | ||
* În **setup()**, setăm pinii în felul următor: | * În **setup()**, setăm pinii în felul următor: | ||
- | * **buttonPin** (pinul butonului de pe care citim schimbările) la **INPUT_PULLUP** (adică valoarea pinului rămâne VCC și vom citi de pe el). De asemenea, vom folosi pinul pentru a genera întreruperi, astfel că la fiecare schimbare (**CHANGE**) a semnalului, se va apela funcția **turnPumpOnOff()**. Astfel, când apăsăm butonul, semnalul de pe pin este tras de la VCC la GND și microcontrolerul va genera o întrerupere. | + | * **buttonPin** (pinul butonului de pe care citim schimbările) la **INPUT_PULLUP** (adică valoarea pinului rămâne VCC și vom citi de pe el). De asemenea, vom folosi pinul pentru a genera întreruperi, astfel că la fiecare schimbare (**CHANGE**) a semnalului, se va apela funcția **turnPumpOnOff()**. Astfel, când apăsăm butonul, semnalul de pe pin este tras de la VCC la GND și microcontrolerul va genera o întrerupere. <code> |
- | <code> | + | |
void turnPumpOnOff() { | void turnPumpOnOff() { | ||
buttonFlag = 1; | buttonFlag = 1; | ||
} | } | ||
</code> | </code> | ||
- | <note tip> | ||
- | În **turnPumpOnOff()** doar vom seta flag-ul că s-a apăsat butonul. | ||
- | </note tip> | ||
* **rainPin** (pinul analogic al senzorului de umiditate a solului) la **INPUT** (vom citi semnalele analogice ale senzorului). | * **rainPin** (pinul analogic al senzorului de umiditate a solului) la **INPUT** (vom citi semnalele analogice ale senzorului). | ||
* **relayPin** (pinul releului) la **OUTPUT** (vom porni și opri releul care acționează la rândul lui pompa). | * **relayPin** (pinul releului) la **OUTPUT** (vom porni și opri releul care acționează la rândul lui pompa). | ||
+ | <note tip> | ||
+ | În **turnPumpOnOff()** doar vom seta flag-ul că s-a apăsat butonul. | ||
+ | </note> | ||
* Pe urmă, pornim senzorul de temperatură și ecranul LCD. | * Pe urmă, pornim senzorul de temperatură și ecranul LCD. | ||
+ | * În funcția **loop()**: | ||
+ | * Vom citi măsurătorile făcute de MPU6050 (vom folosi doar măsurătorile temperaturii) <code> | ||
+ | sensors_event_t a, g, temp; | ||
+ | mpu.getEvent(&a, &g, &temp); | ||
+ | </code> | ||
+ | * Vom verifica dacă butonul a fost apăsat, iar dacă **buttonFlag == 1**, vom face debouncing pe buton și vom inversa flagul de pornire a pompei (**pumpToggle**) <code> | ||
+ | if((millis() - previousPress) > buttonDebounce && buttonFlag) | ||
+ | { | ||
+ | previousPress = millis(); | ||
+ | if(digitalRead(buttonPin) == LOW && previousState == HIGH) | ||
+ | { | ||
+ | pumpToggle =! pumpToggle; | ||
+ | Serial.println("pressed button"); | ||
+ | previousState = LOW; | ||
+ | } | ||
+ | | ||
+ | else if(digitalRead(buttonPin) == HIGH && previousState == LOW) | ||
+ | { | ||
+ | previousState = HIGH; | ||
+ | } | ||
+ | buttonFlag = 0; | ||
+ | } | ||
+ | </code> | ||
+ | * Citim valoarea analogică a senzorului de umiditate a solului și o convertim în procente. Dacă valoarea este mai mare de un threshold stabilit (**thresholdValue = 40** în acest caz), planta nu trebuie udată și setez pinul releului pe **LOW**. Dacă valoarea este mai mare decât threshold-ul, vom verifica dacă flag-ul pompei (**pumpToggle**) este pornit, iar dacă este, setăm pinul releului pe **HIGH** și pompa se va porni, alimentându-se de la baterie. <code> double sensorValue = (1023 - analogRead(rainPin)) * (100.0 / 1023); | ||
+ | if (sensorValue > thresholdValue) { | ||
+ | Serial.print(sensorValue); | ||
+ | Serial.println(" - Doesn't need watering"); | ||
+ | digitalWrite(relayPin, LOW); | ||
+ | } | ||
+ | else if (pumpToggle) { | ||
+ | Serial.print(sensorValue); | ||
+ | Serial.println(" - Time to water your plant"); | ||
+ | digitalWrite(relayPin, HIGH); | ||
+ | } else if (!pumpToggle) { | ||
+ | digitalWrite(relayPin, LOW); | ||
+ | } | ||
+ | </code> | ||
+ | * De asemenea, vom scrie pe pin-ul de PWM al LED-ului valoarea senzorului de umiditate, scalată astfel încât să fie vizibilă schimbarea. Dacă pământul este umed, LED-ul va lumina mai puțin. <code> analogWrite(pwmPin, 255 - sensorValue * 3.7); </code> | ||
+ | * În final, scriem pe ecranul LCD valorile obținute. <code> lcd.setCursor(0, 0); | ||
+ | lcd.print("Temp: "); | ||
+ | lcd.print(temp.temperature); | ||
+ | lcd.print(" C"); | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("Humidity: "); | ||
+ | lcd.print(sensorValue); | ||
+ | lcd.print("%"); | ||
+ | delay(100); | ||
+ | lcd.clear(); | ||
+ | </code> | ||
=== Rezultate Obținute === | === Rezultate Obținute === | ||
---- | ---- | ||
+ | [[https://www.youtube.com/shorts/szFKygTQOv0|Rezultate Obţinute]] | ||
=== Concluzii === | === Concluzii === | ||
---- | ---- | ||
+ | |||
+ | A fost un proiect din care am învățat destul de multe și mi-am solidificat cunoștințe de hardware. Am avut câteva probleme care m-au făcut să caut mai amănunțit informații despre cum funcționează unele componente și consider că a fost un milestone pentru mine să realizez sistemul acesta. | ||
=== Download === | === Download === | ||
---- | ---- | ||
- | === Jurnal === | + | {{:pm:prj2024:sseverin:proiect_pm.zip|}} |
- | ---- | + | |
=== Bibliografie/Resurse === | === Bibliografie/Resurse === |