const float BETA = 3950; // Коэффициент термистора
#include <SevSeg.h> // Подключение библиотеки для работы с семисегментным индикатором
SevSeg sevseg; // Инициализация объекта "Семисегментный индикатор"
#include <Servo.h> // Подключение библиотеки для работы с сервоприводами (https://developer.alexanderklimov.ru/arduino/servo.php)
Servo myservo; // создаём объекты для управления сервоприводами
#define A 9 // К пину 9 подключён сегмент A
#define B 2 // К пину 2 подключён сегмент B
#define C 3 // К пину 3 подключён сегмент C
#define D 4 // К пину 4 подключён сегмент D
#define E 5 // К пину 5 подключён сегмент E
#define F 6 // К пину 6 подключён сегмент F
#define G 7 // К пину 7 подключён сегмент G
#define DP 8 // К пину 8 подключён сегмент DP
#define DIG1 13 // К пину 13 подключён первый разряд индикатора
#define DIG2 12 // К пину 12 подключён второй разряд индикатора
#define Button 10 // К пину 10 подключёна кнопка управления
#define S 11 // К пину 11 подключён сервопривод
void setup() {
Serial.begin(9600); // Инициализация последовательного порта (для отладочной информации)
byte numDigits = 2; // Настройки объекта. См. здесь:
byte digitPins[] = {13, 12}; // https://r2ino.ru/blog/uroki-programmirovaniya/kak-podklyuchit-7-segmentnyj-displej-na-arduino.html
byte segmentPins[] = {A, B, C, D, E, F, G, DP};
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_CATHODE;
// Начало работы с объектом "Семисегментный индикатор"
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
myservo.attach(S); // Подключение сервопривода к пину S
}
void loop() {
int Tint; // В этой переменной будет храниться значение температуры (округлённое до целых)
int AngleINT; // В этой переменной будет храниться значение угла (округлённое до целых)
bool BTN; // Состояние кнопки
int analogValue = analogRead(A1); // Получение "сырых" данных от термистора
// Пересчёт данных термистора в градусы Цельсия (https://docs.wokwi.com/parts/wokwi-ntc-temperature-sensor):
float T = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
Tint = round(T); // Округление значения температуры
BTN = digitalRead(Button); // Узнаем состояние кнопки
if (BTN == true){ // Если кнопка включена, то система работает (следит за температурой)
//-24°С — 0°, 80°С — 90°
AngleINT = map(T, -24, 80, 0, 90); // Интерполяция для получения значения угла поворота сервопривода (по ТЗ)
}
if (BTN == false){ // Если кновка выключена, то задвижка закрывается
AngleINT = 0;
}
myservo.write(AngleINT); // Установка сервопривода в заданное положение
sevseg.setNumber(AngleINT); // С помощью функционала библиотеки SevSeg выводим целое число
sevseg.refreshDisplay(); // Обновляем дисплей
Serial.println("Т=" + String(Tint) + " -> angle=" + String(AngleINT)); // Вывод отладочной информации
}