#include "SevSeg.h"// подключаем библиотеку 7ми сегментного экрана
SevSeg sevseg; // инициализируем экран
#include <Servo.h> // подключаем библиотеку сервопривода
Servo myservo; // инициализируем привод
int Servopos; // переменная положения заслонки
const float BETA = 3950; // коэффициент термистора
#define Btn 12 // постоянная пина кнопки
void setup() {
myservo.attach(4); //пин управления заслонкой
byte numDigits = 2; // количество экранов
byte digitPins[] = {2, 3}; //пины переключения с экрана на экран
byte segmentPins[] = {5, 6, 7, 8, 9, 10, 11}; // пины Сегментов
bool resistorsOnSegments = false; // резисторы стоят на пинах переключения экрана
byte hardwareConfig = COMMON_ANODE; // DIG1, DIG2 являются анодами
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = true; // Используйте "true", если вы хотите сохранить начальные нули
bool disableDecPoint = true; // выключает дисятичную точку на экране
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint); // инициализирует связь с экраном
sevseg.setBrightness(90); // установка яркости светодиодов экрана
pinMode(Btn, INPUT_PULLUP); //подтянутый к питанию вход кнопки.
}
void loop() {
/* Блок задания номер 1.
индикация счёта от 0 до 9 с задержкой в одну секунду
с выводом на 7ми сегментный экран.
*/
static int Seconds = -1;
while (Seconds < 10) {// пока Seconds < 10 считаем секунды, записываем результат в экран
static unsigned long timer = millis(); // "Костыль" - так как последнее значение Seconds будет 10,
// то избегаем переполнение буфера переменной timer из-за millis()
if (millis() - timer >= 1000) {
timer += 1000;
Seconds++;
sevseg.setNumber(Seconds); // вывод секунд на экран
}
else {
sevseg.refreshDisplay();
}
}
/* Блок задания номер 2.
Серводвигатель осуществляет поворот заслонки,
которая регулирует интенсивность потока теплоносителя,
в системе установлен датчик температуры.
Обратная связь от датчика температуры используется для задания градуса открытия заслонки.
Градус поворота соответствовует значениям: -24°С — 0°, 80°С — 90°.
Проект нужно оснастить кнопкой, при нажатии на которую происходит
сброс угла поворота серводвигателя на 0°.
*/
/*В начале идет эмуляция фиксации кнопки сброса угла поворота серводвигателя.
Для избежания неоднородного срабатывания кнопки можно применить millis().
Это грозит переполнением буфера переменной через 49 дней.
Но мы только что от него избавились выше в коде.
Благоразумнее использовать переключатель (кнопку с фиксацией), но в задании просто кнопка.
Так что как то так.
*/
bool Btn_State = !digitalRead(Btn);
bool Btn_Flag;
if (Btn_State == HIGH) {
Btn_Flag = !Btn_Flag;
}
if (Btn_Flag == LOW) { // работа по датчику температуры
int analogValue = analogRead(A1);// считываем показания термистора с аналогового пина
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15; // формула из описания термистора
Servopos = map (celsius, -24, 80, 0, 90); // перевод диапазона °С в диапозон градусов поворота привода.
}
if (Btn_Flag == HIGH) { // работа при сбросе угла поворота
Servopos = 0;
}
myservo.write(Servopos); //Передаем позицию положения в сервопривод
/* Блок задания номер 3.
Отображение индикатором градуса поворота сервопривода.
*/
sevseg.setNumber(Servopos); //записываем в экран значение угла поворота
sevseg.refreshDisplay();
}