/
k3dr
/
stationProgrammer
Обзор
Документация
Войти
/
k3dr
/
stationProgrammer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ArduinoStationBase/stationLib_Lite.cpp
131 строка
6 KB
k3dr
upload files
11 янв 2026, 10:23
11 янв 2026, 10:23
ccd2d23
Код
Авторство
О чём код?
#include "stationLib_Lite.h" #include <Servo.h> #include <EEPROM.h> /* params: servoPin - пин подключения сервопривода strPosAddr - адрес в EEPROM,В который записано положение по "+" trnPosAddr - адрес в EEPROM,В который записано положение по "-" eeprom_address - адрес EEPROM, в который будет записывать положение сервопривода switchingDelay - задержка перед отключением сервопривода switchingFade - плавность перевода стрелки switchingGrade - eгол увеличения/уменьшения позиции при переборе */ arrow::arrow(uint8_t servoPin , uint8_t strPosAddr, uint8_t trnPosAddr, uint8_t eeprom_address, uint16_t switchingDelay = 1000, uint8_t switchingFade=20, uint8_t switchingGrade=1) { Servo _motor; _servoPin = servoPin; _strPosAddr = strPosAddr; _trnPosAddr = trnPosAddr; _switchingDelay = switchingDelay; _switchingFade = switchingFade; _switchingGrade = switchingGrade; _eeprom_address = eeprom_address; EEPROM.get(_strPosAddr, _straightPosition); EEPROM.get(_trnPosAddr, _turningPosition); _angle = _straightPosition; } /* Первод стрелки из _angle в _straightPosition с шагом в _switchingGrade, задержкой плавности _switchingFade */ void arrow::switchStraight() { if (_angle > _straightPosition) { Serial.print("Straight "); // Вывод в консоль о начале перевода _motor.attach(_servoPin); // Подключаем сервопривод /* Плавно изменяем угол от текущего положения (_angle) до положения по прямой (по "+") с шагом _switchingGrade, с задержкой между перебором в _switchingFade мс */ for (_angle;_angle > _straightPosition; _angle -= _switchingGrade) { _motor.write(_angle); delay(_switchingFade); } _angle = _straightPosition; } else if (_angle < _straightPosition) { Serial.print("Straight "); // Вывод в консоль о начале перевода _motor.attach(_servoPin); // Подключаем сервопривод /* Плавно изменяем угол от текущего положения (_angle) до положения по прямой (по "+") с шагом _switchingGrade, с задержкой между перебором в _switchingFade мс */ for (_angle; _angle < _straightPosition; _angle += _switchingGrade) { _motor.write(_angle); delay(_switchingFade); } _angle = _straightPosition; } //чтобы не выставлять _straightPosition кратный _switchingGrade, в конце доводим угол до нужного, если перебежали //Приравнием текущий угол к конечному целевому положению _motor.write(_angle); //Доводим сервопривод EEPROM.update(_eeprom_address, 1); //Записываем в EEPROM по адресу _eeprom_address 1 - сигнал о положении привода //Считывать безопаснее всего в uint8_t переменную! _motor.detach(); //Отключаем сервопривод, убираем питание Serial.println(_angle); // Выводим угол, в который перевёлся привод } /* Первод стрелки из _angle в _straightPosition с шагом в _switchingGrade, задержкой плавности _switchingFade */ void arrow::switchTurning() { if (_angle < _turningPosition) { Serial.print("Turning "); // Вывод в консоль о начале начале перевода по отклонению _motor.attach(_servoPin); // Подключение сервопривода по пину _servoPin /* Плавно изменяем угол от текущего положения (_angle) до положения по прямой (по "+") с шагом _switchingGrade, с задержкой между перебором в _switchingFade мс */ for (_angle; _angle < _turningPosition; _angle += _switchingGrade) { _motor.write(_angle); delay(_switchingFade); } _angle = _turningPosition; } else if (_angle > _turningPosition) { Serial.print("Turning "); // Вывод в консоль о начале начале перевода по отклонению _motor.attach(_servoPin); // Подключение сервопривода по пину _servoPin /* Плавно изменяем угол от текущего положения (_angle) до положения по прямой (по "+") с шагом _switchingGrade, с задержкой между перебором в _switchingFade мс */ for (_angle; _angle > _turningPosition; _angle -= _switchingGrade) { _motor.write(_angle); delay(_switchingFade); } _angle = _turningPosition; } //чтобы не выставлять _turningPosition кратный _switchingGrade, в конце доводим угол до нужного, если перебежали //Приравнием текущий угол к конечному целевому положению _motor.write(_angle); //Доводим привод до крайнего целевого положения _turningPosition EEPROM.update(_eeprom_address, 0); //Записываем в EEPROM по адресу _eeprom_address - сигнал о положении привода //Считывать безопаснее всего в uint8_t переменную! _motor.detach(); // Снимаем питание с сервопривода Serial.println(_angle); } void arrow::updateAngles() { EEPROM.get(_strPosAddr, _straightPosition); EEPROM.get(_trnPosAddr, _turningPosition); }