//снятие с датчика значения температуры
String readDSTemperature() { sensors.requestTemperatures(); Temperature = sensors.getTempCByIndex(0);
if (isnan(Temperature)) { return "--";
}
else {
return String(Temperature);
}
}
//снятие с датчика значения влажности
String readDHTHumidity() { Humidity = dht.readHumidity(); if (isnan(Humidity)) {
return "--";
}
else {
return String(Humidity);
}
}
//считывание типа яйца
String readTypeEgg() {
char* eggname_t = eggname; if (eggname_t == "Ducks") {
eggname_t = "Утка";
}
else {
eggname_t = "Курица";
}
return String(eggname_t);
}
//считывание дня инкубации
String readDayInc() {
int daytemp_t = daytemp; return String(daytemp_t);
}
//считывание состояния инкубации
String readProcess() { char* process_t;
if (daytemp <= daymax) {
process_t = "Инкубация в процессе";
}
else {
process_t = "Конец инкубации";
}
return String(process_t);
}
//последовательный опрос параметров инкубации для веб-клиента
String processor(const String& var){ if(var == "TEMPERATURE"){
return readDSTemperature();
}
else if(var == "HUMIDITY"){ return readDHTHumidity();
}
else if(var == "TYPEEGG"){ return readTypeEgg();
}
else if(var == "DAYINCUB"){ return readDayInc();
}
else if(var == "PROCESS"){ return readProcess();
}
return String();
}
//чтение состояния кнопки вкл/выкл
void ButtonOnOff() {
i = Metro[0].read(KEY_TRIGGER); if(i == HIGH) {
onOff = 1;
}
else {
onOff = 0; daytemp = 1;
}
}
// чтение состояния кнопки выбор типа яйца void ButtonSelectEgg() {
j = Metro[1].read(KEY_TRIGGER); if(j == HIGH) {
eggname = "Fowls"; interval = 60000; Temp1 = 38.00; Temp2 = 40.00; Hum1 = 40.00;
Hum2 = 50.00; daymax = 12;
}
else {
eggname = "Ducks"; interval = 80000; Temp1 = 37.50; Temp2 = 40.00; Hum1 = 45.00;
Hum2 = 50.00; daymax = 11;
}
}
//поворот лотка с яйцами void RotationLotok() {
if (pos == 0) { pos = 45;
srvlotok.write(pos);
}
else if (pos == 45) { pos = 135; srvlotok.write(pos);
}
else {
pos = 45; srvlotok.write(pos);
}
}
//опрос Т&В с выводом на lcd экран void MeasureTempHum() {
sensors.requestTemperatures(); Temperature = sensors.getTempCByIndex(0); Humidity = dht.readHumidity(); lcd.setCursor(0, 0);
lcd.print("T="); lcd.setCursor(2, 0); lcd.print(Temperature); lcd.setCursor(7, 0); lcd.print("C"); lcd.setCursor(8, 0); lcd.setCursor(10, 0); lcd.print("DAY:"); lcd.print(daytemp); lcd.setCursor(0, 1); lcd.print("H="); lcd.setCursor(2, 1); lcd.print(Humidity); lcd.setCursor(7, 1); lcd.print("%"); lcd.setCursor(8, 1); lcd.setCursor(10, 1); lcd.print(eggname);
}
//поддержание влажности
void HumidityChange() {
if(Hum1 <= Humidity && Humidity < Hum2) { digitalWrite(25, LOW);
}
else {
digitalWrite(25, HIGH);
}
}
//перегрев с включением вентилятора void Overheating() {
if(Temp2 < Temperature) { digitalWrite(26, HIGH);
}
else {
digitalWrite(26, LOW);
}
}
//слежение за днем инкубации
void IncDayInc() { Wire.beginTransmission(DS3231); Wire.write(byte(0x00)); Wire.endTransmission();
byte dateTime[7]; int k = 0;
Wire.beginTransmission(DS3231); Wire.requestFrom(DS3231, 7); while(Wire.available())
{
dateTime[k] = Wire.read(); k+=1;
}
Wire.endTransmission();
static int tempdays = dateTime[4]; if (tempdays != daytemp){
daytemp++;
}
}
// функция пид-регулятора
int computePID(float input, float setpoint, float kp, float ki, float kd, float dt, int minOut, int maxOut) {
float err = setpoint - input;
static float integral = 0, prevErr = 0;
integral = constrain(integral + (float)err * dt * ki, minOut, maxOut);
float D = (err - prevErr) / dt; prevErr = err;
return constrain(err * kp + integral + D * kd, minOut, maxOut);
}
// инициализация пид-регулятора с параметрами void PIDregulatorinc() {
int temp_znach = computePID(Temperature, Temp1, 12, 1.2, 30, 500, 0, 100);
dimmer.setPower(temp_znach);
}
void setup(){
Serial.begin(115200); // com порт Wire.begin();
pinMode(27, INPUT); pinMode(25, OUTPUT); pinMode(26, OUTPUT); onOff = 0;
eggname = "Goose"; interval = 60000; pos = 0;
Temp1 = 0;
Temp2 = 0;
Hum1 = 0;
Hum2 = 0; daymax = 0; daytemp = 0; i = LOW;
j = LOW; dht.begin();
dimmer.begin(NORMAL_MODE, ON); dimmer.setPower(0); sensors.begin(); sum=iarduino_Metro_Start(13); srvlotok.attach(14); srvlotok.write(pos);
onoffinc.onRun(ButtonOnOff); // назначаем потоку задачу onoffinc.setInterval(20); // задаём интервал срабатывания,мсек
selectegg.onRun(ButtonSelectEgg);
selectegg.setInterval(20);
rotation.onRun(RotationLotok);
rotation.setInterval(interval);
measure.onRun(MeasureTempHum);
measure.setInterval(1000);
vlaznost.onRun(HumidityChange);
vlaznost.setInterval(1000);
incday.onRun(IncDayInc);
incday.setInterval(60000);
peregrev.onRun(Overheating);
peregrev.setInterval(1000);
pidregulator.onRun(PIDregulatorinc);
pidregulator.setInterval(500);
lcd.init();
lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Connecting to");