Arduino automatizace pěstírny - společný vývoj, vysvětlení pro začátečníky. - Klikni zde pro originální téma |
Krteček1 |
Zdravím ve spolek.
Mám teď trochu času a tak jsem si řekl, že vyrobím přístroj na automatizaci pěstírny postavený na Arduinu. Nejspíše to použiji až budu mít skleník na rajčata a papriky, ale určitě to bude velmi dobře fungovat i v pěstírně.
Již jsem jednou něco takového sestrojil, viz mé minulé vlákno. Ale nyní chci začít od začátku, vše postupně vyzkouším, zveřejním včetně kódu, schemat, fotek, takže si to bude moci postavit každý, i uplný začátečník.
Pro vývoj touto cestou jsem se rozhodl,proto že doufám, že mi sem občas napíšete nápady, postřehy kritiku atd a nebudu na to uplně sám, na něčem se tu domluvíme a já se to potom pokusím uvést do praxe...
Ještě chci říci že nejsem v této oblasti profesionál, čili pujde jen o můj pohled na věc a je možné, že některé problémy půjde řešit lépe. Pro mne je cíl, aby to fungovalo...
Fantazii se meze nekladou, sám nevím, kde tohle skončí, ale my češi jsem velmi šikovný národ a věřím, že se nám podaří vymyslet vysoce funkční, trvanlivý a jednoduše vyrobitelný přístroj. |
|
|
Krteček1 |
Nejdříve proč Arduino.
Arduino je podle mne skvělý přístroj s mnoha možnostmi s velmi bohatým příslušenstvím (senzory, rozšiřující desky atd). Originál deska stojí kolem 500, ale existují klony které jsou funkční a z číny se dají sehnat snad již od 50ti kč. Zrovna tak příslušenství, například modul DHT 22 - měří teplotu a vlhkost stojí několik dolarů, podobně displeje motory, rozšiřující desky, relé atd....
Čili za velmi rozumnou cenu lze postavit funkční a komplexní systém.
Možná se dostaneme na jeho hranice a možná potom přidáme například Raspberry pi, ale nejdříve chci dostat maximum z této desky a jsem přesvědčen, že to bude 90ti % uživatelúm stačit....
Odkaz základy a představení arduina:https://arduino.cz/co-je-to-arduino/
oficiální stránka v angličtině www.arduino.cc |
|
|
Krteček1 |
Nejprve je potřeba vymyslet, co vše budeme od výsledného produktu požadovat, a zde poprosím o pomoc Vás, co vše by se Vám hodilo kdyby to umělo...Časem určitě přijdeme na více věcí.
Mne se během pěstu nejvíce hodila funkce, kdy Arduino monitorovalo teplotu a vlhkost a podle toho zapínalo Odtahový větrák (přítah byl pasivní, ale mohl být ovládaný zrovna tak ), dále bylo šikovné, když se mi naměřené hodnoty a co se právě děje vypisovaly na display
Tak tím začnu a budu doufat, že jsem někoho zaujal a přibudou nějaké příspěvky s nápady:-). |
|
|
someone.noone |
Čau krtecku no jelikož jsem fanda automatizace ... Ale i když to vysvětlujes začátečníkům jsem z toho stejně v pasti. :D je pro mě důležité abych věděl jaká je teplota v boxu a popřípadě abych mohl na dálku sepnout nebo vypnout nějakou vec. Tudíž jsem to řešil nejjednodušeji jak to podle mě jde možná ne tak levně ale. Vše ovládání pomocí Xiaomi Smart home. V zásuvce je brána která je spojena s wifi, s bránou přes bt teploměr který je v boxu a všechny spotřebiče jsou na WiFi zásuvce o5 připojený k bráně na teploměru si nastavím hodnoty které potřebují udržovat a podle toho se spouští a nebo naopak vypínají zasuvky. Vše mám přehledně v mobilu a teploměr umí i záznam takže pro.me výhra :) |
|
|
Krteček1 |
Ahoj, zkusím ti ukázat, jak se toho dá jednoduše hlídat daleko více....
Typicky po vypnutí světel výrazně stoupá vlhkost doporoučuji pohledat info o VPD (vapor pressure deficit), ale radši se ale nebudu sázet, jestli se mi to povede :-). Je supr, že dnes jsou již k dispozici řešení, jako to které píšeš. Má to ale několik nevýhod lhavně omezené možnosti a co mne štve nejvíc je nutnost používat internet! Což vzhledem k zaměření tohoto fora není uplně k přehlédnutí...
Já jsem se před lety dostal k arduinu náhodou, třeba toto vlákno někoho nakopne... Dnes jsem našel zajímavou cestu jak se do toho rychle dostat, je teĎ na Udemy v akci následující kurz za 9.99 euro!! Kde je dle lidí co mi o tom řekli vše velmi hezky a srozumitelně vysvětleno... Akorát je to v Angličtině.
https://www.udemy.com/share/101WQ0CEseeFZXTHg=/
Jsem rád, že jsi sem přispěl vidím že sem nechodím sám:-). Začnu to tu pomalu ale jstě plnit. Budu rád když sem budou olidé psát svoje postřehy, nápady i připomínky, žádný dotaz či návrh není hloupý, třeba spolu na něco přijdeme.
_Ještě chci zmínit,že se v této sekci již nachází velmi kvalitní vlákno o vývoji daleko sofistikovanějšího systému, z kterého jsem i já čerpal. Toto vlákno má cíl odlišný - vybudovat systém velmi jednoduchý, funkční a levný - pokud chcete již systém hotový a funkční dopoporučuji do R-Manova vlákna zavítat, navíc by jste i v této nelehké době podpořili českého výrobce.
Mír všem. |
|
|
Krteček1 |
Pár slov k technice a postupu:
každou součástku nejprve zapojím a zprovozním na Arduino Uno, vedle mám ještě větší arduino mega s několika nepájivými poli, kde budu celý systém postupně montovat, uvidíme kde se to zastaví, až budeme všichni spokojeni, navrhnu a nechám si vyrobit plošný spoj, stojí to několik dolarů z JLCPCB - kdo bude na konci chtít může se přidat.
Vždy po zprovoznění další součástky zveřejním program. Budu to psát schválně co nejjednodušeji, procedurálně, aby to bylo schopno číst co nejvíce lidí, finální verzi potom mohu udělat i v sofistikovanější podobě. |
|
|
Krteček1 |
DHT 22 poskytuje dostatečně přesné informace o teplotě a vlhkosti a jsou pro něj k dispozici i knihovny, které činí jeho použití velmi jednoduché, dnes si jej zapojíme a a změřené hodnoty vypíšeme po seriové, lince, dalšími kroky budou připojení displaye a použití relé ke spínání ventilace (odtah a event i přítah).
Návod včetně zapojení toho modulu je velmi hezky zpracován například v odkazu:
https://navody.arduino-shop.cz/navo...nzor-dht11.html
Já jsem nejdříve v Arduino IDE zvolil sketch - include library - manage libraries, do vyhledávacího okénka jsem napsal "DHT" a zvolil knihovnu od Adafruit a nainstaloval včetně všeho co to chtělo nainstalovat k tomu. (nevadí že senzor máte od někoho jiného).
poté jsem to zapojil jak je na mé fotografii a nahrál následující program.
#include "DHT.h"
#define DHTPIN 2 // digit pin kde je připojen senzor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
// načte vlhkost
float t = dht.readTemperature();
// načte teplotu
// zkontroluje zda jsou hodnoty vpořádku ISNAN = is not a number.
if (isnan(h) || isnan(t)) {
Serial.println("Chyba načítání dat ze senzoru.");
return;
}
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.println(F("°C "));
delay (1000);
}
-----------------------------------------------------------
Poté stačí již jen zvolit Tools - serial monitor a v pravidelném intervalu se mi vypisují hodnoty jako na fotce.
Gratuluji si, po hodinovém snažení jsme vyrobil teploměr :-)
V příště přidámě 4 řádkový I2C display.
|
|
|
Krteček1 |
Tak jsem právě zjistil, že lze přiložit jen jedna fotografie k příspěvku, ptoro přikládám zbylé níže |
|
|
Krteček1 |
Tak lze k příspěvku přidat jen jednu fotografii, takže zbytek postnu níže.
edit: To sluníčko kreslily děti :-). |
|
|
Pavel.k77 |
Ahoj Krtečku. Rád budu toto vlákno sledovat. Jen otázka. Nebylo by lepší místo Una nebo megy použít ESP? Já ho používám na měření teploty a vlhkosti s tím, že mi data posílá na thigspeak. |
|
|
Krteček1 |
Ahoj Pavle,
1) Děkuji za zajímavý námět, já s thingspeak nemám žádné zkušenosti, nechceš nám o tom napsat příspěvek? Určitě to bude přínosné.
2) A teď proč to alespoň ze začátku nechci :-).:
Asi jsem paranoidní, ale myšlenka, že svá data takto posílám na server někam do zahraničí se mi prostě nelíbí. Klidně si takto budu třeba sledovat hladinu vody v jezírku na zahrádce, ale pro naše účely jsem zastánce spíše offline řešení, například s rozšířením, které ti pošle sms v definovaných případech. Když už bych to chtěl dát na internet, tak bych to řešil cestou svého vlastního serveru, například via raspberry pi, a dával bych si pozor jaké informace zpřístupním na netu... Ale samozřejmě jakmile je něco připojené vždy ti to ,když někdo bude chtít, prolomí. A co když ti spadne internet?
A hlavně budeme potřebovat hodně pinů :-).
Budu moc rád, když sem budete psát Vaše nápady a řešení a těším na tvoji zprávu jak jsi to u sebe vymyslel.
Ať to roste! |
|
|
Pavel.k77 |
Ahoj Krtečku. Až sednu k PC tak sem přidám klidně kód který mám na ESP. To mi posílá na thigspeak každých 5 minut pouze teplotu a vlhkost z boxu. Takže mám neustálou kontrolou na telefonu. Samozřejmě bych přez veřejné služby nepoužíval vzdálený přístup k úplnému ovládání. Ale monitoring teploty a vlhkosti si myslím není nijak nebezpečný. Je mi jasné, že mega je na takové věci lepší ohledně množství volných pinů. Můžeš napsat aspoň seznam co máš v plánu vše připojit a řídit? Díky.
Večer sem ještě napíšu. |
|
|
Krteček1 |
Supr, nechtělo by se ti přihodit i fotku těch grafů z thingspeaku?:-) |
|
|
Krteček1 |
Na otázku co vše mám v plánu připojit ještě jasnou odpověď nemám, doufám že na tohle téma tady proběhne diskuze co by se komu hodilo ale v nejbližší době uvažuji o:
několika relé - ovládání světla, větrání a dalších zařízení na 220v
modulu reálného času a fotodiodě - poznáme pokud se rozbije světlo
senzorech vody - poznáme pokud nám to někde vyteče
přidání několika tlačítek na ovládání, možná i potenciometrů....
měření množství roztoku v zásobníku ultrazvukem
senzor vlhkosti půdy/substrátu??
a dál je to na nás - senzor kouře, CO2, Ph,Ec....
+ evet reakce - peristaltický motor ke korekci + čerpadélko na zamýchání....
GSM modul k posílání sms při problémech....
objednal jsem i modul s laserovým parskem - na zloděje , nebo třeba když kytka přeroste - jen nevim jestli by ji to nespalilo :-)
otevírání/zavírání dveří/oken krokovým motorem, nebo menších otvorů servomotorem??
A možná bych nakonec připojil ethernet shield a zkusil i ten thingspeak - dal jsi mi brouka do hlavy :-)
Budu rád když sem budete všichni psát co by se Vám hodilo. Ne všechno umim, ale věřím, že společně vymyslíme ledacos.
Ještě otázka ohledně thingspeaku - je tam napsáno že v režimu zdama mužeš uložit 1 hodnotu každých 15 sekund, lze to udělat i tak, že třeba uložíš 4 hodnoty najednou a potom minutu nic? |
|
|
Pavel.k77 |
Tady jsou grafy. Je to screenshot z telefonu. Mají svou app. S widgetem.Foto jde jen jedno k příspěvku. Je tam vidět teplota a vlhkost v různých časových intervalech. |
|
|
Krteček1 |
Nyní připojíme display.
Displejů je mnoho druhů, já chtěl jednoduchý, dobře čitelný, levný s pokud možno co nejjednodušším zapojením. Nakonec jsem zvolil LCD 20*4 (4 řádky po dvaceti znacích)s připojením pomocí I2C (toto je důležité, vysvětlím později) . Lze koupit například zde:
https://www.aliexpress.com/item/328...earchweb201603_
nebo zde:
https://arduino-shop.cz/arduino/142...e-pocitace.html
Mimochodem je to to samé, ty české ceny opravdu někdy nechápu.
Protokol I2C má pro mne 2 zásadní výhody - jsou potřeba jen 2 dráty (+ napájení, vs 4 -6 u klasických displejů) a hlavně,jak jednou I2C použiji, mohu na něj připojit až 127 periferií vše pouze z oněch 2 drátů, takže budeme moci přidávat displeje a další I2C příslušenství bez nároku na piny Arduina, já hamoun toho mam na Arduino mega malo...
Krásný návod a odisplejích je zde (i2c displej začíná někde v půlce cca).
https://dronebotworkshop.com/lcd-displays-arduino/
Dál jsem postupoval podle toho návodu, stáhl jsem a přidal knihovnu https://bitbucket.org/fmalpartida/n...stal/downloads/ - poslední verzi, pomocí programu viz návod jsem určil I2C adresu - byla jiná než psal prodejce, zkopíroval jsem zkušební kod a jelo to.
Vzadu na displeji je malý potenciometr - křížový šroubek - tím jsem vyladil jas aby byl displej čitelný, před vyladěním to vypadalo skoro jako by nic nezobrazoval, jen tak divně svítil.
Potom jsem si vypsal funcke které budu používat.
lcd.clear() - vymaže displej
lcd.setCursor(0,3) - (znak, radek) - nastavi pozici kursoru / prvni znak i radek ma pozici 0. (zacatek je tedy 0.0);
lcd.print("Powered by Krtek") - vypise obsah v uvozovkach
lcd.backlight() - zapne podsviceni
lcd.noBacklight() - vypne podsviceni
lcd.autoscroll() - posouvani znaku / nefungovalo mi to spravne
lcd.noAutoscroll() - vypnuti posouvani
tech funkci je vice, ale já to chci jen na zobrazování textu.... Na začátku je potřeba napsat nekolik veci viz návod / v těch jsem upravil I2C adresu a rozlišeni displeje z 16*2 na 20*4, nic více není potřeba dělat.
Přikládám schéma zapojení já mám piny SCL a SDA na uno vyvedeny i na pinech nad pinem 13, tak jsem to zapojil tam. |
|
|
Krteček1 |
Potom jsem to přendal na Mega, výsledný kod postuji níže, snažím se vyhnout pointerum, referencím, objektum, funkcim, headerum atd, asi to nepujde navždy, ale budu se snažit.
Dovolil jsem si naší mašinku pojmenovat Krtek :-)
Nechávám údaje duplicitně posílat i po serialu, hodí se to při hledání chyb - debugování. Základní arduina nemají debugavací čip.
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 // digit pin kde je připojen senzor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// Define LCD pinout
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int i2c_addr = 0x27; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Nastavte Vasi I2C Adresu!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
float t {};
float h {};
void setup() {
Serial.begin(9600);
lcd.begin(20,4); // rozliseni Vaseho displeje
dht.begin();
lcd.print("Krtek je ve strehu.");
}
void loop() {
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Chyba načítání dat ze senzoru.");
return;
}
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.println(F("°C "));
lcd.setCursor(0,1);
lcd.print("T: ");
lcd.print(t);
lcd.print("c H: ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Jeste zbylo misto.");
lcd.setCursor(0,3);
lcd.print("Aktualizace po 60s");
delay (60000);
}
Příště připojíme relé a budeme větrat v dle aktuální teploty a vlhkosti. |
|
|
Krteček1 |
Pavel: Supr, diky, sikovna vec.
Uvažuji, že si koupim raspberry pi, zlepším se v pythonu, naistaluji tam něaký MQTT server a vyrobím si něco podobného sám... To raspberry by byl takový hlavní uzel, casem chci mit arduino i u slepic kraliku a tak a vse se bude zbihat doma v tom raspberry... |
|
|
Krteček1 |
Dobrý večer,
dnes bude malá změna, zapojíme si fotodiodu a budeme kontrolovat (v kombinaci s modulem reálného času, který připojíme později )zda nám v boxe svítí světlo když má, a zda nám třeba v noci nevniká do boxu parazitární světlo, které nechceme, je to velmi jednoduché, levné a užitečné.
Přidání relé jsem nucen odložit, nestačil jsem Vám vyfotit svoji skříň se dvěma zásuvkama.
A teď už k té fotodiodě, pro: začátečníky - velmi jednoduchá součástka, která mění odpor podle množství světla, které na ní dopadá, to potom můžeme změřit pomocí 10ti bitového analogového pinu Arduina, který nám vyhodí hodnotu od 0 do 1023. Ve výsledku tedy víme nejen to, že na diodu dopadá světlo, ale i kolik ho je, což se nám bude hodit při řízení.
Například si změřím že s plně zapnutým světlem je hodnota kolem 1000, pokud druhý den bude hodnota kolem 400, vím že je něco špatně....Zrovna tak když zjistím že v noci, kdy chci úplnou tmu se drží světlo na hodnotě třeba kolem 80, vím, že mi tam někudy vniká světlo z venku a mohu podniknout příslušné kroky.
Koupit lze například zde, 20ks za 0.7 dolaru :-)
https://www.aliexpress.com/item/327...earchweb201603_
Zapojení je velmi jednoduché, jednu nožičku zapojíme na + a druhou zapojíme na analogový pin arduina ( u arduino uno je to A0 - A5), dále ještě druhou nožičku zapojíme na gnd přezn 10Kohm resistor, viz obrázek.
V programu potom jen analogově načteme příslušný pin a získáme příslušnou hodnotu. Čili jednoduchý kod, který po serial portu vypíše naměřenou hodnotu může vypadat například následovně.
const int fotoresistor = A0;
void setup() {
pinMode(fotoresistor, OUTPUT);
Serial.begin(9600);
}
void loop() {
int mnozstvi_svetla;
mnozstvi_svetla = analogRead(fotoresistor);
Serial.println(mnozstvi_svetla);
delay (1000)
} |
|
|
Krteček1 |
Potom jsem fotodiodu přesunul na Mega a naměřenou hodnotu prozatím zobrazuji na displeji.
Kod po přidání fotodiody vypadá následovně.
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
const int DHTPIN {2}; // digit pin kde je připojen senzor
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int i2c_addr = 0x27;
const int fotodioda = A15; //pin kde je připojen fotoresistor
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
float t {};
float h {};
int mnozstvi_svetla{};
void setup() {
Serial.begin(9600);
lcd.begin(20,4);
dht.begin();
lcd.print("Krtek je ve strehu.");
}
void loop() {
h = dht.readHumidity();
t = dht.readTemperature();
mnozstvi_svetla = analogRead(fotodioda);
if (isnan(h) || isnan(t)) {
Serial.println("Chyba načítání dat ze senzoru.");
return;
}
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F("svetlo: "));
Serial.println(mnozstvi_svetla);
lcd.setCursor(0,1);
lcd.print("T: ");
lcd.print(t);
lcd.print("c H: ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Svetlo(0-1023): ");
lcd.print(mnozstvi_svetla);
lcd.setCursor(0,3);
lcd.print("Aktualizace po 60s");
delay (60000);
}
v pokoji při zhasnutém světle, vyplém PC a zatažených žaluziích jsem změřil hodnotu 3, při běžném osvětlení 100, a když jsem na rezistor svítil zblízka mobilem hodilo to kolem 750.
Tak a příště, pokud to stihnu, bude již relé, v opačném případě modul reálného času. |
|
|
Krteček1 |
Tak jsem tu zase a jak jsem slíbil, dnes připojíme modul reálného času.
Doma mám k dispozici modul DS1302, tak jsem jej použil. Nicméně po chvíli hledání na netu jsem zjistitl, že lze sehnat i lepší v podobné cenové relaci. DS3231 má vlastní krystal zabudovaný přímo v čipu, navíc s teplotní kompenzací, a hlavně na něl exsitují kvalitní a jednoduše použitelné knihovny, takže jsem dnes objednal i ten a až bude k dispozici budu již nadále používat jen ten - potom to zde updatuji. Navíc se připojuje přez I2C, čili ušetříme 3 piny.
https://www.aliexpress.com/item/328...earchweb201603_
Po chvíli bezmoci se mi nakonec podařilo přivést na rozumnou řeč i DS1302 a to následovně.
VCC jsem připojit na 5v arduina.
GND - //- GND
SCLK -//- pin 5
1/0 (DATA) -//- pin 4
RST -//- pin 2
Problém byl najít knihovnu která data (hodiny, sekundy atd...) poskytla jednoduše jako int (aby se s tím dalo dále pracovat a používat v rozhodovacích algoritmech). Nakonec jsem našel tuto.
https://github.com/chrisfryer78/ArduinoRTClibrary
návod na import knihovny zde:
https://navody.arduino-shop.cz/zaci...o-knihovny.html
přidal jsem ji do arduino IDE a následně použil kod příkladu 1 (file, examples, arduinoRTClibraryMaster) a vyjel následující zkušební kod, jediné co je potřeba změnit je aktuální datum a čas, linak s jejich nastavením se použije jen jednou, modul má baterii, funguje i po restartu či odpojení proudu - a to je také důvod, proč jej přidáváme do našeho projektu. Může být klidně 3 dny blackout a hned jak se arduino zapne spojí se s DS 1302 a hned ví přesný datum a čas.
#include <virtuabotixRTC.h>
// Creation of the Real Time Clock Object
virtuabotixRTC myRTC(5, 4, 2);
void setup() {
Serial.begin(9600);
// Set the current date, and time in the following format:
// seconds, minutes, hours, day of the week, day of the month, month, year
// myRTC.setDS1302Time(00, 24, 18, 1, 18, 5, 2020); // - Při prvním zpuštění zapsat správné hodnoty a odstranit "//"znaky na začátku řádku, poté již navždy "//" vrátit.
}
void loop() { //|
// This allows for the update of variables for time or accessing the individual elements. //|
myRTC.updateTime(); //|
//|
// Start printing elements as individuals //|
Serial.print("Current Date / Time: "); //|
Serial.print(myRTC.dayofmonth); //|
Serial.print("/"); //|
Serial.print(myRTC.month); //|
Serial.print("/"); //|
Serial.print(myRTC.year); //|
Serial.print(" "); //|
Serial.print(myRTC.hours); //|
Serial.print(":"); //|
Serial.print(myRTC.minutes); //|
Serial.print(":"); //|
Serial.println(myRTC.seconds);
//|
// Delay so the program doesn't print non-stop //|
delay( 5000); //|
}
Poté se po otevření serial monituru začal po 5ti s vypisovat čas a datum
velmi jednoduše lze načíst jednotlivé hodnoty například:
int a {};
a = myRTC.hours;
A máme načtenou hodinu jako int hodnotu s kterou se dá normálně pracovat porovnávat atd. |
|
|
Krteček1 |
Poté jsem jako vždy přendal modul na Mega a do kodu zapracoval část, kdy hodnoty prozatím vypisuji na displeji.
Také jsem změnil zobrazení hodnot z fotodiody - přepočítává se na procenta - zabere to méně místa na displeji
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <virtuabotixRTC.h>
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
const int DHTPIN {2}; // digit pin kde je připojen senzor
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int i2c_addr = 0x27;
const int fotodioda = A15;
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
virtuabotixRTC myRTC(3, 4, 5);
float t {};
float h {};
int mnozstvi_svetla{};
void setup() {
Serial.begin(9600);
lcd.begin(20,4);
dht.begin();
lcd.print("Krtek je ve strehu.");
// nastacveni DS1302
//myRTC.setDS1302Time(00, 06, 20, 1, 18, 5, 2020);
}
void loop() {
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Chyba načítání dat ze senzoru.");
return;
}
myRTC.updateTime();
mnozstvi_svetla = analogRead(fotodioda);
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F("svetlo: "));
Serial.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
Serial.print(F("% "));
Serial.print(F("hodiny: "));
Serial.print(myRTC.hours);
Serial.print(F(" minuty: "));
Serial.print(myRTC.minutes);
Serial.print(F(" sekundy: "));
Serial.println(myRTC.seconds);
lcd.setCursor(0,1);
lcd.print("T: ");
lcd.print(t);
lcd.print("c H: ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Svit: ");
lcd.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
lcd.print("% ");
lcd.setCursor(0,3);
lcd.print("Cas: ");
lcd.print(myRTC.hours);
lcd.print(":");
lcd.print(myRTC.minutes);
delay (30000);
} |
|
|
Krteček1 |
Nějak mne to chytlo, objednal jsem senzory: CO2, Ph, EC a nějaké další součástky, ale asi bude trvat několik měsíců než dorazí.
Příště už snad přidáme ta relé.
Mám jeden nápad, udělám více verzí. První verze se bude jmenovat "Nano", poběží na Arduino nano, bude to verze základní, ale plně funkčí a podle mne pro většinu growerů dostatečná. Ještě kromě relé přidám senzor vytopení, plamene, kouře a myslím že bychom první verzi alespoň zhruba mohli mít hotovou. Uvidíme kolik zbyde volných pinů :-). Je ještě něco co by Vám po přidání výše uvedeného v základní verzi chybělo? Relé plánuji 4 kanálové. |
|
|
Krteček1 |
Ještě se mi nechtělo spát a hrál jsem si se senzorem "vyplavení". Velmi jednoduchý ale může zachránit od průšvihu.
https://www.aliexpress.com/item/328...earchweb201603_
5 jsem připojil na +5v
- jsem připojil na GND
S jsem připojil na A0
Připojil jsem to přes asi 1.5 metrů dlouhou 3linku kablík. Po zapojení na suchu odečítal 0, při dotyku vody hladina vyskočila na hodnoty kolem 200, a při plném ponoření indikační části destičky byla hodnota kolem 700.
Jako kritickou hodnotu jsem určil 100, po nahrání následujícího kódu i při dotyku hladiny serial hlásil vodu...
void setup() {
pinMode (A3, INPUT);
Serial.begin(9600);
}
void loop() {
int a = analogRead (A3);
if (a>100){
Serial.print(a);
Serial.println(" voda! ");
}
else{
Serial.println(a);
}
delay (1000);
}
Mám v plánu použít 3 krizové senzory: kouř, plamen a voda, nano má 2 interrupt piny, proto jsem tento senzor připojil na normální pin a zmíněné ponechal na požár, který mi přijde nebezpečnější. |
|
|
Pavel.k77 |
Teda Krtečku ty jsi hračička. Sleduji tvé vlákno,dost věcí mám ale čas je můj nepřítel. Jediné co mi u tvého projektu zatím chybí,je vzdálený monitoring. Ovládání ani nepotřebuji,ale ta kontrola přez telefon by se hodila. Když budu mít trochu času,tak tvůj kód prostuduji a s tvým dovolením bych ho upravil pro ESP aby data odesílal na thigspeak. |
|
|
Krteček1 |
Ahoj Pavle, jasne, to je supr napad, ale pockej asi na finalni verzi, jeste je to hodne surovy a je tam i nekolik chyb. Napriklad pokud by nefungoval dht22, cely by se to seklo, nema to menu, rozhodovaci algoritmy atd.
To esp ma stejne piny jako nano? To bys mohl udelat verzi " nano thingspeak" nechtel by ses toho ujmout?:-)
Jeste koukni na tohle:
https://store.arduino.cc/arduino-nano-33-iot
To ma i bluetooth, slo by to ovladat pres bluetooth na mobilu, udelali bychom jednoduchou apkuva usetrili bysme nekolik pinu za tlacitka.
Bylo by nutno doresit kompatibilitu s 3.3v, coz by ale slo zvladnout.
Jinak nevim jestli pojmem ovladani myslime to same, ale je potreba mit moznost napriklad nastavit pri jako vlhkosti se zapne ventilator - to bude ruzne dle rustove faze kyticek. |
|
|
Pavel.k77 |
Krtečku já používal tuto desku a ta má i 5V což je výhoda. Něco bych i dokázal sesmolit s tvou pomocí. Nejsem v tom tak dobrý jako ty a času mám fakt málo. Ani nechtěj vědět proč. 😉
Ovládání jsem myslel to, že nepotřebuji cokoliv nastavovat vzdáleně ( měnit parametry).
Tady odkaz na desku: https://m.aliexpress.com/item/32758...fefd4ea3&is_c=Y |
|
|
Krteček1 |
Aha to vypadá opravdu jednodušeji, tak schvalně co s tim svedeme :-) |
|
|
Krteček1 |
Dnes jsem přidal senzor vyplavení do Mega.
Dále už bylo potřeba zjednodušit kód, zatím jsem to vyřešil funkcemi, které jsem umístil dolu.
Rozpracoval jsem funkci "void akce_prusvih()" , kterou aktivuje senzor vyplavení, ohně nebo kouře, uvedou Krtka do krizového režimu, odešlou sms (v budoucnu), bude monitorovat krizové senzory (vyplavení, kouř, plamen) a podle toho budou adekvátně reagovat (například vypne zalévání při vytopení, vypne ventilaci a odpojí všechna elektrická zařízení při požáru atd.)
Máte někdo nějaké zkušenosti s automatickým hasicím systémem, nebo elektronicky ovládaným? Nejlépe na bázi CO2.
Kod:
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <virtuabotixRTC.h>
#include "funkce.h"
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
const int DHTPIN {2}; // digit pin kde je připojen senzor
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int LCD_i2c_addr = 0x27;
const int fotodioda = A15;
const int senzor_vytopeni = A14;
LiquidCrystal_I2C lcd(LCD_i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
virtuabotixRTC myRTC(3, 4, 5);
void setup() {
Serial.begin(9600);
lcd.begin(20,4);
dht.begin();
// nastacveni DS1302
// myRTC.setDS1302Time(00, 06, 20, 1, 18, 5, 2020);
}
void loop() {
if (analogRead(senzor_vytopeni) > 100){
akce_prusvih();
}
int t {};
int h {};
bool stav_DHT{};
nacti_DHT(t, h, stav_DHT);
int mnozstvi_svetla{};
mnozstvi_svetla = analogRead(fotodioda);
int hodiny{};
int minuty{};
int sekundy{};
nacti_RTC(hodiny,minuty,sekundy);
vypis_LCD (t, h, mnozstvi_svetla,hodiny, minuty, sekundy);
vypis_serial(t, h, mnozstvi_svetla, hodiny, minuty, sekundy);
delay (10000);
}
//**********************************definice a implementace funkci**********************
void vypis_LCD (int &h, int &t, int &mnozstvi_svetla,int &hodiny, int &minuty, int &sekundy){
if (hodiny == 0 || minuty == 0 || sekundy == 0){
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print(F("Krtek je ve strehu."));
lcd.setCursor(0,1);
lcd.print(F("T: "));
lcd.print(t);
lcd.print(F("c H: "));
lcd.print(h);
lcd.print(F("%"));
lcd.setCursor(0,2);
lcd.print(F("Svit: "));
lcd.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
lcd.print(F("% "));
lcd.setCursor(0,3);
lcd.print(F("Cas: "));
lcd.print(hodiny);
lcd.print(F(":"));
lcd.print(minuty);
lcd.print(F(":"));
lcd.print(sekundy);
}
void vypis_serial(int &h, int &t, int &mnozstvi_svetla,int &hodiny, int &minuty, int &sekundy){
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F("svetlo: "));
Serial.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
Serial.print(F("% "));
Serial.print(F("hodiny: "));
Serial.print(hodiny);
Serial.print(F(" minuty: "));
Serial.print(minuty);
Serial.print(F(" sekundy: "));
Serial.println(sekundy);
}
void nacti_RTC(int &a,int &b,int &c){
myRTC.updateTime();
a = myRTC.hours;
b = myRTC.minutes;
c = myRTC.seconds;
}
void nacti_DHT(int &a, int &b, bool &c){
a = dht.readHumidity();
b = dht.readTemperature();
if (isnan(a) || isnan(b)) {
Serial.println(F("Chyba načítání dat ze senzoru."));
a=999;
b=999;
c = 0;
}
else {
Serial.println(F("Sezor DHT funkcni."));
c = 1; }
}
void akce_prusvih(){
lcd.clear ();
do{
lcd.setCursor (0,0);
lcd.print (F(" NOUZOVY STAV!!! "));
lcd.setCursor (0,1);
if (analogRead(senzor_vytopeni) > 100){
lcd.print (F("********VODA********"));
}
delay (1000);
}
while (1>0);
} |
|
|
Krteček1 |
Tak, zatím máme zapojených 8 pinů, jedeme dál, nyní připojím 4 tlačítka a zpracuji jednoduché menu (to bude celkem 12), potom 4 kanálové relé (celkem 16), GSM modul a bude vymalováno a to mám ještě senzor teploty vody v nádrži, ultrazvukový vodotěsný senzor na výpočet množství vody v nádrži atd, holt budeme moci v základní verzi použít jen něco.
1 relé bude světlo, druhé bude ventilace a další 2 budou programovatelná. Například zvhčovač a min vlhkost pod kterou když hodnota klesne se sepne, nebo ohřev který sepne když teplota klesne pod nastavenou hodnotu, a dále bude možnost aby bylo seplé stále a fungovalo jako normální zásuvka.
Nápady a připomínky jsou vítány.
Něco jiného co by jste potřebovali připojit kromě topítko vzduchu, ochlazování vzduchu, topítko vody, ochlazování vody, zvlhčovač, odvlhčovač a ofuk? |
|
|
Pavel.k77 |
Jen taková technická. Měl jsem ultrazvukové čidlo vodotěsné na hlídání hladiny ve studni. Po cca 3 měsících odešlo do křemíkového nebe. Nevím jaký rozptyl hladiny chceš používat ale řešil bych to jinak. Možností je více. Já to ve studni řešil pomocí potenciometru který je napojený na mechanické měření hladiny. Ale já mám rozptyl 1,5 m. U hladiny která má rozptyl v řádu centimetrů bych to řešil jinak. |
|
|
Krteček1 |
Tak a jedeme dál, nyní si zapojíme modul se 4mi tlačítky.
Mám něco podobného jako tento modul:
https://www.aliexpress.com/item/330...earchweb201603_
zapojil jsem to jednoduše:
gnd na gnd arduina
K1 na pin 12
K2 na pin 11
K3 na pin 10
K4 na pin 9
po nahrání následujícího kódu se mi na serial monitoru zobrazila 1, pokud tlačítko nebylo zmáčknuté a 0 pokud bylo.
V kódu jsem u pinMode místo INPUT použil INPUT_PULLUP, není potom potřeba dávat rezistory ale ukazuje to naopak. (1, když tlačítko není stisklé).
Na fotografii je stisklé 1. a druhé tlačítko.
void setup() {
Serial.begin (9600);
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
}
void loop() {
Serial.print (digitalRead(12));
Serial.print (" ");
Serial.print (digitalRead(11));
Serial.print (" ");
Serial.print (digitalRead(10));
Serial.print (" ");
Serial.print (digitalRead(9));
Serial.println (" ");
delay (1000);
}
Nojo toto sice funguje, ale máme spotřebovány 4 piny, vzpomněl jsem si na jeden zlepšovák. |
|
|
Krteček1 |
Pavle: Mechanicklé čidlo na rozptyl 1.5 metru?:-) To musim vidět, postni sem prosím někdy fotku....
Počítám že to bude pro nádoby v rozmezí cca 10 - 1000l (ale může být vlastně jakákoliv velikost), jak bys to řešil ty? Je potřeba aby si to mohl každý jednoduše nakalibrovat na jakýkoliv tvar a objem.... ten ultrazvuk by se jen zapojil, změřil by prázdný, potom by změřil plný sud a když mu řekneš kolik tam je litrů, jednoduše si to spočte....fungovat do bude jen na nádoby které se směrem nahoru nerozšiřují, nebo nezužjí, ale přijde mi to elegantní. |
|
|
Krteček1 |
Někde jsem viděl, že když zapojily několik tlačítek na jeden analogový pin přez několik rezistorů, potom každé tlačítko dávalo jinou hodnotu, čímže se dá na jeden pin připojit několik tlačítek, já mám 10Kohm; 4,6Kohm; 1Kohm; 220Ohm
Návod je třeba zde, dnes to už nedodělám :-)
https://www.instructables.com/id/Ho...Pin-Arduino-Tu/ |
|
|
Krteček1 |
Tak jsem to vyzkoušel a funguje to, zapojeno je to viz obrázek.
K1 přez 10Komh rezistor na +5V,
K2 přez 4.6 Kohm rezistor na +5v
K3 přez 1Kohm rezistoer na +5v
K4 přez 22ohm rezistor na +5V
GND na A1, kam je ještě navíc připojen GND přez 1 Kohm rezistor.
Po stisku jendotlivých tlačítek se mi vypisovaly hodnoty (843, 510, 177 a 91).
Po nahrání následujícího kódu mi funkce tlacitko(int a) vrátí číslo stisklého tlačítka, nebo 0, pokud žádné stiknuté není, nebo pokud již jednou hodnotu stisknutého tlačítka poslal. Důležité pro mne je, že to číslo stisklého tlačítka vrátí při každém stisknutí vždy jen jednou, aby nám to v menu nelílato :-).
Pro proměnnou "predchozi_stav_tlacitka" jsem zvolil "static int" udrží svoji hodnotu i po ukončení funkce.:
void setup() {
Serial.begin (9600);
pinMode(A1, INPUT);
}
void loop() {
int a {};
tlacitko(a);
Serial.println (a);
delay (500);
}
void tlacitko(int &a){
static int predchozi_stav_tlacitka{};
int stav_tlacitka{};
int nactena_hodnota{};
nactena_hodnota = analogRead (A1);
if (nactena_hodnota > 820 && nactena_hodnota <855 ){
stav_tlacitka = 1;
}
else if (nactena_hodnota> 490 && nactena_hodnota < 530){
stav_tlacitka = 2;
}
else if (nactena_hodnota> 157 && nactena_hodnota < 197){
stav_tlacitka = 3;
}
else if (nactena_hodnota> 71 && nactena_hodnota < 111){
stav_tlacitka = 4;
}
else if (nactena_hodnota< 50){
stav_tlacitka = 0;
}
if (stav_tlacitka != predchozi_stav_tlacitka){
if (stav_tlacitka > 0){
a = stav_tlacitka;
}}
else { a= 0;}
predchozi_stav_tlacitka = stav_tlacitka;
stav_tlacitka = 0;
}
výpis vypadá následovně....
Nic není stištěno ..............................: 0 0 0 0 0 0 0 0 0
krátce stisknu tlačítko 4....................: 0 0 0 4 0 0 0 0
držím tlačítko 4 ...............................: 4 0 0 0 0 0 0 0
Takže jsem ušetřil 3 piny a mohu si zase vymýšlet :-)
|
|
|
Pavel.k77 |
Ahoj Krtečku. Tady dávám foto toho hladinového měření. Místo ručičky je daný potenciometr a Arduino bere signál na analogovém pinu a přepočítá na výšku hladiny. |
|
|
Pavel.k77 |
Ještě jedno foto už upraveného měřáku. |
|
|
Krteček1 |
To je skvělý! Díky.
Ještě otázka,myslíš že sem chodí ještě někdo jiný než my dva?.-) |
|
|
Pavel.k77 |
Nevím. Podle počtu zobrazení možná ano a čekají na finální verzi. Škoda, že se nezúčastní konverzace.
Kdyby aspoň někdo,kdo sleduje přidal aspoň návrh co a jak zlepšit nebo doplnit. |
|
|
Krteček1 |
Před chvílí jsem přendal tlačítka na MEGA a bylo potřeba je znovu nakalibrovat, přemýšlím teď nad menu, co vše by mělo obsahovat.
Moje nápady:
1) zvolit co jsem připojili na 2 volná relé a mít možnost tyto přístroje libovolně měnit.
bude možnost zvolit i možnost stále sepnuto, stále vypnuto.
2) nastovavat hodnoty sepnutí a vypnutí všech spotřebičů - například odtah zapnout
když je vlhkost nad 60 a větrat dokud neklesne alespoň o 10. čas spínání světel atd
zvlhčovačku když je vlhkost pod 50 a vypnout při 70ti atd.
Napadá Vás další užitečná funkce? |
|
|
Krteček1 |
citace: |
Původní příspěvek od Pavel.k77
Nevím. Podle počtu zobrazení možná ano a čekají na finální verzi. Škoda, že se nezúčastní konverzace.
Kdyby aspoň někdo,kdo sleduje přidal aspoň návrh co a jak zlepšit nebo doplnit. |
Ano, proto se tu s tím píšu. |
|
|
Pavel.k77 |
Já jedu ventilátory TT. Jsou dvourychlostní bez regulace. Takže by se mi hodilo,aby jedno relé spinalo jednu rychlost a druhé relé spinalo druhou rychlost. V dalším příspěvku přidám svůj kód na thigspeak. |
|
|
Pavel.k77 |
#include <DHT.h>
#include <ESP8266WiFi.h>
// replace with your channel's thingspeak API key,
String apiKey = "YOUR_PUSH_API";
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASS";
const char* server = "api.thingspeak.com";
#define DHTPIN 4 // D2 pin on Nodemcu
DHT dht(DHTPIN, DHT22, 11);
WiFiClient client;
void setup() {
Serial.begin(115200);
delay(10);
dht.begin();
WiFi.begin(ssid, password);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature(true);
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
String postStr = apiKey;
postStr +="&field1=";
postStr += String((int)t);
postStr +="&field2=";
postStr += String((int)h);
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celcius Humidity: ");
Serial.print(h);
Serial.println("% send to Thingspeak");
}
client.stop();
Serial.println("Waiting...");
// time between updates
delay(120000); // 2 mins
} |
|
|
Krteček1 |
Jednoduché a elegantní. |
|
|
Krteček1 |
Zapojil jsem vše dle návodu
červený a černý vodič jsem zapojil na GND
žlutý na pin 4, kam jsem ještě přez 4.7 Kohm rezistor zapojil 5v
(viz návod a fotka)
Potom je potřeba nainstalovat 2 knihovny viz návod.
DallasTemperature jsem získal v Tools - mamage libraries, ale OneVire jsem musel stáhnout z odkazu a přidat přez - sketch - include library - add zip file.
Potom jsem nahrál zkušební kód a výstup byl následující, ověřil jsem že získání teploty opravdu trvá cca 0.8 sekundy, v Krtkovi musím ohlídat aby se tato teplota načítala v nějakých rozumných intervalech. Hodnota čas zobrazuje počet milisekund od zapnutí.
Teplota cidla DS18B20: 17.87 stupnu Celsia
cas825
Teplota cidla DS18B20: 17.87 stupnu Celsia
cas1605
Teplota cidla DS18B20: 17.94 stupnu Celsia
cas2384
Teplota cidla DS18B20: 17.94 stupnu Celsia
cas3165
Také se mi stalo, že když jsem se senzorem manipuloval, párkrát mi teploměr vrátil teplotu "-127 ", to také pro jistotu ošetřím softwarově.
#include <OneWire.h>
#include <DallasTemperature.h>
// nastavení čísla vstupního pinu
const int pinCidlaDS = 4;
// vytvoření instance oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS);
// vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);
void setup(void) {
// komunikace přes sériovou linku rychlostí 9600 baud
Serial.begin(9600);
// zapnutí komunikace knihovny s teplotním čidlem
senzoryDS.begin();
}
void loop(void) {
// načtení informací ze všech připojených čidel na daném pinu
senzoryDS.requestTemperatures();
// výpis teploty na sériovou linku, při připojení více čidel
// na jeden pin můžeme postupně načíst všechny teploty
// pomocí změny čísla v závorce (0) - pořadí dle unikátní adresy čidel
Serial.print("Teplota cidla DS18B20: ");
Serial.print(senzoryDS.getTempCByIndex(0));
Serial.println(" stupnu Celsia");
// pauza pro přehlednější výpis
//delay(1000);
Serial.print("cas");
Serial.println(millis());
} |
|
|
Krteček1 |
Po přenesení na Mega jsem teploměr zapojil na pin 52 a naměřenou hodnotu vypisuji na LCD na řádku 3, a pro event kontrolu je posílám i přez serial.
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <virtuabotixRTC.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "funkce.h"
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
const int DHTPIN {2}; // digit pin kde je připojen senzor
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int LCD_i2c_addr = 0x27;
const int pinCidlaDS18B20 = 52;
const int fotodioda = A15;
const int senzor_vytopeni = A14;
LiquidCrystal_I2C lcd(LCD_i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
virtuabotixRTC myRTC(3, 4, 5);
OneWire oneWireDS18B20(pinCidlaDS18B20);
DallasTemperature senzoryDS18B20(&oneWireDS18B20);
void setup() {
Serial.begin(9600);
lcd.begin(20,4);
dht.begin();
senzoryDS18B20.begin();
// nastacveni DS1302
// myRTC.setDS1302Time(00, 06, 20, 1, 18, 5, 2020);
}
void loop() {
if (analogRead(senzor_vytopeni) > 100){
akce_prusvih();
}
int stav_tlacitka{};
tlacitko(stav_tlacitka);
if (stav_tlacitka >0){
menu();
}
int t {};
int h {};
bool stav_DHT{};
nacti_DHT(t, h, stav_DHT);
int mnozstvi_svetla{};
mnozstvi_svetla = analogRead(fotodioda);
int hodiny{};
int minuty{};
static int predesle_minuty;
int sekundy{};
nacti_RTC(hodiny,minuty,sekundy);
static int teplota_vody{};
if (minuty != predesle_minuty){
senzoryDS18B20.requestTemperatures();
teplota_vody = senzoryDS18B20.getTempCByIndex(0);
}
vypis_LCD (t, h, mnozstvi_svetla,hodiny, minuty, sekundy, teplota_vody);
vypis_serial(t, h, mnozstvi_svetla, hodiny, minuty, sekundy, stav_tlacitka, teplota_vody);
delay (1000);
predesle_minuty = minuty;
}
//**********************************definice a implementace funkci**********************
void vypis_LCD (int &h, int &t, int &mnozstvi_svetla,int &hodiny, int &minuty, int &sekundy, int &teplota_vody){
if (sekundy == 0){
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print(F("Krtek je ve strehu."));
lcd.setCursor(0,1);
lcd.print(F("T:"));
lcd.print(t);
lcd.print(F("c H:"));
lcd.print(h);
lcd.print(F("% "));
lcd.print(F("Svit:"));
lcd.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
lcd.print(F("%"));
lcd.setCursor(0,2);
lcd.print (F("Tv:"));
lcd.print(teplota_vody);
lcd.print (F("c"));
lcd.setCursor(0,3);
lcd.print(F("Cas: "));
lcd.print(hodiny);
lcd.print(F(":"));
lcd.print(minuty);
lcd.print(F(":"));
lcd.print(sekundy);
}
void vypis_serial(int &h, int &t, int &mnozstvi_svetla,int &hodiny, int &minuty, int &sekundy, int &stav_tlacitka, int &teplota_vody){
Serial.print(F("Vlhkost: "));
Serial.print(h);
Serial.print(F("% Teplota: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F("svetlo: "));
Serial.print(map (mnozstvi_svetla, 0, 1023, 0, 100));
Serial.print(F("% "));
Serial.print(F("hodiny: "));
Serial.print(hodiny);
Serial.print(F(" minuty: "));
Serial.print(minuty);
Serial.print(F(" sekundy: "));
Serial.print(sekundy);
Serial.print(F(" stav tlacitka: "));
Serial.print(stav_tlacitka);
Serial.print(F(" teplota vody: "));
Serial.println(teplota_vody);
}
void nacti_RTC(int &a,int &b,int &c){
myRTC.updateTime();
a = myRTC.hours;
b = myRTC.minutes;
c = myRTC.seconds;
}
void nacti_DHT(int &a, int &b, bool &c){
a = dht.readHumidity();
b = dht.readTemperature();
if (isnan(a) || isnan(b)) {
Serial.println(F("Chyba načítání dat ze senzoru."));
a=99;
b=99;
c = 0;
}
else {
Serial.println(F("Sezor DHT funkcni."));
c = 1; }
}
void akce_prusvih(){
lcd.clear ();
do{
lcd.setCursor (0,0);
lcd.print (F(" NOUZOVY STAV!!! "));
lcd.setCursor (0,1);
if (analogRead(senzor_vytopeni) > 100){
lcd.print (F("********VODA********"));
}
delay (1000);
}
while (analogRead (A0)<30);
}
void tlacitko(int &a){
static int predchozi_stav_tlacitka{};
int stav_tlacitka{};
int nactena_hodnota{};
nactena_hodnota = analogRead (A0);
if (nactena_hodnota > 820 && nactena_hodnota <860 ){
stav_tlacitka = 1;
}
else if (nactena_hodnota> 510 && nactena_hodnota < 550){
stav_tlacitka = 2;
}
else if (nactena_hodnota> 180 && nactena_hodnota < 220){
stav_tlacitka = 3;
}
else if (nactena_hodnota> 80 && nactena_hodnota < 120){
stav_tlacitka = 4;
}
else if (nactena_hodnota< 50){
stav_tlacitka = 0;
}
if (stav_tlacitka != predchozi_stav_tlacitka){
if (stav_tlacitka > 0){
a = stav_tlacitka;
}}
else { a= 0;}
predchozi_stav_tlacitka = stav_tlacitka;
stav_tlacitka = 0;
}
void menu(){
lcd.clear();
lcd.print(F("********MENU********"));
delay(3000);
}
|
|
|
Krteček1 |
Teď jenom krátká poznámka.
Arduino má EEPROM paměť, velmi hezky vysvětleno je to zde:
https://www.youtube.com/watch?v=ShqvATqXA7g
Ve zkratce je to paměť kde in formace přetrvají i po odpojení arduina od proudu, v pokojových podmínkách udrží informace zhruba 10 let. Má omezenou životnost, zhruba 100 000 přepisů.
Budu jí používat na uložení nastavených hodnot, abychom to nemuseli nastavovat po každém spuštění znovu a uvidíme zda se najde i nějaké další využití.
je potřeba nahoře zahrnout knihovnu:
#include <EEPROM.h>
Její velikost lze zjistit příkazem
EEPROM.length()
Moje Nano má 1024 KB, čili 1024 * můžeme zapsat hodnotu 0 - 255.
Dále jsem si vypsal příkazy
EEPROM.update(val ,adr);
EEPROM.read(ard);
Kdo potřebuje dá sei dokoupit externí, připojuje se přez I2C a má řádově větší velikosti. napříkald zde:
https://www.aliexpress.com/item/400...earchweb201603_ |
|
|
Pavel.k77 |
Teď jsem si všiml tvé otázky.
Na thigspeak můžeš zdarma poslat za jeden rok určitý počet hodnot (dát). Jde o to,že vlastně posíláš jednu zprávu ve které posíláš třeba 10 hodnot do 10 grafů. Vše v jednom kanále a to je právě to omezení. Snad jsem to vysvětlil dobře. Takže když pošleš °C,H,%CO,Lux,atd v jedné zprávě tak je to bráno jako jedna zpráva. Max za rok je to v přepočtu defakto jednou za 4 minuty.
citace: |
Původní příspěvek od Krteček1
Na otázku co vše mám v plánu připojit ještě jasnou odpověď nemám, doufám že na tohle téma tady proběhne diskuze co by se komu hodilo ale v nejbližší době uvažuji o:
několika relé - ovládání světla, větrání a dalších zařízení na 220v
modulu reálného času a fotodiodě - poznáme pokud se rozbije světlo
senzorech vody - poznáme pokud nám to někde vyteče
přidání několika tlačítek na ovládání, možná i potenciometrů....
měření množství roztoku v zásobníku ultrazvukem
senzor vlhkosti půdy/substrátu??
a dál je to na nás - senzor kouře, CO2, Ph,Ec....
+ evet reakce - peristaltický motor ke korekci + čerpadélko na zamýchání....
GSM modul k posílání sms při problémech....
objednal jsem i modul s laserovým parskem - na zloděje , nebo třeba když kytka přeroste - jen nevim jestli by ji to nespalilo :-)
otevírání/zavírání dveří/oken krokovým motorem, nebo menších otvorů servomotorem??
A možná bych nakonec připojil ethernet shield a zkusil i ten thingspeak - dal jsi mi brouka do hlavy :-)
Budu rád když sem budete všichni psát co by se Vám hodilo. Ne všechno umim, ale věřím, že společně vymyslíme ledacos.
Ještě otázka ohledně thingspeaku - je tam napsáno že v režimu zdama mužeš uložit 1 hodnotu každých 15 sekund, lze to udělat i tak, že třeba uložíš 4 hodnoty najednou a potom minutu nic? |
|
|
|
Krteček1 |
Výborně, věřím, že když ta data budeme potom zpětně analyzovat dost se tím naučíme. A ta frekvence 4 min je naprosto dostatečná..... |
|
|
Krteček1 |
Zdravím ve spolek, makám na softwaru, přepsal jsem to vše do objektu, nějak se to rozrostlo, chci aby se dalo přez menu zvolil jaké jsme dali kam zařízení, nastavit meze a také chci aby to nebylo uplně blbé:-). Už to má přez 10stránek.
Na zkrácení čekání doporučuji tento film, dá se to stáhnout i z fastshare.cz
https://www.weedthepeoplemovie.com/ |
|
|
Stunt |
Zdravim Vás pánové.
Dneska jsem objevil toto vlákno. Taky jsem se nedávno začal zajímat o Arduino a též pomýšlím na něco podobného. Podle mě growerům asi stačí tyto automatizace a zabezpečení. Každopádně se těšim na další postup. Jen tak dál pánové |
|
|
Hydrodef |
Ahoj, taky by mě zajímalo jak to dopadlo či pokračuje :). Sice nevím čím bych vám to připomínkoval, ale ta vaše myšlenka se mi hrozně líbí! Díky :) |
|
|
Krteček1 |
Ahoj všem,
omlouvám se za výpadek. Přišlo stěhování a hodně práce a musel jsem vše zrušit. Zároveň jsem ale zjistil, že je vše o dost složitější než jsem myslel. Tento projekt vzdávám, v budoucnu ale chci jeden malý boxík postavit kde nějaké arduino také bude ale v jednodušší verzi. Rád se potom podělím.
Ať to roste
Krtek |
|
|
rel10oc |
citace: |
Původní příspěvek od Krteček1
... |
ahoj, máš dobré myšlení, ale v dnešní době kdy levna činska elektronika dominuje trhu, se s timhle nemusiš tak moc 'namahat' sám, pokud to ovšem nemáš jako zabavu, v takovém je to o jinem :D
osobně k automatizaci využivam činske produkty SONOFF, najdeš je napřiklad na smart-switch.cz, mrkni se co mají v nabidce, jsem si jistý že člověk s takovýmhle myšlením v tom najde to využit, co hledá.
mám 1 spinač co real time hlida teplotu/vlhkost, na zakladě toho se spoušti chytre zasuvky s zvlhčovačkou/odvlhčovačkou + ventilace navíc, pak mám 1 spinač na hlidani teploty hydro nadrže, nasledně zasuvku co spusti ventilator nad hladinou a nizke teploty hlida samoregulačni topne těleso, hladin vody hlidam tež, ale to mám teď nově + mam v planu napojit rovnou přivod vody do budoucna, najdeš tam toho určitě vic a konrketně tyhle produkty mohu doporučit, 100% spokojenost. Má to i aplikaci do telefonu, ale ty data mužeš skrz python třeba scrapnout a využit je jinde, ja si dělam 'grow logy' kde se mi zapisuje pruměr za časový usek do tabulky, ale to je jen taková blbinka navíc :D |
|
|
Krteček1 |
citace: |
Původní příspěvek od rel10oc
ahoj, máš dobré myšlení, ale v dnešní době kdy levna činska elektronika dominuje trhu, se s timhle nemusiš tak moc 'namahat' sám, pokud to ovšem nemáš jako zabavu, v takovém je to o jinem :D
osobně k automatizaci využivam činske produkty SONOFF, najdeš je napřiklad na smart-switch.cz, mrkni se co mají v nabidce, jsem si jistý že člověk s takovýmhle myšlením v tom najde to využit, co hledá.
mám 1 spinač co real time hlida teplotu/vlhkost, na zakladě toho se spoušti chytre zasuvky s zvlhčovačkou/odvlhčovačkou + ventilace navíc, pak mám 1 spinač na hlidani teploty hydro nadrže, nasledně zasuvku co spusti ventilator nad hladinou a nizke teploty hlida samoregulačni topne těleso, hladin vody hlidam tež, ale to mám teď nově + mam v planu napojit rovnou přivod vody do budoucna, najdeš tam toho určitě vic a konrketně tyhle produkty mohu doporučit, 100% spokojenost. Má to i aplikaci do telefonu, ale ty data mužeš skrz python třeba scrapnout a využit je jinde, ja si dělam 'grow logy' kde se mi zapisuje pruměr za časový usek do tabulky, ale to je jen taková blbinka navíc :D |
To zní zajímavě, hoď sem nějaké fotky. Mne se obecně na těhle zařízeních nelíbí, že to jede přez nějaký zahraniční server... Ale pro většinu lidí to byde určitě přijatelná a o dost jednodušší alternativa.
Jak jsi psal, mne to i baví, a zárveň se u toho učím
Ať to roste |
|
|
Krteček1 |
Dobrý den,
Jak jsem slíbíl, posílám fotky svého posledního výtvoru. Je o dost jednodušší, ale má méně možností nastavení - což pro mé účely nevadí.
Pokud někdo víte jak tu fotku otočit dejte prosím vědět :-) |
|
|
Krteček1 |
Trochu to popíšu.
Celé to pohání Arduino Nano. Připojeny jsou následující moduly:
SHT31 - celkem přesné měřené Teploty a vlhkosti vzduchu (v boxu) přez I2C.
DS3231 - model přesného času - také via I2C
DS18B20 - senzor teploty vody
MH-Z19B - senzor CO2
20*4 I2C displej
klasický přepínač - v budoucnu bude přepínat mezi přednastavenými hodnotami
klimatu pru růst a květ.
další součástky:
Plošný spoj vyrobený na zakázku v JLCPCB - pokud bude zájem rád se podělím o
nákres(gerber file), popřípadě mám jeden navíc - klidně dejte vědět.
kondenzátor na vyrovnání krátkodobých výkyvů - možná zbytečný, chtěl jsem si to zkusit :-)
screw terminals a female headers 2.54mm - ty terminály příště zvolím větší 5.08mm - neznám české ekvivalenty
tip 120 tranzistor 2* - přez rozvaděčovou skříň s SSR relé ovládání 220v světla a ventilátoru.
lineární stabilizátor napětí 78s05cv - 5v pro moduly ať zbytečně neždímám arduino
Rektifikační diaody pro ochranu proti špatnému zapojení napájení a ještě každá o tranzistoru - asi zbytečná, trochu snižuje napětí :-).
odpor 1 kohm 2* - ochrana tranzistorů, mezi nimi a ovládacími pini arduina
odpor 10kohm - pulldown k přepínačí (šlo to vyřešit i příkazem INPUT_PULLUP) |
|
|
Krteček1 |
A teď jak to funguje.
Nejdříve popíšu displej od začátku do konce.
čas
VPD (pokud nevíš googli vapour pressure defficit) - spočítaný z teploty a vhkosti vzduchu,
stav přepínače
teplota a vlhkost vyduchu
teplota vody
hodnota CO2
a stav spotřebičů - zda větrá (a jak dlouho) a zda svítí (DEN/NOC).
V současném nastavení pouze svítí podle denní doby a větrá - podle teploty a vlhkosti - právě předělávám aby to bylo podle teploty a VPD. Čili nyní načte všechny hodnoty z modulů a rozhodne zda bude svítit a větrat - ostatní hodnoty jsou zatím pouze informativní - zatím.
Nyní ještě doprogramuji druhou obrazovku se statistikami za 24 hod:
počet sepnutí ventilátoru
celková a průměrná doba větrání
kolik supnutí od teploty a kolik od VPD
max a min teplota, vlhkost a VPD
V příštích verzích chci přidat posílání dat na thingspeak. a Další funkcionality
1) Doplňování nádaže bubbleru. Budu měrit 2mi nezávislými metodami množství vody v nádrži - vodotěsným ultrozvukovým čidlem a tímto bezkontaktním XKC-Y25-V. https://dratek.cz/arduino/5005-bezk...xkc-y25-v.html. Záloha bude senzor vody na podlaze :-) https://dratek.cz/arduino/1264-senz...ro-arduino.html
Dále se bude měřit EC roztoku třeba tímto https://www.laskakit.cz/cidlo-rozpu...ek-ve-vode-tds/ . A podle hodnot bude doplňovat buď pouze PH upravenou vodu, nebo vodu s živinami ze 2 různých nádrží peristaltickými pumpami. https://grobotronics.com/peristalti...v-dc.html?sl=en
- v mém minulém pěstu před 3mi lety byl muj největší problém v rychlém kolísání hladiny i ph od tohoto si slibuji, že tyhle problémy minimálně sníží.
- chtěl jsem i korekci Ph, ale to zatím nezavedu - věřím že doplňováním hladiny se výkyvy sníží a sondy na Ph jsou drahé a nevěřím v jejich dostatečnou kvalitu - hlavně pokud by byly kontinuálně ponořené v živném roztoku. Pokud budou výkyvy opět velké zkusím spíše Torus hydro kapsli, a také mám větší rezervoár.
2) event ovládání dosycování CO2 - elektický ventil od tlakové lahve, nebo alespoň zapnutí ventilátoru při poklesu. |
|
|
Krteček1 |
Jak jsem psal výše, klidně se podělím o soubor na výrobu plošného spoje, zrovna tak mohu poskytnout program pro arduino a event jeden plošnák mám na zbyt.
Jsou uvítány všechny názory, nápady, připomínky, dotazy.
Dostávám se do problémů s RAM - knihovny jsou veliké a glob. proměnné se mi dostávají k 60ti procentům celkové RAM. Koupil jsem si arduino nano every - má dvojnásobnou Ramku, ale bohužel jsem zjistitl že není kompatibilní s některými knihovnami pro klasické arduino nano . Ten název nezvolili šťastně..... Chápu už kolegu co tu vyvíjí opravdové profi řešení, že to rozdělil na více modulů. Možná by bylo praktičtějsí mít jedno arduino nano na sbírání dat z modulů a druhé třeba nano IOT, které umí i wifi na řízení, posílání dat na Thingspeak a připojení klávesnice, ovládacích čudlíků, přepínačú a displeje. Tím jak by měl pouze jednu knihovnu pro displej bych měl vše v ovládacím modulu více pod kontrolou a hrozilo by méně záseků....
Zatím musím zaklepat modul jel 24 hodin bez problémů.
Nechci již nic slibovat aby to nedopadlo jako minule ale pokusím se během několika měsíců vyrobit další verzi.
Ať to roste. |
|
|
rel10oc |
citace: |
Původní příspěvek od Krteček1
..
|
Hoj, fotky netřeba, nic z vnitřku neuvidiš stejně :D snad jediný co to chce od tebe jako uživatele, je aby sis připojil kabel ke spinači a nasledně to sparoval s appkou v telefonu, jinak to pracuje po jejich aplikaci 'ewlink', pro simplicitu to bohatě stačí, spinač co hlidá prostředí stojí cca. 400 pak co zasavka to přistroj, ta stojí snad 250 jen, nasledně nastavíš sceny v aplikaci např RH > 70% co ti spusti zasuvku s odvlhčovačkou, atd. mrkni na ten link co sem ti dal, nebo pogoogli tu značku, ono co si budem lhat... těch firem co tohle děla je mraky, na ebay to třeba splašiš za ještě min, koukal jsem že některé zasuvky maji i voltmetr a další vychytavky ... samozřejmě co si člověk uděla sam z toho ma pak větši radost a chapu to nadšení, sám v IT pracuji :D ale tohle je tak levny a tak jednoduchy že netřeba žadne znalosti a za par korun muže i zautomatizovane prostředí relativně každý |
|
|
Krteček1 |
Skvely, kouknu a dekuji za obohaceni diskuze! |
|
|
Hruškomet |
Výborná série Krtku!
Hezky zpracovaný a vysvětlený, mám v plánu si na arduinu udělat CO 2 senzor, tak se zřejmě budu inspirovat, draslík+ |
|
|
Krteček1 |
Děkuju, mam mhz19 a funguje dobře. Jsou na něj i knihovny stažitelný přímo v arduino IDE, nebo i pwm výstup, pokud chceš ušetřit místo v ramce a event komplikace z knihovny kterou jsi nepsal. Zkoušel jsem i mhz16, ale ten se mi nepodařilo rozchodit, myslím, že přišel vadný, zkoušel jsem to i s multimetrem a nechovalo se to jak mělo, zkoušel jsem i všelijaké knihovny….
Pomocí co2 jsem ovládal větrání, ale šlo vy ovládat i dosycování CO2. Stačí mít lahev-redukční ventil-elektromagnetický ventil(např 12v ,dá se použíť třeba i z auta na přívod plynu….)
Jinak pak už je asi dobré přidat i senzor dorazu dveří aby nesytil když máš otevřeno a něco děláš (dále by nemusel sytit kdyz vetras a kdyz je tma, ale tyhle udaje uz me arduino zna)
MHZ19B Infrared Carbon Dioxide co2 gas Sensor 0-5000ppm
https://a.aliexpress.com/_ugpEXe
https://navody.dratek.cz/technikuv-...em-spinaci.html
US $5.16 7% Off | 10Pc 3D Printer Kits Endstop Mechanical Limit Switch Module Endstop Switch Horizontal Type for RAMPS 1.4 DIY Parts
https://a.aliexpress.com/_vqZSjW |
|
|
Hruškomet |
Přesně tak, plánuju ho používat jako ovládání k přisycování CO2 a také už jen tak ze zvědavosti, elektromagnetický ventil není tak drastická investice a hlavně na to nijak nespěchám, takže třeba ho do té doby seženu i jinak :) |
|
|
Kirovecz |
Plánuju použít spoustu tvých nápadů a pastupů. Hodně mě to inspirovalo a co nejdív to rozjedu, ale nevím jestli to nestavět spíš na raspbpi.
Jen palr věcí, který jsou tam třeba pro mě důležitý, ale tady nejsou zmíněný a když jo, tak to slončí u zmínky a toť vše.
Ups, při výpadku el. Určitě přepnout na nouzový chod. Primárně čerpadla pro nft. Jeden sys bude nft, jeden drip. Pripadne zalozni okruh zavlazovani pro oba systemy.
Záplavový čidla. Těch bude určitě spousty s reakcní na nouzový zastavení přívodu vody, případně
El., nouzové čerpadlo pro přečerpání vody do odpadu.
Systémy bych chtěl pomocí serv a klapek propojit, tak aby vzduch mohl kolovat pripadne kazda jet solo a co nenvic je utesnit, kvuli co2.
Jeste nemam presnou predstavu, jak to technicky procedu to utesneni sadrosovejch boxu.,.
Zapomnel jsem zminit, ze to budou dva boxy 150x150.
Low budget topení. Odporový dráty terarijní krramický žárovk jako doteď, na termostaty.
A když už tam budu mít co2, chci an něj navázat uzavření systémů, nouzový vypnuti elektriky a vody a vypusteni co2, v pripade vyhlaseni pozarniho poplachu. U tohohle bych chtel dvoji kontrolu a v pripade ze by nezabralo co2 tak spustit treba hasicak, nebo jsem videl za cca 1,2k czk naky zhaseci hadice pro serverovny.
Navic bych chtel automaticky doplnovani vody, hnojiv, ph-, a doplnovani zvlhcovacky. U dripu eazy, po vyprazdneni nadrze po nakou hladinu se dopusti voda a doplni hnojiva presne nacasovanejma cerpadlama (hnojim dle tabulek). Ale i u nft, jednou mozna aero )), se to da vychytat urcite.
A hlavne bych chtel mit neustalou moznost nahledu do boxu a jeho okoli kamerou, abych vzdy mohl uzivatelsky zasahnout na upozorneni.
To je moje utopie :) jen jsem se chtel vypsat… |
|
|
|
|