/*Задание 2
Серводвигатель осуществляет поворот заслонки, которая регулирует интенсивность потока теплоносителя, в системе установлен датчик температуры. Обратная связь от датчика температуры используется для задания градуса открытия заслонки.
В эмуляторе Wokwi, используя микроконтроллер платы Arduino Uno:
Подключите и настройте работу сервопривода.
Движение привода должно осуществляться по информации от обратной связи с аналогового датчика температуры NTC.
Градус поворота должен соответствовать значениям: -24°С — 0°, 80°С — 90°.
Проект нужно оснастить кнопкой, при нажатии на которую происходит сброс угла поворота серводвигателя на 0°.
Задание 3* (необязательное)
В задании 2 подключите двухразрядный семисегментный индикатор.
Обеспечьте отображение индикатором градуса поворота сервопривода.*/
#include <Servo.h>; //билиотека нужна для работы с сервоприводами
#include <SevSeg.h> //билиотека нужна для работы с дисплеем
SevSeg display;//для создания экземпляра дисплея типа SevSeg
Servo motor;// для создания устройства которым будем управлять типа Servo
const float BETA = 3950; // коэффициент нужен для перевода сопротивления в градусы
#define button 2
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
motor.attach(3); // для присвоения 3 выхода сервоприводу с ШИМ модуляцией для управления
pinMode(button, INPUT); // для присвоения 2-ого пина для использования кнопкой
// эти переменные нужны для передачи показаний на дисплей
byte numDigits = 2;
byte digitPins[] = { 4, 5, };
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]
// для запуска дисплея с требуемыми значениями
display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
}
void loop() {
int analogValue = analogRead(A0);// для считывания значения со входа A0 и для записи в переменную
//для получения значения в градусах со входа A0 и записи в переменную
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
// для перевода значений в из градусов в углы поворота сервопривода
float rotate= map(celsius, -24, 80, 0, 90);
// условие для возврата сервопривода в нулевой угол
if(digitalRead(button) ) {
rotate=0;
}
// отправляем устройству значение угла на который нужно повернуть вал
motor.write(rotate);
display.setNumber(rotate,1);
display.refreshDisplay();
}