Calugaru Matei - Sistem irigare

Introducere

Acesta este un dispozitiv electric care poate uda automat pamantul necesar plantei. Scopul este monitorizarea mai atenta a plantei chiar daca nu suntem in apropiere. Ideea de la care am pornit este una destul de generala, dar am integrat si un control al dispozitivului prin intermediul telefonului via Bluetooth. Cred ca proiectul este util deoarece te poate scapa de grija udatului de plante atunci cand nu esti acasa si poate verifica mult mai precis starea plantelor din punct de vedere al cantitatii de apa.

Descriere generală

Specificatii generale:

  1. Dispozitivul poate determina nivelul de umiditate din sol
  2. Dispozitivul poate afisa detalii despre umiditatea solului prin intermediul unui ecran
  3. Datele produse de dispozitiv pot fi urmarite de la distanta
  4. Dispozitivul poate fi actionat de la distanta
  5. Capacitatea de rulare a dispozitivului pe mai multe zile

Hardware Design

Componente:

  1 Arduino UNO
  1 Senzor masurare umiditate sol
  1 I2C LCD
  1 Releu 5V
  1 Pompa Apa 3-6V
  1 Modul Bluetooth HC-05
  1 Breadboard
  1 Furtun cu diametru interior de 6mm
  1 Suport Baterii + 4 Baterii AA
  1 Incarcator 5V + cablu alimentare Arduino

Software Design

Descrierea codului:

  • mediu de dezvoltare: Arduino IDE
  • librării: LiquidCrystal_I2C.h, Wire.h

Functii:

  1. Ordered List ItemSetup() - Setez pinii pentru releu si initializez eranul LCD
  2. Ordered List ItemcreateFixedLengthString() - Creeaza mesajul afisat pe LCD, acesta este pad-uit pentru a nu aparea flickering la ecran
  3. updateLCD() - face update la ecran daca acesta intra in modul manual
  4. readSensorAndUpdateLCD() -citeste informatia data de senzor si face update la ecran cu noua informatie despre umiditatea solului
  5. loop() - sunt apelate functiile de mai sus, senzorul cieste informatii despre umiditate la 3 secunde (aceasta unitate poate fi marita), in acelasi timp, prin intermwdiul aplicatiei pompa de apa poate fi actionata manual sau trecuta la loc in modul automat

Laburi folosite:

  1. Lab1 USART- interfata seriala
  2. Lab3 PWM - control pompa
  3. Lab6 I2C - conectare ecran LCD

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
int moist = A0;
char data = 0;
char prevData = 0;
const int RELAY_PIN = 3;
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
String previousStatus = ""; // To store the previous status
unsigned long previousMillis = 0; // To store the last time the sensor was read
const long interval = 3000; // Interval for reading the sensor (3 seconds)
bool manualMode = false; // To track whether we are in manual mode
 
void setup() {
  Serial.begin(9600);
 
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
  lcd.init();  // initialize the lcd
  lcd.backlight();
 
  pinMode(RELAY_PIN, OUTPUT);
}
 
// Function to create a string of fixed length
String createFixedLengthString(String message, int length) {
  int messageLength = message.length();
  while (messageLength < length) {
    message += " ";  // Add a space to pad the message
    messageLength++;
  }
  return message;
}
 
void updateLCD(String status) {
  // Pad the status message to the width of the LCD
  status = createFixedLengthString(status, 16); //16 char for the LCD
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Moist Type: ");
  lcd.setCursor(0, 1);
  lcd.print(status); 
}
 
void readSensorAndUpdateLCD() {
  int moist_val = analogRead(moist);
  String status;
 
  if ((moist_val >= 600) && (moist_val <= 1200)) {
    status = "Dry";
    digitalWrite(RELAY_PIN, HIGH);
  } else if ((moist_val >= 370) && (moist_val < 600)) {
    status = "Humid";
    digitalWrite(RELAY_PIN, LOW);
  } else if (moist_val <= 370) {
    status = "Wet";
    digitalWrite(RELAY_PIN, LOW);
  }
 
  // Only update the LCD and print to Serial if the status has changed
  if (status != previousStatus) {
    Serial.println(status + " Soil");
    updateLCD(status);
    previousStatus = status;  // Update the previous status
  }
}
 
void loop() {
  unsigned long currentMillis = millis();
 
  // Check if it's time to read the sensor
  if (currentMillis - previousMillis >= interval && !manualMode) {
    previousMillis = currentMillis;
    readSensorAndUpdateLCD();
  }
 
  // Check for manual control commands
  if (Serial.available() > 0) {
    data = Serial.read();
    if (data != prevData) {
      if (data == '1') {
        manualMode = true; // Enable manual mode
        digitalWrite(RELAY_PIN, HIGH);
        updateLCD("Manual On");
      } else if (data == '0') {
        manualMode = true; // Enable manual mode
        digitalWrite(RELAY_PIN, LOW);
        updateLCD("Manual Off");
      } else if (data == 'a') {
        manualMode = false; // Return to automatic mode
        readSensorAndUpdateLCD(); // Immediately read sensor and update LCD
      }
      prevData = data;  // Update the previous data
    }
  }
}

  • Pentru a testa functionalitatea bluetooth, am facut o aplicatie simplista in MIT App Inventor

Rezultate Obţinute

  • Atasez, mai jos forma finala a proiectului

Concluzii

  • Chiar daca este un proiect simplist, este un bun punct de plecare si obisnuire cu produse hardware. Mai jos vreau sa subliniez cateva lucruri de care m-am lovit si care pot fi evitate usor daca cineva doreste sa se apuce de acest proiect.
  1. Foloseste o cutie mai mare pentru componente!!!!!
  2. Incearca sa pozitionezi releul cat mai departe de ecran, undele electromagnetice pot afisa valori garbage pe LCD
  3. Foloseste un cablu mai lung pentru pompa de apa submersibila
  4. Cumpara cabluri de mai multe marimi (better cable management)

Download

Jurnal

  • 16.05.2024 - Procurarea tuturor elementelor hardware si testarea lor
  • 23.05.2024 - Finalizarea si testarea soft-ului
  • 24.05.2024 - Finisarea produsului, includerea intr-o carcasa

Bibliografie/Resurse

pm/prj2024/ddosaru/matei.calugaru.txt · Last modified: 2024/05/25 12:37 by matei.calugaru
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