Table of Contents

Screaming self watering pot

Introducere

Ce face?
ScreamingPot este un ghiveci auto-irigant echipat cu senzori de umiditate și de prezență umană. Când nivelul apei scade sub pragul necesar și senzorul detectează o persoană în apropiere, ghiveciul emite sunete amuzante care imită un strigăt, alertând astfel utilizatorul despre necesitatea reîncărcării cu apă. De asemenea, dispune de o aplicație pentru smartphone care permite utilizatorilor să monitorizeze starea plantei și să configureze setări personalizate pentru îngrijirea acesteia.

Scopul proiectului
ScreamingPot își propune să transforme îngrijirea plantelor într-o experiență mai plăcută și interactivă, reducând riscul ca plantele să sufere din cauza neglijenței. Este ideal pentru persoanele ocupate sau pentru cei care tind să uite să ude plantele, facilitând astfel menținerea sănătății vegetale fără eforturi constante.

Idea de la care a pornit
Ideea ScreamingPot a venit din dorința de a adăuga un element de umor și interactivitate în rutina zilnică de îngrijire a plantelor. Observând că multe persoane uită frecvent să-și ude plantele, m-am gândit că o alertă vocală amuzantă ar putea fi mai eficientă și mai memorabilă decât o simplă notificare pe telefon.

Descriere generală

Interacțiunea utilizatorului cu ScreamingPot
ScreamingPot oferă o interfață intuitivă de utilizator prin intermediul unei aplicații pentru smartphone. Utilizatorii pot seta programe personalizate de îngrijire a plantelor, având la dispoziție informații actualizate despre calitatea solului și nivelul de apă din rezervor. Aceasta permite o gestionare eficientă și personalizată a nevoilor specifice fiecărei plante.

Componente și comunicații
Inima sistemului este un Arduino UNO care se conectează la Wi-Fi printr-un modul ESP8266, cu care comunica prin SPI. Prin acest modul, dispozitivul poate comunica datele colectate direct pe telefonul utilizatorului prin intermediul conexiunii Wi-Fi.

Monitorizarea condițiilor de mediu
ScreamingPot este echipat cu senzori avansați care monitorizează continuu umiditatea solului și nivelul apei din rezervor. Aceste date sunt trimise constant către microcontroller, care ajustează funcționarea dispozitivului în funcție de necesitățile detectate.

Sistemul de irigare
Când este necesară udarea plantei, microcontroller-ul activează o pompă submersibilă, asigurând astfel irigarea adecvată în funcție de programul stabilit de utilizator.

Alerte sonore pentru reumplerea apei
Un aspect inovator al ScreamingPot este senzorul de proximitate, care detectează prezența umană în apropierea ghiveciului. Dacă nivelul apei este scăzut și senzorul de proximitate este activat, dispozitivul declanșează difuzorul integrat pentru a reda sunete amuzante. Aceste alerte sonore sunt concepute pentru a reaminti utilizatorului să reumple rezervorul de apă, combinând utilul cu plăcutul în îngrijirea plantelor.

Hardware Design

Lista de componente:

Diagramă Hardware

Conexiuni

Modul WiFi

HC-SR04

Senzor nivel apă

Senzor calitate sol

DFPlayer

Pompă submersibilă

Atașez și câteva poze din slicer: Ghiveciul exterior:

Ghiveciul interior:

Baza:

Software Design

Mediul de dezvoltare: Arduino IDE

Biblioteci folosite: DFRobotDFPlayerMini.h, SoftwareSerial.h

Acesta este codul rezultat:

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

// Define pin numbers for sensors and pump
const int trigPin = 8;
const int echoPin = 9;
const int waterSensorPin = A5;
const int waterSensorPower = 7;
const int soilMoisturePin = A0;
const int soilMoisturePower = 6;
const int pumpPin = 3; // PWM pin
const int trackMax = 4;

// Define variables for sensor readings
long duration;
int distance;
int waterLevel;
int soilMoistureLevel;
int trackNo = 1;

// Define timing variables
unsigned long previousMillisWater = 0;
unsigned long previousMillisSoil = 0;
const long intervalWater = 10000; // Interval for water level sensor (10 seconds)
const long intervalSoil = 15000;  // Interval for soil moisture sensor (15 seconds)

