Differences

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

Link to this comparison view

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 ===
pm/prj2024/sseverin/doru_vlad.gheorghiu.1716364335.txt.gz · Last modified: 2024/05/22 10:52 by doru_vlad.gheorghiu
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