Automatické dávkování hnojiva pomocí Arduina

Představili jsme si několik možností, pomocí kterých můžeme automaticky dávkovat tekuté hnojivo do akvária. V příspěvku bych popsal stavbu automatického dávkovače postaveného z Arduina.

1. Seznam komponent

2. Zapojení

Pokud nepotřebujeme určit čas hnojení, můžeme použít nejjednodušší zapojení, kdy čerpadlo sepneme každých 24 hodin od restartu Arduina.

//Arduino Uno     Relay       Pump
//8               IN
//5V              VCC
//GND             GND
//GND                         -
//12V             COM
//                NO          +

V případě že chceme dávkovat v konkrétní hodiny nebo i dny, musíme použít nějaký obvod reálného času, případně zjišťovat čas z Internetu.

//Arduino UNO     DS3231
//A4 (SDA)        SDA
//A5 (SCL)        SCL
//3.3V            VCC
//GND             GND

Alternativně si můžeme připojit tlačítko pro přímé zapnutí čerpadla. To se nám hodí při prvním spouštění, kdy si naplníme hadičky, případně k proplachu hadiček. Stačí připojit tlačítko přes relé.

3. Zdroják

Varianty zmíněné v zapojení je možné zapnout v kódu pomocí preprocesorových definic.

  • REAL_TIME_CLOCK – je použit obvod reálného času DS3231

Nastavení parametrů:

  • FLOW_RATE – kolik ml přečerpá čerpadlo za 1 minutu (změřit)
  •  FERTILIZER_VOLUME – dávka hnojiva v ml (spočítat 2-6 ml na 100L)
  • HOUR_TO_FEED – hodina dávkovaní 0 – 24 (pouze s REAL_TIME_CLOCK)
  • MINUTE_TO_FEED – hodina dávkovaní 0 – 59 (pouze s REAL_TIME_CLOCK)
//Automatic aquarium feeder allows to fill liquid fertilizer into aquarim.

#define VERSION 0.03
// 0.03 - support for DS3231 real time clock
// 0.02 - relay on/off definition, final value for fertilizer
// 0.01 - basic implementation with Arduino Uno, relay and peristaltic pump

//wiring
//Arduino Uno     Relay       Pump
//8               IN
//5V              VCC
//GND             GND
//GND                         -
//12V             COM
//                NO          +

//Arduino UNO     DS3231
//A4 (SDA)        SDA
//A5 (SCL)        SCL
//3.3V            VCC
//GND             GND


#define DEBUG //show debug logs
#define REAL_TIME_CLOCK //use real time clock DS3231

#ifdef REAL_TIME_CLOCK
#include <Wire.h>
#include "DS3231.h" //https://github.com/NorthernWidget/DS3231

RTClib _realTimeClock;

#define HOUR_TO_FEED 19 //we will feed in 19:00
#define MINUTE_TO_FEED 0
#endif //REAL_TIME_CLOCK

//make definition to be shure about relay set
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define RELAY_OUTPUT_PIN 8

//modify this value according to your pump performance
#define FLOW_RATE 75.0f//ml/min
//modify this value according to aquarium volume
#define FERTILIZER_VOLUME 10.0f//in ml

#define PERIOD_TO_FEED_AQUARIUM 86400//in sec (86 400 = 24h)//once per day
//testing period
//#define PERIOD_TO_FEED_AQUARIUM 15//in sec

bool _pumpRunning;//flag signalise that pump is running
int _runningTime = (int) ((FERTILIZER_VOLUME / FLOW_RATE) * 60);//in sec

uint32_t _timeToStopPump;
uint32_t _timeToStartPump;

void setup()
{
  Serial.begin(115200);

#ifdef DEBUG
  Serial.print("Automatic aquarium feeder:");
  Serial.println(VERSION);
#endif //DEBUG

#ifdef REAL_TIME_CLOCK
  Wire.begin();
  Serial.println("Used real time clock");
#endif //REAL_TIME_CLOCK

  //initialize
  _pumpRunning = false;
  
  pinMode(RELAY_OUTPUT_PIN, OUTPUT);//set relay pin as output
  digitalWrite(RELAY_OUTPUT_PIN, RELAY_OFF);//switch off relay
  
  sheduleNextPumpStart();
}

