Пояснительная записка к диплому
.pdfПРИЛОЖЕНИЕ 2
ПРИЛОЖЕНИЕ 3
.
Форм |
Зона |
Поз. |
|
Обозначение |
Наименование |
|
|
|
Кол. |
Примеч. |
|||||
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
Диоды |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VD1 |
SDS142WA |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VD2 |
MBRM140 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Конденсаторы |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C1 |
К50-35, 4.7мкФ, 160В, ±20% |
1 |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C2 |
К50-35, 0.22мкФ, 50В, ±20% |
1 |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C3 |
К73-11, 30мкФ, 450В, ±5% |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Микросхемы |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD1,DD2 |
Transistor Switch VDC 100V 33A |
2 |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD3 |
AC Dimmer Module, 1 Channel, |
1 |
|
|||||||
|
|
|
|
|
3.3V/5V, AC 50/60hz, 110V~400V |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
DD4 |
Espressif ESP32 Dev Module |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD5 |
LT1936 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD6, DD7 |
I2C Module Button |
|
|
|
2 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD8 |
DHT22 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD9 |
LCD 1602 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD10 |
RTC DS3231 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD11 |
DS18B20 |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD12 |
MG90s |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Резисторы |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R1 |
С2-23, 2 Вт, 10 кОм, ±5% |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R2 |
С2-23, 2 Вт, 33 кОм, ±5% |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R3 |
С2-23, 2 Вт, 4.7 кОм, ±5% |
|
|
|
1 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Изм |
Лист |
|
№ докум. |
|
Подп. |
Дата |
|
|
|
|
|
|
|
|
|
Разраб. |
|
Л |
. |
|
|
|
|
Лит. |
|
Лист |
Листов |
||||
Пров. |
|
Данилаев М.П. |
|
|
|
|
|
|
|
|
|
|
1 |
||
|
|
|
|
|
|
|
|
Спецификация |
|
|
ИРЭФ-ЦТ, гр. |
||||
Н.контр. |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Утв. |
|
Данилаев М.П |
|
|
|
|
|
|
|
|
|
|
|
ПРИЛОЖЕНИЕ 4
#include <ESPAsyncWebServer.h> #include <Thread.h>
#include <iarduino_Metro.h> #include <OneWire.h>
#include <DallasTemperature.h> #include <SPI.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h> #include <DS1307RTC.h> #include <Wire.h>
#include <Servo.h> #include <RBDdimmer.h> #include <WiFi.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // инициализация экрана
OneWire oneWire(0); // пин к ds18b20
DallasTemperature sensors(&oneWire); // инициализация ds18b20 DHT dht(27, DHT22); // инициализация DHT22
dimmerLamp dimmer(12, 39); // инициализация диммера
Servo srvlotok; // инициализация серво-привода
AsyncWebServer server(80); // инициализация веб-сервера
const char* ssid = "CloadWar"; // переменная для логина
const char* password = "clbrnokc123"; // переменная для пароля float Temperature; // переменная для температуры
float Humidity; // переменная для влажности uint8_t sum; // переменная для подсчета кнопок i2c bool i; // переменная состояния кнопки 1
bool j; // переменная состояния кнопки 2
int pos; // переменная положения серво-привода int onOff; // перемнная вкл/выкл
char* eggname; // перменная типа яйца
long interval; // переменная времени интервала float Temp1; // переменная оптимальная температура float Temp2; // переменная критическая температура float Hum1; // переменная минимальной влажности float Hum2; // переменная максимальной влажности int daymax; // переменная кол-ва дней инкубации int daytemp; // переменная текущего дня
const byte DS3231 = 0x68; // переменная адреса rtc
Thread onoffinc = Thread(); // вкл/выкл инкубатора Thread selectegg = Thread(); // смена типа яйца Thread rotation = Thread(); // поворот лотка
Thread measure = Thread(); // измерение T&В, отправка данных на lcd
Thread vlaznost = Thread(); // регулировка влажности Thread incday = Thread(); // инкремент дня
Thread peregrev = Thread(); // перегрев с включением вентилятора
Thread pidregulator = Thread(); // пид-регулятор
//снятие с датчика значения температуры
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");