Добрый день форумчане, нужна ваша объективная оценка кода,это мой первый код.
Суть кода в следующем , есть три режима управление сервоприводом:1 режим это изменение положения сервы кнопками,2 режим это изменения положения сервы от реле(реле разомкнуто одно положение сервы, при замкнутых контактах серва переходит в другое положение. 3 режим управление удаленно) код работает ,но коряво..(1. пока не переключишь все режимы, серва плохо отзывается на нажатие кнопок 2. есть дрожание сервы в крайних положениях)Пока на железку не переносил, делал симуляцию в программе Proteus 7.Буду рад дельным советам.
#include <Servo.h>
int angle = 0; //Текущий угол поворота (при запуске программы будет автоматический вставать в указаное положение)
int maxAngle = 170; //Максимальный угол поворота сервомотора (градусов)
int minAngle = 10; //Минимальный угол поворота сервомотора (градусов)
int angleStep = 2; //Угол единичного шага (градусов)
int stepSpeed = 15; //Скорость шага (скорость поворота)(задержка шага
int valM; //переменная для блютуза подпрограммы
int ButPinR = 7; // Подключаем реле входа к выходу 7
int R_LedPin = 13; // Подключаем красный светодиод к порту 13
int G_LedPin = 12; // Подключаем зеленый светодиод к порту 12
int B_LedPin = 11; // Подключаем синий светодиод к порту 11
int ButPin = 10; // Подключаем кнопку управление режимами к выходу 10
int L = 5; // Подключаем кнопку управление сервой вверх к выходу 5
int R = 4; // Подключаем кнопку к управлению сервой вниз к выходу 4
int flag = 0; // флаг состояния
int regim = 0; // Переключалка
int valL = 0; //Переменная вверх кнопки
int valR = 0; //Переменная вниз кнопки
Servo servoMain; // название сервомашины
int servoPin = 3; // сервомотор подключен на пин 3
void setup()
{
Serial.begin(9600);
servoMain.attach(3);
servoMain.write(90); // выставляем начальный угол сервы
pinMode(L,INPUT); //Цифровой PIN 2 входной сигнал для кнопки "Влево"
pinMode(R,INPUT); //Цифровой PIN 3 входной сигнал для кнопки "Вправо"
pinMode(R_LedPin, OUTPUT);
pinMode(G_LedPin, OUTPUT);
pinMode(B_LedPin, OUTPUT);
pinMode(ButPinR,INPUT); // реле
}
void loop()
{
if(digitalRead(ButPin) == HIGH && flag == 0)
{
regim ++;
flag = 1;
if(regim > 3) // Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 1;
}
}
if(digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 1: R // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ кнопками
if(regim == 1)
{
digitalWrite(R_LedPin, HIGH);
digitalWrite(G_LedPin, LOW);
digitalWrite(B_LedPin, LOW);
{
valR=digitalRead(L); //Читает и запоминает положение левой кнопки
valL=digitalRead(R); //Читает и запоминает положение правой кнопки
if((valL==HIGH)&&(valR==LOW)) //Если левая кнопка нажата а правая нет тогда:
{angle=angle+angleStep; //тогда угол поворота сервомотора меняется по шагово на величину шага (то есть движется влево по 2 градуса до максималтного угла 180 градусов)
if(angle>maxAngle) //Если угол поворота достиг максимального равного 180 градусам,тогда:
{angle=maxAngle;}
//он остается равным максимальному
}
if((valL==LOW)&&(valR==HIGH)) //Все тоже самое как для предыдущей функции но с !инверсией
{angle=angle-angleStep; //
if(angle<minAngle) //
{angle=minAngle;}
//
}
{servoMain.write(angle);
delay(stepSpeed);} //Скорость шагов (задержки шагов)
}
}
// РЕЖИМ 2: G
if(regim == 2) // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ ОТ РЕЛЕ
{
digitalWrite(R_LedPin, LOW);
digitalWrite(G_LedPin, HIGH);
digitalWrite(B_LedPin, LOW);
if(digitalRead(ButPinR)==HIGH)//если контакты реле замкнуты ...
{
servoMain.write(5);
}
else//если не замкнуты...
{
servoMain.write(90);
delay(500);
}}
// РЕЖИМ 3: B // РЕЖИМ УПРАВЛЕНИЕ СЕРВЫ ПО COM-порту
if(regim == 3)
{digitalWrite(R_LedPin, LOW);
digitalWrite(G_LedPin, LOW);
digitalWrite(B_LedPin, HIGH);
if (Serial.available())
{
valM = Serial.read();
if (valM == 'W')
{
servoMain.write(5),Serial.println("серва w "); // При символе "W" серва принимает нулевую позицию
}
if ( valM == 'S')
{
servoMain.write(170),Serial.println("серва s "); //При символе "S" серва принимает 90 градусов позицию
delay(250);
}
}
}}