Добрый день, форумчане!
Прошу помощи у спецов программирования. Сам не могу справиться- не хватает знаний программирования Ардуино. Есть самодельная система перемещения монитора в машине со следующими компонентами и алгоритмом работы: Servo motor1- серва непрерывного вращения, Servo motor2- серва с поворотом на 180 градусов, кнопка включения и выключения системы, которая управляет включением оптопары и соответственно АСС.
Алгоритм работы: подаем напряжение на АСС-включается Servo motor1(каретка движется вперед) до срабатывания концевика (просто рубит "-" питания сервы), включается Servo motor2 на подъем монитора на угол 90 градусов. Сохраняем положение. При пропадании АСС происходит обратный процесс.
Сам вопрос о помощи заключается в следующем: как добавить в программу еще две кнопки, которые будут регулировать угол открытого монитора в пределах +20 градусов, с сохранением в памяти положения? И еще вместо механических концевиков хочу использовать два оптических щелевых прерывателя-как их подключить?
Приведенный код успешно работает, но необходима модернизация системы. Заранее благодарю.
Код
#include <EEPROM.h>
#include <Servo.h>
int ACC = 11;// ААС подключен к 11 пину
Servo motor1;// Создаём объект для контроля сервы непрерывного вращения
int pos = 0; // Переменная для хранения позиции сервы
Servo motor2;// Создаём объект для контроля сервы
int inPin = 2; // контакт, к которому подключена кнопка
int outPin = 3; // контакт, к которому подключен управляющий блок линии АСС
int state = LOW; // Текущее состояние выходного контакта, как "Выкл."
int reading; // the current reading from the input pin
int previous = HIGH; // Начальное состояние контакта
long time = 0; // the last time the output pin was toggled
long debounce = 200; // Время дребезга контакта кнопки
void setup()
{
pinMode(inPin, INPUT_PULLUP);// Устанавливаем контакт, как "Вход" и подключаем к контакту внутренний резистор
pinMode(outPin, OUTPUT); // Устанавливаем контакт,как "Выход"
pinMode(13, OUTPUT); // Устанавливаем контакт, как "Выход"
pinMode(ACC, INPUT); // Устанавливаем контакт, как "Вход"
motor1.attach(10); // Контакт на котором находится Сервопривод непрерывного вращения
motor1.write(91); // Устанавливаем и удерживаем серву в положении "Стоп"
motor2.attach(9); // Контакт на котором находится Сервопривод наклона монитора
motor2.write(0); // Устанавливаем и удерживаем вал сервопривода в крайнем положении
}
void loop()
{
int value = EEPROM.read(0); // Прочитать положение монитора до задержки
delay(2000);// Задержка 2 секунды до выполнения команды "Открыть монитор" или "Закрыть монитор" по линии АСС
if ((value==0) && (EEPROM.read(0)==0) && (digitalRead(ACC)==HIGH)) //Если АСС выключен и положение "монитор открыт", то "закрыть монитор"
{
/////////////////////////////// // Закрытие монитора
digitalWrite(13, LOW); // Выключаемаем светодиод
motor2.write(0); //Движение монитора вниз
delay(800); // Ждем пока отработает сервопривод
motor1.write(0); // Движение каретки монитора назад
delay(5000); // Ждем пока отработает сервопривод
motor1.write(91); // Останавливаем и удерживаем сервопривод
motor1.detach(); // Отключаем Сервопривод
motor2.detach(); // Отключаем Сервопривод
EEPROM.write(0, 255); // Сохраняем положение "Монитор закрыт"
}
if ((value==255) && (EEPROM.read(0)==255) && (digitalRead(ACC)==LOW)) // Если ACC включен и положение "монитор закрыт", то "открыть монитор"
{
/////////////////////////////// // Открытие монитора
digitalWrite(13, HIGH); // Включаем светодиод
motor1.attach(10);// Вновь подключаем контакт на котором находится Сервопривод
motor2.attach(9); // Вновь подключаем контакт на котором находится Сервопривод
motor1.write(180); // Движение каретки монитора вперед
delay(5000); // Ждем пока отработает сервопривод
motor1.write(91); // Останавливаем и удерживаем сервопривод
motor2.write(90); // Движение монитора вверх на угол 90 градусов
EEPROM.write(0, 0); // Сохраняем положение "монитор открыт"
}
reading = digitalRead(inPin);
if (reading == LOW && previous == HIGH && millis() - time > debounce)
{
if (state == LOW)
state = HIGH;
else
state = LOW;
time = millis();
}
digitalWrite(outPin, state);
previous = reading;
}