#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();                     //на семисегментный индикатор  
  
}