Operácie

Automatické zavlažovanie: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 38: Riadok 38:
=== Algoritmus a program ===
=== Algoritmus a program ===


Ako prvé sa inicializuje ADC — nastaví sa referenčné napätie na VCC (5V) cez register ADMUX a zapne sa ADC s prescalerom 64 cez register ADCSRA. Zároveň sa nastaví pin D7 ako výstup cez register DDRD a pumpička sa vypne (HIGH na D7, keďže relay je LOW-active).
Na začiatku sa nastaví pin D7 ako výstup cez register DDRD a pumpička sa vypne makrom PUMPA_OFF(). Potom sa inicializuje ADC — nastaví sa referenčné napätie na VCC a prescaler na 64.
Program následne prejde do hlavnej while slučky kde každých 500 ms číta hodnotu vlhkosti pôdy. Funkcia adc_citaj() vyberie kanál 0 (pin A0), spustí konverziu zápisom do bitu ADSC v registri ADCSRA a čaká kým sa konverzia dokončí. Výsledok je 10-bitové číslo v rozsahu 0–1023.
V hlavnej slučke sa každých 500 ms zavolá funkcia adc_citaj(0) ktorá prečíta hodnotu z pinu A0. Funkcia spustí ADC konverziu bitom ADSC a čaká kým sa dokončí. Výsledok je číslo 0–1023 ktoré reprezentuje vlhkosť pôdy.
Program skontroluje či je nameraná hodnota vyššia ako prah 350. Ak áno, pôda je suchá a program zapne pumpičku zápisom LOW na pin D7. Pumpička beží 0.5 sekundy, potom sa vypne zápisom HIGH na D7. Program čaká 5 sekúnd kým sa vlhkosť ustáli a meranie pokračuje odznova.  
Ak je táto hodnota väčšia ako 350 (pôda je suchá), makro PUMPA_ON() zapne pumpičku. beží 500 ms, potom ju makro PUMPA_OFF() vypne a program čaká 5 sekúnd kým sa vlhkosť v pôde ustáli. Potom sa celý cyklus opakuje.





Verzia z 14:35, 7. jún 2026

Záverečný projekt predmetu MIPS / LS2026 - Dávid Vričan


Zadanie

Cieľom môjho projektu bolo zostrojiť systém automatického zavlažovania rastlín pomocou snímača vlhkosti pôdy a pumpičky. Systém pomocou kapacitného senzora priebežne meria vlhkosť pôdy. Keď vlhkosť klesne pod nastavenú hranicu, mikrokontrolér ATmega328P automaticky zapne pumpičku cez relé, ktoré začne čerpať vodu do kvetináča. Po dosiahnutí požadovanej vlhkosti sa pumpička automaticky vypne.

Vývojová doska Arduino UNO.

Literatúra:


Analýza a opis riešenia

Arduino UNO (klon s ATmega328P) — hlavná riadiaca jednotka

Kapacitný senzor vlhkosti pôdy v1.2 — meria vlhkosť pôdy, analógový výstup (AOUT) pripojený na pin A0

Relé 1 kanál 5V — spína napájanie pumpičky, ovládaný digitálnym pinom D7

Minipumpa 5V DC — čerpá vodu z nádoby do kvetináča

Breadboard — prepojenie komponentov bez spájkovania

Jumper káble — prepojenie pinov

Zapojenie je realizované na breadboarde. Kapacitný senzor vlhkosti pôdy je napájaný z 5V pinu Arduina a jeho analógový výstup (AOUT) je pripojený na pin A0 mikrokontroléra. Relé je napájané taktiež z 5V a jeho ovládací pin IN je pripojený na digitálny pin D7. Pumpička je zapojená cez spínacie kontakty relátka (COM a NO). Celý systém je napájaný cez USB kábel z počítača.

Celkový pohľad na zariadenie.


Schéma zapojenia.


Algoritmus a program

Na začiatku sa nastaví pin D7 ako výstup cez register DDRD a pumpička sa vypne makrom PUMPA_OFF(). Potom sa inicializuje ADC — nastaví sa referenčné napätie na VCC a prescaler na 64. V hlavnej slučke sa každých 500 ms zavolá funkcia adc_citaj(0) ktorá prečíta hodnotu z pinu A0. Funkcia spustí ADC konverziu bitom ADSC a čaká kým sa dokončí. Výsledok je číslo 0–1023 ktoré reprezentuje vlhkosť pôdy. Ak je táto hodnota väčšia ako 350 (pôda je suchá), makro PUMPA_ON() zapne pumpičku. Tá beží 500 ms, potom ju makro PUMPA_OFF() vypne a program čaká 5 sekúnd kým sa vlhkosť v pôde ustáli. Potom sa celý cyklus opakuje.


#include <avr/io.h>
#include <util/delay.h>

#define RELAY_PIN    PD7        /* relé pripojené na digitálny pin D7 */
#define PRAH_SUCHO   350        /* ADC hodnota nad ktorou je pôda suchá */
#define PRAH_VLHKO   250        /* ADC hodnota pod ktorou je pôda vlhká */
#define CAS_PUMPY_MS 500       /* čas behu pumpy v milisekundách (0.5s) */

/* Relé modul je LOW-active: LOW = pumpa zapnutá, HIGH = pumpa vypnutá */
#define PUMPA_ON()   PORTD &= ~(1 << RELAY_PIN)
#define PUMPA_OFF()  PORTD |=  (1 << RELAY_PIN)

/* Inicializácia ADC */
void adc_init(void)
{
    ADMUX  = (1 << REFS0);                          /* referenčné napätie = VCC (5V) */
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); /* zapni ADC, prescaler = 64 */
}

/* Čítanie hodnoty ADC z vybraného kanála (0 = A0) */
uint16_t adc_citaj(uint8_t kanal)
{
    ADMUX = (ADMUX & 0xF0) | (kanal & 0x0F); /* vyber kanál */
    ADCSRA |= (1 << ADSC);                   /* spusti konverziu */
    while (ADCSRA & (1 << ADSC));            /* čakaj kým sa dokončí */
    return ADC;                              /* vráť výsledok (0-1023) */
}

int main(void)
{
    DDRD |= (1 << RELAY_PIN);  /* nastav D7 ako výstup */
    PUMPA_OFF();               /* pumpa vypnutá na začiatku */
    adc_init();                /* inicializuj ADC */

    while (1)
    {
        uint16_t vlhkost = adc_citaj(0);  /* čítaj vlhkosť z A0 */

        if (vlhkost > PRAH_SUCHO)         /* ak je pôda suchá */
        {
            PUMPA_ON();                   /* zapni pumpu */
            _delay_ms(CAS_PUMPY_MS);      /* pumpa beží 0.5 sekundy */
            PUMPA_OFF();                  /* vypni pumpu */
            _delay_ms(5000);              /* počkaj 5 sekúnd kým sa vlhkosť ustáli */
        }

        _delay_ms(500);  /* meranie každých 500ms */
    }
    return 0;
}

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Aplikácia.

Video:

Čo by som urobil inak

Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.