Toto je starší verze dokumentu!
V prostředí Mbed vytvořte program pro vývojovou desku NXP FRDM-K64F, který bude realizovat řízení automatizovaného skleníku a jeho komunikaci s PC pomocí ethernetového rozhraní. Program bude zahrnovat ovládání a řízení periferií včetně návrhu komunikačního rozhraní s příkazy.
Cílem tohoto projektu je co nejvíce automatizovat obsluhu a udržování běžného zahradního skleníku. Obsahem návrhu je kompletní software řízení a obsluhy, ale také co nejjednodušší hardware pro příslušné periferie. Základní myšlenkou je možnost kontroly a nastavení jednotlivých vlastností skleníku z pohodlí domova, za pomoci ethernetového rozhraní a běžného PC. Pomocí definovaných příkazů je tak možné jak kontrolovat vlhkost půdy, teplotu a osvětlení ve skleníku, tak nastavit jejich limitní hodnoty pro spuštění zavlažování, odvětrávání/vytápění skleníku a přisvětlení zářivkami.
FRDM-K64F
Key Features
Požadavkem na celou konstrukci automatizovaného skleníku byla především jednoduchost implementace/instalace, ale také cena celého systému. Vzhledem k velkému možství některých součástek v inventáři zadavatele, byly proto použity především ony.
V hlavním souboru main.cpp probíhá inicializace celého programu pomocí jednotlivých knihoven. Pro celý program byly použity veřejně dostupné knihovny mbed(Rev. 109), mbed-rtos(Rev. 95), EthernetInterface(Rev. 49) a také knihovna BH1750 dostupná na stránce https://os.mbed.com/users/vrabec/code/BH1750/ , kterou však bylo z důvodu jednoduchosti použití třeba značně modifikovat. Pro ostatní periferie byla vytvořena nová c++ knihovna Peripherals, která zahrnuje patřičnou inicializaci periferií (analogové vstupy, digitální a PWM výstupy, …) a následně práci s nimi.
Použité knihovny v soubotu main.c
Zapouzdřuje do tříd veškeré vlastnosti pro snímání vlhkosti a teploty, a ovládání akčních členů (servomotorem řízené otevírání ventilace a reléově ovládané zavlažování/ventilace/topení). Skládá se z
Peripherals.h:
class Humid { public: Humid(PinName AInp = A0, PinName AOut = D0); uint8_t readHumidity(void); void setLimit(uint8_t lim); void setCurrentLimit(void); uint8_t getLimit(void); private: AnalogIn ain; DigitalOut dop; uint8_t Limit; }; /** */ class Temp { public: Temp(PinName AInp = A1); float readTemperature(void); void setHighLimit(float lim); void setLowLimit(float lim); void setVentLimit(float lim); void setCurrentHighLimit(void); void setCurrentLowLimit(void); void setCurrentVentLimit(void); float getHighLimit(void); float getLowLimit(void); float getVentLimit(void); private: AnalogIn ain; float HLimit, LLimit, VLimit; }; /** */ class Vent { public: Vent(PinName PWM = D8); void open(uint8_t percent = 100); void close(void); private: PwmOut pwm; uint8_t percentage; }; /** */ class Fan { public: Fan(PinName DOut = D4); void Start(void); void Stop(void); private: DigitalOut fan; }; /** */ class Heat { public: Heat(PinName DOut = D5); void Start(void); void Stop(void); private: DigitalOut heater; }; /** */ class Water { public: Water(PinName DOut = D6); void Start(void); void Stop(void); private: DigitalOut sprinkler; }; /** */ class Light { public: Light(PinName DOut = D7); void Start(void); void Stop(void); private: DigitalOut lighting; };
Peripherals.cpp: