#include <Servo.h> //подключение библиотеки для работы с серводвигателем
#include "SevSeg.h" //подключение библиотеки для работы с семисегментным индикатором
#define btn 2 //определяем константу для пина кнопки
#define sen A0 //определяем константу для пина чтения данных с термистора
#define srv 3 //определяем константу для пина управляющего сигнала серводвигателя
const float b_sen = 3950; //B-коэффициент термистора
Servo srvOne; //определяем серводвигатель в качестве объекта
SevSeg indOne; //определяем индикатор в качестве объекта
int srv_pos = 0;
int avl = 0;
float cel_temp = 0;
void setup() {
pinMode(sen, INPUT); //определяем режим работы пина sen как входа
pinMode(btn, INPUT); //определяем режим работы пина btn как входа
srvOne.attach(srv); //определяем пин для подключения серводвигателя
byte numDigits = 2; //
byte digitPins[] = {6, 7}; //
byte segmentPins[] = {4, 5, 12, 10, 11, 8, 9,}; //инициализация переменных с параметрами
bool resistorsOnSegments = false; //для работы с индикатором
byte hardwareConfig = COMMON_ANODE; //
bool updateWithDelays = false; //
indOne.begin(hardwareConfig, numDigits, digitPins, segmentPins, //
resistorsOnSegments, updateWithDelays); //передача параметров объекту индикатор
indOne.setBrightness(90); //
}
void loop() {
int avl = analogRead(sen); //инициализация переменной для чтения данных термистора
float cel_temp = 1 / (log(1 / (1023. / avl - 1)) / b_sen + 1.0 / 298.15) - 273.15; //пересчет значения ацп в градусы цельсия
int val = cel_temp; //инициализация пременной для предачи сигнала серводвигателю с записью текущей температуры
val = map(val, -24, 80, 0, 90); //перевод дипазона температуры в градусы угла поворота серводвигателя
if (digitalRead(btn) == HIGH) { //проверка нажатия кнопки, при наличии высокого уровня сигнала:
srvOne.write(0); //- серводвигатель устанавливается в положение 0 градусов
val = 0; //- присваивается 0 пременной с текущим углом поворота серводвигателя
}
else { //в случае если условие ложно
srvOne.write(val); //серводвигатель устанавливается в положение в соответствие с
} //заданным углом в зависимости от температуры
indOne.setNumber(val); //передача значения пременной val
indOne.refreshDisplay(); //на семисегментный индикатор
}