Tady to je. Jedna část by měla ovládat 1000l akvário (4x světlo, intenzitu světla, co2, 2-4x tekuté hnojivo, odvětrání světel, hlídání PH, přepad do spodního filtru (servo, krokový motor).... Druhá část možná líheň na vejce. Hodně věcí je tam podobně ovládaných.
Bude to asi arduino mega , datalogger, HTU21D, topení....
Toto je můj úplně první projekt a chtěl bych se na něm trochu rozkoukat, tak si to popisuji jako tupec, abych se v tom trochu vyznal.
Kód: Vybrat vše
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#include "SparkFunHTU21D.h"
int hodina = 7; //čas spuštění světla hodina
int minuta = 30; //čas spuštění světla minuta
int svetlo = 12; //doba svícení (hodina + minuta + světlo)
/*
const int fan_1 = 2; // mega PWM pin na ventilator
const int fan_2 = 3; // mega PWM pin na ventilator
const int fan_3 = 4; // mega PWM pin na ventilator
const int fan_4 = 5; // mega PWM pin na ventilator
*/
RTC_DS1307 DS1307; //hodiny vytvoření instance DS1307 z knihovny RTClib
HTU21D mujHTU; //teploměr a vlhkoměr inicializace senzoru z knihovny
const int sd_CS = 10; //SDkarta nastavení pinu CS pro SD kartu
const int analogPin = A0; //hodiny pin pro čtení analogové hodnoty
char seznamDni[7][8] = {"nedele", "pondeli", "utery", "streda", "ctvrtek", "patek", "sobota"};
void setup () {
Serial.begin(9600);
mujHTU.begin();
if (! DS1307.begin()) // kontrola připojeného obvodu reálného času
{
Serial.println("Hodiny nejsou pripojeny!");
while (1);
}
if (! DS1307.isrunning()) // kontrolu spuštění obvodu reálného času
{
Serial.println("Hodiny nejsou spusteny! Spoustim nyni..");
}
if (!SD.begin(sd_CS)) // kontrola připojené SD karty
{ // na mega zmenit (sd_CS) na piny
Serial.println("SD karta neni pripojena nebo je vadna!");
return;
}
// následující příkaz v pořadí rok, měsíc, den, hodina, minuta, vteřina
// DS1307.adjust(DateTime(2023, 10, 16, 20, 27, 5));
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Nepoužívat (pouze pro ladění)
digitalWrite(9, HIGH); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Nepoužívat (pouze pro ladění)
// pinMode(10, OUTPUT); Nepoužívat (obsazeno datalogger)
pinMode(12, OUTPUT);
/*
pinMode(fan_1, OUTPUT); // mega PWM pin na ventilator
pinMode(fan_2, OUTPUT); // mega PWM pin na ventilator
pinMode(fan_3, OUTPUT); // mega PWM pin na ventilator
pinMode(fan_4, OUTPUT); // mega PWM pin na ventilator
*/
}
void loop () {
DateTime datumCas = DS1307.now(); // načtení aktuálního času a data do proměnné datumCas
float teplota = mujHTU.readTemperature(); // teplota
float vlhkost = mujHTU.readHumidity(); // vlhkost
Serial.print("Aktualni cas "); // vypsání informací čas a datum
Serial.print(datumCas.hour());
Serial.print(':');
Serial.print(datumCas.minute());
Serial.print(':');
Serial.print(datumCas.second());
Serial.print(", ");
Serial.print(seznamDni[datumCas.dayOfTheWeek()]);
Serial.print(" ");
Serial.print(datumCas.day());
Serial.print('.');
Serial.print(datumCas.month());
Serial.print('.');
Serial.print(datumCas.year());
Serial.println();
String dataString = "Analog pin: "; // vytvoření proměnné dataString pro uložení
// zprávy, která bude zapsána na SD kartu
int sensor = analogRead(analogPin); // načtení analogové hodnoty z nastaveného pinu
dataString += String(sensor); // připsání hodnoty z pinu do zprávy dataString
dataString += ", cas: ";
dataString += String(datumCas.hour()) + ":" + String(datumCas.minute()) + ":" + String(datumCas.second());
// připsání aktuálního času do zprávy dataString,
// jako oddělovač slouží +
File zapisDat = SD.open("mereni.txt", FILE_WRITE); // otevření souboru na SD kartě s názvem mereni.txt
if (zapisDat) // v případě, že je soubor bez problémů vytvořen (pokud neexistuje),
{ // nebo otevřen (pokud existuje), zapiš do něj dataString a ukonči zápis
zapisDat.println(dataString);
zapisDat.close();
Serial.println("Zapis na kartu uspesny.");
}
else // v případě chyby při otevírání souboru vypiš chybu
{
Serial.println("Chyba pri otevreni souboru mereni.txt !"); // přidat pin na led s chybou
}
delay(1000);
if (teplota > 150 | vlhkost > 100) {
Serial.println("Chyba komunikace se senzorem HTU21D!"); // přidat pin na led s chybou
}
else
{
Serial.print("HTU21D | Teplota: "); // přidat výpis na LCD
Serial.print(teplota, 1);
Serial.print(" st C | ");
Serial.print("Vlhkost: ");
Serial.print(vlhkost, 1);
Serial.print("%");
Serial.println();
}
delay(1000);
int casvmin = datumCas.hour()*60 + datumCas.minute();
if ((casvmin >= 7*60+30 ) && ( casvmin <= 18*60+40))
//if ((datumCas.hour() >= 17 ) && ( datumCas.minute() >= 30) || (datumCas.hour() <= 18 ) && ( datumCas.minute() <= 40))
//if (( datumCas.minute() >= 42) && (datumCas.minute() <= 45)) // ladící řádek
//if (( datumCas.hour() > 17 < 18 ) && ( datumCas.minute() > 30 < 40 ))
//if ((datumCas.hour() >= 17 ) && (datumCas.hour() <= 20 ) && ( datumCas.minute() >= 2) && ( datumCas.minute() <= 5))
{
digitalWrite(8, HIGH); // svetlo (den)
Serial.println("DEN ");
}
else
{
digitalWrite(8, LOW); // svetlo (noc)
Serial.println("NOC ");
}
delay(1000);
if ((teplota > 1) && (teplota < 22)) // topeni Hlidani teploty, topeni a chlazeni
{
digitalWrite(4, HIGH); // teplota nizka (modra)
digitalWrite(3, LOW); //!!!!!!!!!!!!!!!!!!!!!!!!!!! doladit presnou teplotu na topeni a vlozit do promenne
digitalWrite(2, LOW);
}
else if ((teplota >= 22) && (teplota <= 26))
{
digitalWrite(2, LOW); // teplota OK (zelena)
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else if (teplota > 27)
{
digitalWrite(3, LOW); // teplota vysoka (cervena)
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
// analogWrite(fan_1, 255);
// Serial.print("100%"); // rychlost ventilatoru pro orientaci
}
delay(1000);
if ((vlhkost > 1) && (vlhkost <= 50))
{
digitalWrite(7, HIGH); // zvlhčovač (modra)
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
else if ((vlhkost >= 51) && (vlhkost <= 69)) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!doladit vlhkost
{
digitalWrite(5, LOW); // vlhkost OK (zelena)
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
}
else if (vlhkost > 70)
{
digitalWrite(7, LOW); // odvlhčovač (cervena)
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
// analogWrite(fan_1, 255);
// Serial.print("100%"); // rychlost ventilatoru pro orientaci
}
delay(1000);
if ((teplota > 27) || (vlhkost > 70)) // rele odvětrání při poruše (test funkčnosti) nepoužívat
{ // zaměnit za PWM ventilator
digitalWrite(9, LOW);
}
else {
digitalWrite(9, HIGH);
}
delay(1000);
}
EDIT: POUŽÍVEJTE TAG CODE !!!