#include <Servo.h>
#define Agree_pin 0
// определение пина для серво
#define PWM_pin 11
// пины для семисегментного
#define Seg_A 2
#define Seg_B 3
#define Seg_C 4
#define Seg_D 5
#define Seg_E 6
#define Seg_F 8
#define Seg_G 7
// пины для управления цифрами на индикаторе
#define Dig_1 9
#define Dig_2 10

Servo servo1;
// массив с данными для индикатора, неработающий сегмент = 0
int Number[10][8] = { 
  {Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,0},
  {0,Seg_B,Seg_C,0,0,0,0},
  {Seg_A,Seg_B,0,Seg_D,Seg_E,0,Seg_G},
  {Seg_A,Seg_B,Seg_C,Seg_D,0,0,Seg_G},
  {0,Seg_B,Seg_C,0,0,Seg_F,Seg_G},
  {Seg_A,0,Seg_C,Seg_D,0,Seg_F,Seg_G},
  {Seg_A,0,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
  {Seg_A,Seg_B,Seg_C,0,0,0,0},
  {Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
  {Seg_A,Seg_B,Seg_C,Seg_D,0,Seg_F,Seg_G},
};
void setup() {
  // put your setup code here, to run once:
  // аналогично предыдущему - инициализация пина запрета
  pinMode(Agree_pin, INPUT_PULLUP);
  // входа датчика температуры
  pinMode(A0, INPUT);
  // инициализация серво
  servo1.attach(PWM_pin);
  // инициализация индикатора вместе с выбором
  pinMode(Seg_A, OUTPUT);
  pinMode(Seg_B, OUTPUT);
  pinMode(Seg_C, OUTPUT);
  pinMode(Seg_D, OUTPUT);
  pinMode(Seg_E, OUTPUT);
  pinMode(Seg_F, OUTPUT);
  pinMode(Seg_G, OUTPUT);
  pinMode(Dig_1, OUTPUT);
  pinMode(Dig_2, OUTPUT);  
}

void loop() {
  // put your main code here, to run repeatedly:
  // считывание аналогового входа и пересчет в температуру
  int an_Value = analogRead(A0);
  float celsius = 1 / (log(1 / (1023. / an_Value - 1)) / 3950 + 1.0 / 298.15) - 273.15;  
  // пересчет из температуры в угол серво
  int Posit = ((float)(24 + celsius) / 104.0)*90.0;
  // проверка запрета, если запрет - угол равен 0
  int Agreem = digitalRead(Agree_pin);
  if (Agreem == 1) 
  {
    Posit = 0;
  }
  // передача угла в серво
  servo1.write(Posit);
  // разделить значение угла на цифры 
  int a = Posit / 10;
  int b = Posit % 10;
  // прижать общий контакт старшей цифры к земле
  digitalWrite(Dig_1, LOW);
  // выдать первую цифру с минимальной задержкой
  Number_Take(a,10);
  // поднять общий контакт - цифра погаснет
  digitalWrite(Dig_1, HIGH);
  // аналогично прижать общий контакт младшей цифры
  digitalWrite(Dig_2, LOW);
  // выдать вторую цифру и после поднять обратно  общий контакт
  Number_Take(b,10);
  digitalWrite(Dig_2, HIGH);
  // задержка 100 мс - цифры мигают, а 50 мс - нормально
  delay(50);
}
// процедура выдачи нужной цифры с заданной задержкой
void Number_Take(int num, int del)
{
  for(int i = 0; i<8; i++)
  {
    int a = Number[num][i];
    if (a != 0)
    {
      digitalWrite(a, HIGH);      
    }
  }
  delay(del);
  for(int i = 0; i<10; i++)
  {
    int a = Number[num][i];
    if (a != 0)
    {
      digitalWrite(a, LOW);
    }
  }
}