void loop()
{
  uint32_t nowTime = nowTimeSec();
  
  //is time to start feeding
  if (nowTime > _timeToStartPump)
  {
    if (!_pumpRunning)
    {
#ifdef DEBUG
      Serial.println("Start feeding.");
#endif //DEBUG

      _pumpRunning = true;
      digitalWrite(RELAY_OUTPUT_PIN, RELAY_ON);//start pump
    }

    //check time for stop pump
    if (nowTime > _timeToStopPump)
    {
#ifdef DEBUG
      Serial.println("Stop feeding.");
#endif //DEBUG

      _pumpRunning = false;
      digitalWrite(RELAY_OUTPUT_PIN, RELAY_OFF);

      sheduleNextPumpStart();
    }
  }
}

// Returns now time in sec.
uint32_t nowTimeSec()
{
#ifdef REAL_TIME_CLOCK
  DateTime now = _realTimeClock.now();
  
  return now.unixtime();//real time from 1970
#else
  return (millis() / 1000);//only counter from power on
#endif //REAL_TIME_CLOCK
}

//Shedule next pump start in relative time from now.
void sheduleNextPumpStart()
{
#ifdef REAL_TIME_CLOCK
  DateTime now = _realTimeClock.now();
  
  uint8_t nowHour = now.hour();
  uint8_t nowMinute = now.minute();

  //today feed time
  DateTime nextFeedTime = DateTime(now.year(), now.month(), now.day(), HOUR_TO_FEED, MINUTE_TO_FEED, 0);

  Serial.print("nowHour:");
  Serial.println(nowHour);

  Serial.print("nowMinute:");
  Serial.println(nowMinute);

  Serial.print("nowUnixTime:");
  Serial.println(now.unixtime());

  Serial.print("todayFeedUnixTime:");
  Serial.println(nextFeedTime.unixtime());

  //check if we can feed today
  if (nowHour <= HOUR_TO_FEED)
  {
    //not feed today yet
    if (nowHour == HOUR_TO_FEED && nowMinute >= MINUTE_TO_FEED)
    {
      //to late to feed today
      //feed tomorrow
      _timeToStartPump = nextFeedTime.unixtime() + PERIOD_TO_FEED_AQUARIUM;
    }
    else
    {
      _timeToStartPump = nextFeedTime.unixtime();
    }
  }
  else
  {
    //feed tomorrow
    _timeToStartPump = nextFeedTime.unixtime() + PERIOD_TO_FEED_AQUARIUM;
  }
#else
  uint32_t nowTime = nowTimeSec();
  _timeToStartPump = nowTime + PERIOD_TO_FEED_AQUARIUM;//first feed is after PERIOD_TO_FEED_AQUARIUM (safe for black out)
#endif //REAL_TIME_CLOCK

  _timeToStopPump = _timeToStartPump + _runningTime;

#ifdef DEBUG
  Serial.println("Shedule next pump start.");

  Serial.print("_timeToStartPump:");
  Serial.println(_timeToStartPump);

  Serial.print("_timeToStopPump:");
  Serial.println(_timeToStopPump);

  Serial.print("_runningTime:");
  Serial.println(_runningTime);
#endif //DEBUG
}

4. Kompletace

Vyjmeme jednu průchodku z krabičky a nasadíme čerpadlo. Obkreslíme si dírky na hlavě čerpadla, vyjmeme čerpadlo a vyvrtáme dírky do krabičky 2 mm vrtákem. Nasadíme zpět čerpadlo a připevníme šroubky.

Připevněné čerpadlo na krabičce.

Přiložíme víčko krabičky a obkreslíme si okraj čerpadla, který brání v dosednutí víčka. Odřízneme označenou část víčka a vyzkoušíme jak sedí.

Odříznutá část víčka zapadající k čerpadlu.
Kontrola dosednutí víčka.

Do vnitřku krabičky si uřízneme desku z 5 mm překližky ve tvaru písmene L, o rozměru 30x60x60 mm. Můžeme si nejprve vyrobit šablonku z papíru a podle ní zhotovit finální podložku.

Šablonka z kartonu.

Desku přišroubujeme do krabičky.

Podložka s dírkou pro přišroubovaní vložená do krabičky.

Podle popisu zapojení propojíme jednotlivé komponenty.

Na desku v krabičce připevníme Arduino (pomocí vrutů) a relé (pomocí tavné pistole). Nevýhodou této instalace je nutnost odmontovat Arduino v případě potřeby změny kódu.

Arduino a relé přichycené k podložce.

Prořízneme boční průchodku a protáhneme konektor napájení Arduina.

Volné vodiče od relé připojíme k tlačítku za montovaného do další průchodky vedle čerpadla.

5. Uvedení do provozu

Do víčka vhodné nádoby vyvrtáme dírku o průměru 4 mm a protáhneme akvarijní hadičku. Venkovní konec nahřejeme a vstrčíme do něj hadičku od čerpadla. Stejně připojíme hadičku od čerpadla k hadičce do akvária.

