#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
#include <TroykaCurrent.h>
#define RELAY_OPEN_PIN 18 // Пин для управления реле открытия северного фасада
#define RELAY_CLOSE_PIN 19 // Пин для управления реле закрытия северного фасада
#define RELAY_OPEN_PIN_1 20 // Пин для управления реле открытия южного фасада
#define RELAY_CLOSE_PIN_1 21 // Пин для управления реле закрытия южного фасада
const int currentSensorPin = 33; // Пин для считывания токового сигнала с привода северного фасада
const int currentSensorPin_1 = 34; // Пин для считывания токового сигнала с привода южного фасада
const int oneWireBus[] = {5, 4, 14, 12, 13, 15}; // Пины, к которым подключены датчики DS18B20
const int numberOfSensors = sizeof(oneWireBus) / sizeof(oneWireBus[0]);
// Названия датчиков
const char* sensorNames[] = {"tвн северный фасад: ", "tвн южный фасад: ", "tнар северный фасад: ", "tнар южный фасад: ", "tпод северный фасад: ", "tпод южный фасад: "};
// Настройки пид регулятора северного фасада
double input, output, setpoint;
double Kp = 2, Ki = 5, Kd = 1; // Коэффициенты PID
PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
// Настройки пид регулятора южного фасада
double input_1, output_1, setpoint_1;
double Kp_1 = 2, Ki_1 = 5, Kd_1 = 1; // Коэффициенты PID
PID pid_1(&input_1, &output_1, &setpoint_1, Kp_1, Ki_1, Kd_1, DIRECT);
//Работа с библиотеками OneWire и DallasTemperature для измерения температур
OneWire oneWireArray[numberOfSensors];
DallasTemperature sensorsArray[numberOfSensors];
OneWire oneWire(oneWireBus[4]);
DallasTemperature sensors(&oneWire);
OneWire oneWire1(oneWireBus[5]);
DallasTemperature sensors_1(&oneWire1);
// Переменные для хранения температур каждого датчика
float temperatures[numberOfSensors];
//Функция расчета отклонения внутренней температуры
int calculateRequiredTemperature(float temperature) {
return (20 - ((((temperature / 20) * 100 - 100) / 100) * 20));
}
//Функция формирования температурных графиков
int calculatePodTemperature(int t_vn, float t_out) {
float q = ((t_vn - t_out) / (20 + 23));
return (t_vn + (0.5 * (95 - 70) * q) + (0.5 * (95 + 70 - 2 * t_vn) * q));
}
void setup() {
Serial.begin(115200); // Установка скорости передачи 115200 бит/сек
for (int i = 0; i < numberOfSensors; i++) {
oneWireArray[i] = OneWire(oneWireBus[i]);
sensorsArray[i] = DallasTemperature(&oneWireArray[i]);
sensorsArray[i].begin();
}
pinMode(RELAY_OPEN_PIN, OUTPUT);
pinMode(RELAY_CLOSE_PIN, OUTPUT);
sensors.begin();
pid.SetMode(AUTOMATIC);
pinMode(RELAY_OPEN_PIN_1, OUTPUT);
pinMode(RELAY_CLOSE_PIN_1, OUTPUT);
sensors_1.begin();
pid_1.SetMode(AUTOMATIC);
}
void loop() {
// Считываем значение токового сигнала с привода северного фасада
float current = currentRead(currentSensorPin);
// Считываем значение токового сигнала с привода южного фасада
float current_1 = currentRead(currentSensorPin_1);
for (int i = 0; i < numberOfSensors; i++) {
sensorsArray[i].requestTemperatures();
temperatures[i] = sensorsArray[i].getTempCByIndex(0); // Получить температуру в градусах Цельсия
}
// Вывод температур каждого датчика с его названием
for (int i = 0; i < numberOfSensors; i++) {
Serial.print(sensorNames[i]);
Serial.print(temperatures[i]);
Serial.println(" °C");
}
// Требуемые температуры на подающей линии северного и южного фасадов из температурного графика
int t_vn_north = calculateRequiredTemperature(temperatures[0]);
int t_vn_south = calculateRequiredTemperature(temperatures[1]);
int t_pod_south = calculatePodTemperature(t_vn_south, temperatures[3]);
int t_pod_north = calculatePodTemperature(t_vn_north, temperatures[2]);
setpoint = t_pod_north; //Требуемая температура подающей линии северного фасада для пид регулятора
setpoint_1 = t_pod_south; //Требуемая температура подающей линии южного фасада для пид регулятора
Serial.print("Требуемая температура подачи южного фасада: ");
Serial.print(t_pod_south);
Serial.println(" °C");
Serial.print("Требуемая температура подачи северного фасада: ");
Serial.print(t_pod_north);
Serial.println(" °C");
// ПИД регулятор северного фасада
sensors.requestTemperatures();
input = sensors.getTempCByIndex(0);
pid.Compute();
if (current <= 4) {
// Ограничение на закрытие, если токовый сигнал с привода северного фасада меньше или равен 4мА
digitalWrite(RELAY_OPEN_PIN, LOW);
digitalWrite(RELAY_CLOSE_PIN, HIGH);
} else if (current >= 40) {
// Ограничение на открытие, если токовый сигнал с привода северного фасада больше или равен 40мА
digitalWrite(RELAY_OPEN_PIN, HIGH);
digitalWrite(RELAY_CLOSE_PIN, LOW);
} else {
if (output > 0) {
digitalWrite(RELAY_OPEN_PIN, HIGH);
digitalWrite(RELAY_CLOSE_PIN, LOW);
} else {
digitalWrite(RELAY_OPEN_PIN, LOW);
digitalWrite(RELAY_CLOSE_PIN, HIGH);
}
}
// ПИД регулятор южного фасада
sensors_1.requestTemperatures();
input_1 = sensors_1.getTempCByIndex(0);
pid_1.Compute();
if (current_1 < 4) {
// Ограничение на закрытие, если токовый сигнал с привода южного фасада меньше 4мА
digitalWrite(RELAY_OPEN_PIN_1, LOW);
digitalWrite(RELAY_CLOSE_PIN_1, HIGH);
} else if (current_1 > 40) {
// Ограничение на открытие, если токовый сигнал с привода южного фасада больше 40мА
digitalWrite(RELAY_OPEN_PIN_1, HIGH);
digitalWrite(RELAY_CLOSE_PIN_1, LOW);
} else {
if (output_1 > 0) {
digitalWrite(RELAY_OPEN_PIN_1, HIGH);
digitalWrite(RELAY_CLOSE_PIN_1, LOW);
} else {
digitalWrite(RELAY_OPEN_PIN_1, LOW);
digitalWrite(RELAY_CLOSE_PIN_1, HIGH);
}
Serial.print(setpoint_1);
delay(1000); // Задержка между измерениями
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1