#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);
}
}
}