Připojení hadiček k čerpadlu.

Do nádoby nalijeme namíchané hnojivo za uzavřeme víčkem. Hadičku určenou do akvária vložíme do akvária. Zmáčkneme tlačítko a počkáme až hnojivo doputuje k akváriu. Pokud má čerpadlo opačný chod, přepojíme kabely na čerpadle. Tím je dávkovač připraven k použití.

Instalovaný automatický dávkovač hnojiva.

6. Několik rad

  • pravidelně kontrolujte chod dávkovače a ubývání hnojiva
  • nádoba na hnojivo by měla být neprůhledná
  • používejte menší množství hnojiva, aby se nekazilo
  • po spotřebování dávky hnojiva vymyjte nádobu
  • pravidelně 1 týdně měňte část vody v akváriu

7. Náměty k dalšímu vylepšení

  • moduly pro připojení teploměru, PH sondy
  • NodeMCU a řízení přez Wifi
  • připojeni do Domoticz a řízení přes něj

10 thoughts on “Automatické dávkování hnojiva pomocí Arduina

Add yours

  1. Zdravím moc se mi to líbí.
    Chtěl bych si to sestavit i s tím modulem teploměru ale hlavně ph sondy a spínání co2.
    Šlo by se nějak domluvit co objednat za moduly a pomoci s programem ???
    Děkuji

    1. Ahoj,
      již dříve jsem uvažoval o CO2 hnojení i o měření CO2 v akváriu, ale z různých důvodů (finance, čas, lenost …) jsem to nakonec nerealizoval.

      Dokonce mi v šuplíku už pár let leží tahle PH sonda.

      Nejdříve je potřeba se zamyslet, zda by nestačilo vypínat CO2 jen na noc. Odpadla by PH sonda, měření, programování pro Arduino. Případně nevypínat, ale jen v noci vzduchovat ( odpadl by elektromagnetický ventil).

      V případě, že z nějakého důvodu chceme kombinaci s Arduinem, tak budeme potřebovat.

      Komponenty:
      CO2 systém s elektromagnetickým ventilem
      PH sonda
      relé
      teploměr
      display s tlačítky
      – samozřejmě nějaké Arduino

      Kód pro teploměr i PH půjde najít na webu. Osobně nevím, zda bych našel čas, zkusit rozjet sondu co mám doma.

      1. Zdravím omlouvám se za pozdní reakci.
        Věc se má tak: vzhledem k tomu aby akvárium šlapalo dobře a šetřilo se co2, je dávkování pomoci sondy nezbytné.
        A jelikož je originál dost drahý pro to bych to chtěl zrealizovat pomocí Arduina.
        Jelikož už jsem se bádal po nějakém tom programu našel jsem tohle:
        http://mn-tech.pl/arduino/sonda-ph-cz-3-test-urzadzenia/
        Pán to má celkem dobře napsáno a nějaké ty problémy vychytány.
        A je to funkční. 😉
        Akorát jak bych chtěl zkombinovat:
        Vaše dávkovaní hnojiva akorát se dvěma čerpadly
        A dodat display pro informace o aktuálním stavu PH
        požadovaném stavu PH
        A popřípadě manuální sepnuti každého čerpadla zvláště, pro odpuštění dávky.
        A změny dávky čerpadel

        1. Ahoj,
          takže co by jsi potřeboval ode mě?

          Upravit hnojení pro dvě čerpadla?
          Nebo že bych vytvořil projekt podle tvého zadání?
          Jak by jsi se chtěl do projektu sám zapojit?

  2. Ahoj, fakticky skvělý návod, ale myslím si, že by na tento „setup“ úplně stačilo NANO. I kdybys k tomu chtěl interfacovat LCD nebo něco takového.

  3. Ahoj,

    prosím tě, jak by vypadalo zapojení, zdrojový kód a celé sestavení u dávkovače na 4 čerpadla? Díky za odpověď.

    1. Ahoj,
      každé čerpadlo by mělo čerpat vlastní objem?
      Čerpadla se budou spouštět ve stejný čas?

      Budeš potřebovat 4 kanálové relé a čtyři čerpadla. Samozřejmě mnohem větší krabičku.
      Kód by se musel přepsat, pro podporu více čerpadel (logiku pumpy do vlastní třídy, vytvořit instance podle počtu pump, nastavit jim podmínky a dobu spuštění).

  4. Ano, stejný objem a stejný čas. Takže koukám, že je to složitější to předělat na 4 čerpadla. Zkusím to vyrobit pomocí časových relé.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