Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.
говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion.
Код:
//подключаемые библиотеки
#include <EEPROM.h>
#include <Bounce2.h>
#include <Servo.h>
//переменные конфигурации
int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"}
byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.)
int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус
//переменные определяюще ножки подключения
int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки
int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок"
int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода
int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения
//переменные используемые при повороте сервопривода
byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок.
int currentAngle[]={0,0,0};//текущий угол поворота сервопривода
unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус
unsigned long currentTime; //текущее время
byte dir;// направление поворота сервопривода
//объекты сервоприводов и антидребезка кнопок
const int servos=sizeof(servoPins)/sizeof(int);
Servo servoServos[servos];
Bounce servoBouncer[servos];
void setup() {
for(int i=0;i<servos;i++){
pinMode(buttonPins
, INPUT);
servoBouncer = Bounce();
servoBouncer.attach(buttonPins);
servoBouncer.interval(5);
pinMode(normalLed, OUTPUT);
pinMode(routeLed, OUTPUT);
if(EEPROM.read(i) > 1){
EEPROM.update(i,0);
}
CurrentPosition=EEPROM.read(i);
digitalWrite(normalLed, !CurrentPosition);
digitalWrite(routeLed, CurrentPosition);
servoServos.attach(servoPins);
if(servoReverce){
servoServos.write(servoAngles[!CurrentPosition]);
currentAngle=servoAngles[!CurrentPosition];
}
else {
servoServos.write(servoAngles[CurrentPosition]);
currentAngle=servoAngles[CurrentPosition];
}
}
delay(1000);
for(int i=0;i<servos;i++){
servoServos.detach();
}
}
void loop() {
currentTime=millis();
for(int i=0;i<servos;i++){
if(nextTime>0 && nextTime<currentTime){
if(currentAngle>=servoAngles[0] && currentAngle<=servoAngles[1]){
nextTime=currentTime+servoSpeed;
if(servoReverce){
dir=!CurrentPosition;
}
else {
dir=CurrentPosition;
}
if(dir){
currentAngle++;
}
else {
currentAngle--;
}
if(servoAngles[1]/currentAngle == 2 || servoAngles[1]/currentAngle == 2.5 ){
digitalWrite(normalLed, !CurrentPosition);
digitalWrite(routeLed, CurrentPosition);
}
servoServos.write(currentAngle);
}
else{
nextTime=0;
servoServos.detach();
}
}
if(servoBouncer.update()){
if(servoBouncer.read()==LOW){
CurrentPosition=!CurrentPosition;
EEPROM.update(i,CurrentPosition);
nextTime=currentTime;
if(servoReverce){
currentAngle=servoAngles[CurrentPosition];
}
else {
currentAngle=servoAngles[!CurrentPosition];
}
servoServos.attach(servoPins);
}
}
}
}
И клипче как работи: https://www.youtube.com/watch?v=akvCsXheF6A
В тмоя код не виждам къде превиш detach ...