Материал: Пояснительная записка к диплому

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

//снятие с датчика значения температуры

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");

Источник: https://studfile.net/preview/16674093/