This shows you the differences between two versions of the page.
|
pm:prj2024:sseverin:doru_vlad.gheorghiu [2024/05/22 10:52] 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 76: | Line 76: | ||
| Prezentarea codului: | Prezentarea codului: | ||
| + | <code> | ||
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | pinMode(buttonPin, INPUT_PULLUP); | ||
| + | attachInterrupt(digitalPinToInterrupt(buttonPin), turnPumpOnOff, CHANGE); | ||
| + | pinMode(rainPin, INPUT); | ||
| + | pinMode(relayPin, OUTPUT); | ||
| + | |||
| + | bool status; | ||
| + | status = mpu.begin(); | ||
| + | if (!status) { | ||
| + | Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); | ||
| + | while (1); | ||
| + | } | ||
| + | |||
| + | lcd.init(); | ||
| + | lcd.backlight(); | ||
| + | } | ||
| + | </code> | ||
| + | * Î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. <code> | ||
| + | void turnPumpOnOff() { | ||
| + | buttonFlag = 1; | ||
| + | } | ||
| + | </code> | ||
| + | * **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). | ||
| + | <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. | ||
| + | * Î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 === | ||