#include <PID_v1.h>
#include <LiquidCrystal.h>
#define PIN_THERMOSTAT A0
#define PIN_HEATER 9
#define PIN_FAN 10
#define PIN_BUTTON_UP 2
#define PIN_BUTTON_DOWN 3
#define PIN_LCD_RS 4
#define PIN_LCD_EN 5
#define PIN_LCD_D4 6
#define PIN_LCD_D5 7
#define PIN_LCD_D6 8
#define PIN_LCD_D7 9
#define LCD_COLUMNS 16
#define LCD_ROWS 2
double setpoint = 37.5; // Заданная температура в инкубаторе
double input, output;
double Kp = 2, Ki = 5, Kd = 1; // Параметры PID
PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
LiquidCrystal lcd(PIN_LCD_RS, PIN_LCD_EN, PIN_LCD_D4, PIN_LCD_D5, PIN_LCD_D6, PIN_LCD_D7);
int buttonState = 0;
void setup() {
pinMode(PIN_THERMOSTAT, INPUT);
pinMode(PIN_HEATER, OUTPUT);
pinMode(PIN_FAN, OUTPUT);
pinMode(PIN_BUTTON_UP, INPUT);
pinMode(PIN_BUTTON_DOWN, INPUT);
lcd.begin(LCD_COLUMNS, LCD_ROWS);
myPID.SetMode(AUTOMATIC);
}
void loop() {
input = analogRead(PIN_THERMOSTAT); // Считываем значение с термостата
input = input * (5.0 / 1023.0) * 100.0; // Преобразуем в температуру в градусах Цельсия
myPID.Compute(); // Вычисляем выход PID
if (input < setpoint) {
digitalWrite(PIN_HEATER, HIGH); // Включаем обогреватель
digitalWrite(PIN_FAN, HIGH); // Включаем вентилятор
} else {
digitalWrite(PIN_HEATER, LOW); // Выключаем обогреватель
digitalWrite(PIN_FAN, LOW); // Выключаем вентилятор
}
buttonState = digitalRead(PIN_BUTTON_UP); // Читаем состояние кнопки "вверх"
if (buttonState == HIGH) {
setpoint += 0.5; // Изменяем заданную температуру на 0.5 градуса
}
buttonState = digitalRead(PIN_BUTTON_DOWN); // Читаем состояние кнопки "вниз"
if (buttonState == HIGH) {
setpoint -= 0.5; // Изменяем заданную температуру на 0.5 градуса
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(input);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(setpoint);
lcd.print("C ");
delay(1000);
}