int df_RX = 11;
int df_TX = 10;

// Initialize DFPlayer Mini
SoftwareSerial dfSerial(df_TX, df_RX); // RX, TX for DFPlayer Mini
DFRobotDFPlayerMini myDFPlayer;

void setup() {
  // Set up the serial monitor
  Serial.begin(9600);

  // Set up the software serial for DFPlayer Mini
  dfSerial.begin(9600);

  // Initialize DFPlayer Mini
  if (!myDFPlayer.begin(dfSerial)) {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1. Please recheck the connection!"));
    Serial.println(F("2. Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(30);  // Set volume value (0~30).

  // Set pin modes using direct register manipulation
  DDRB |= (1 << DDB1); // pumpPin (PB1/Pin 9)
  DDRD |= (1 << DDD7); // waterSensorPower (PD7/Pin 7)
  DDRD |= (1 << DDD6); // soilMoisturePower (PD6/Pin 6)
  DDRB |= (1 << DDB0); // trigPin (PB0/Pin 8)
  DDRB &= ~(1 << DDB1); // echoPin (PB1/Pin 9)
  analogWrite(pumpPin, 0);
}

void loop() {
  // Measure distance
  measureDistance();

  // Timed sensor readings
  unsigned long currentMillis = millis();
  
  if (currentMillis - previousMillisWater >= intervalWater) {
    previousMillisWater = currentMillis;
    measureWaterLevel();
    Serial.print("Water level: ");
    Serial.println(waterLevel);
  }
  
  if (currentMillis - previousMillisSoil >= intervalSoil) {
    previousMillisSoil = currentMillis;
    measureSoilMoisture();
    Serial.print("Soil moisture: ");
    Serial.println(soilMoistureLevel);
    if (soilMoistureLevel <= 600) {
      analogWrite(pumpPin, 255);
      Serial.println("Pump on with PWM");
      delay(5000);
    }
    analogWrite(pumpPin, 0);
    Serial.println("Pump off");
  }

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  if (waterLevel < 500 && distance < 10) {
    if (trackNo > trackMax) {
      trackNo = 1;
    }
    myDFPlayer.play(trackNo);  
    delay(5000);
    myDFPlayer.stop();
    trackNo++;
  }

  delay(1000);
}

void measureDistance() {
  // Clear the trigPin
  PORTB &= ~(1 << PORTB0);
  delayMicroseconds(2);

  // Set the trigPin high for 10 microseconds
  PORTB |= (1 << PORTB0);
  delayMicroseconds(10);
  PORTB &= ~(1 << PORTB0);

  // Read the echoPin and calculate the duration of the pulse
  duration = pulseIn(echoPin, HIGH);

  // Calculate the distance in cm
  distance = duration * 0.034 / 2;
}

void measureWaterLevel() {
  // Power on the water level sensor
  PORTD |= (1 << PORTD7);
  delay(10);

  waterLevel = analogRead(waterSensorPin);

  // Power off the water level sensor
  PORTD &= ~(1 << PORTD7);
}

void measureSoilMoisture() {
  // Power on the soil moisture sensor
  PORTD |= (1 << PORTD6);
  delay(10);

  soilMoistureLevel = analogRead(soilMoisturePin);

  // Power off the soil moisture sensor
  PORTD &= ~(1 << PORTD6);
}

Rezultate Obţinute


Proiectul acoperă aproape tot ce mi-am propus, totul fiind funcțional mai puțin modulul WiFi, care s-a defectat cu o zi înainte de PM Fair și din păcate nu am găsit altul (fiind și duminică)m(. Am dat un mic fail și cu una din piesele printate 3D, dar am ciopârțit o cutie și am rezolvat.
Am reușit însă să creez un prototip funcțional și care cu siguranță te face să râzi. Proiectul funcționează în felul următor:

Concluzii

Per total, a fost un proiect foarte fun. Mi-ar fi plăcut să pot duce la bun sfârșit și integrarea cu WiFi (aveam niște planuri mari), dar ca și în viață, nu totul e posibil (nu până în PM Fair cel puținLOL).
Simt că am învățat multe de pe urma acestui proiect și că am descpoerit un nou hobby.

Download

sswp_reg.zip

Bibliografie/Resurse