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.
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.
Lista de componente:
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:
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); }
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ă). 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:
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.