Включение реверса двигателя по тактовой кнопке.
- Войдите на сайт для отправки комментариев
Чт, 30/05/2019 - 00:28
int ledPin1 = 13; // мотор двери вверх
int ledPin2 = 12; // мотор двери вниз
int switchPin = 7; // кнопка двери старт
int ledPin5 = 3; // реле свет
int ledPin6 = 4; // питание датчиков Холла
int lightSwitchPin = 8; // кнопка двери стоп (ready)
int ledPin3 = 11; // мотор окна вверх
int ledPin4 = 10; // мотор окна вниз
int plusButtonPin = 5; // кнопка окна вверх
int minusButtonPin = 6; // кнопка окна вниз
#define czSwitchPin 9 // сигнал ЦЗ закрыть окно
bool czSwitchPin_state = false; // переменная для хранения состояния кнопки сигнал ЦЗ закрыть окно
uint32_t ms_button = 0;
int statePlus; // переменная для хранения состояния кнопки окно вверх
int stateMinus; // переменная для хранения состояния кнопки окно вниз
int cPlus;
int cMinus;
int valLight;
int stateLight; // переменная для хранения состояния кнопки двери стоп (ready)
int cLight;
int val;
int state; // переменная для хранения состояния кнопки двери старт
int c;
#define TIME 60000 // 60 сек
unsigned long int time;
void setup() {
pinMode (ledPin1, OUTPUT); //пин мотор двери вверх, подключенный, как выход
pinMode (ledPin2, OUTPUT); //пин мотор двери вниз, подключенный, как выход
pinMode (switchPin, INPUT); //пин кнопка двери старт, подключенный, как вход
digitalWrite (ledPin1, LOW); //пин, подключенный, как выход
digitalWrite (ledPin2, LOW); //пин, подключенный, как выход
pinMode (ledPin5, OUTPUT); //пин реле свет, подключенный, как выход
pinMode (ledPin6, OUTPUT); //пин питание датчиков Холла, подключенный, как выход
pinMode (lightSwitchPin, INPUT); //пин кнопка двери стоп (ready), подключенный, как вход
pinMode (czSwitchPin, INPUT); //пин сигнал ЦЗ закрыть окно, подключенный, как вход
digitalWrite (ledPin5, LOW); //пин, подключенный, как выход
digitalWrite (ledPin6, HIGH); //пин, подключенный, как выход
pinMode (ledPin3, OUTPUT); //пин мотор окна вверх, подключенный, как выход
pinMode (ledPin4, OUTPUT); //пин мотор окна вниз, подключенный, как выход
pinMode (plusButtonPin, INPUT); //пин кнопка окна вверх, подключенный, как вход
pinMode (minusButtonPin, INPUT); //пин кнопка окна вниз, подключенный, как вход
digitalWrite (ledPin3, LOW); //пин, подключенный, как выход
digitalWrite (ledPin4, LOW); //пин, подключенный, как выход
pinMode (czSwitchPin, INPUT); //пин сигнал ЦЗ закрыть окно, подключенный, как вход
}
void loop()
{
stateLight = digitalRead(lightSwitchPin); // кнопка двери стоп (ready)
if (stateLight == LOW && cLight == 0) // отпустили кнопку
{
val = 0;
cLight = 1;
}
if (stateLight == HIGH && cLight == 1) // нажали кнопку
{
valLight = ++valLight;
if (valLight == 2)
{
valLight = 1;
}
cLight = 0;
time = millis(); // обнуляем счетчик
}
if (valLight == 0 )
{
digitalWrite (ledPin5, LOW); //пин реле свет, подключенный, как выход
digitalWrite (ledPin6, HIGH); // питание датчиков Холла
}
if (valLight == 1)
{
digitalWrite (ledPin5, HIGH); //пин реле свет, подключенный, как выход
digitalWrite (ledPin6, LOW); // питание датчиков Холла
}
if (valLight == 2)
{
digitalWrite (ledPin5, HIGH); //пин реле свет, подключенный, как выход
digitalWrite (ledPin6, LOW); // питание датчиков Холла
}
if (valLight == 3 )
{
digitalWrite (ledPin5, LOW); //пин реле свет, подключенный, как выход
digitalWrite (ledPin6, HIGH); // питание датчиков Холла
}
// если после 60ти секунд мы не нажали второй раз на кнопку, то возвращаемся в дефолт - тушим светодиоды
if (millis() - time > TIME)
{
if (valLight != 3)
{
valLight = 0;
}
}
{
state = digitalRead(switchPin);
if (state == LOW && c == 0) //отпустили кнопку
{
c = 1;
}
if (state == HIGH && c == 1) // нажали кнопку
{
val = ++val;
if (val == 3)
{
val = 0;
}
c = 0;
time = millis(); // обнуляем счетчик
}
if (val == 0 ) // выключаем светодиоды
{
digitalWrite (ledPin1, LOW); // мотор двери вверх
digitalWrite (ledPin2, LOW); // мотор двери вниз
}
if (val == 1 ) // если кнопку нажали 1 раз нажали и отпустили
{
digitalWrite (ledPin1, HIGH); // мотор двери вверх
digitalWrite (ledPin2, LOW); // мотор двери вниз
}
if (val == 2 ) // если кнопку нажали 2 раз нажали и отпустили
{
digitalWrite (ledPin1, LOW); // мотор двери вверх
digitalWrite (ledPin2, HIGH); // мотор двери вниз
}
if (val == 3) // если кнопку нажали 3 раз нажали и отпустили
{
digitalWrite (ledPin1, LOW); // мотор двери вверх
digitalWrite (ledPin2, LOW); // мотор двери вниз
}
// если после 60ти секунд мы не нажали второй раз на кнопку, то возвращаемся в дефолт - тушим светодиоды
if (millis() - time > TIME)
{
if (val != 3)
{
val = 0;
}
}
}
{
statePlus = digitalRead( plusButtonPin);
stateMinus = digitalRead( minusButtonPin);
if (statePlus == HIGH ) // проверяем нежатали кнопка, если нажата, то buttonState будет HIGH :
{
digitalWrite (ledPin6, LOW); // питание датчиков Холла
digitalWrite (ledPin3, HIGH); // мотор окна вверх
digitalWrite (ledPin4, LOW); // мотор окна вниз
}
else {
digitalWrite(ledPin3, LOW); // мотор окна вверх
}
if (stateMinus == HIGH ) // проверяем нежатали кнопка, если нажата, то buttonState будет HIGH :
{
digitalWrite (ledPin6, LOW); // питание датчиков Холла
digitalWrite (ledPin3, LOW); // мотор окна вверх
digitalWrite (ledPin4, HIGH); // мотор окна вниз
}
else {
digitalWrite(ledPin4, LOW); // мотор окна вниз
}
}
//Блок управления закрытием окна от ЦентроЗамка
{
uint32_t ms = millis();
// фиксируем нажатие кнопки
if( digitalRead(czSwitchPin) == LOW && ( ms - ms_button ) > 5000 )
{
czSwitchPin_state = true;
digitalWrite (ledPin4, LOW);
digitalWrite (ledPin6, LOW); // питание датчиков Холла
digitalWrite (ledPin3, HIGH); // мотор окна вверх
}
// фиксируем отпускание кнопки
if( digitalRead(czSwitchPin) == HIGH )
{
czSwitchPin_state = false;
ms_button = ms;
digitalWrite(ledPin3, LOW); // мотор окна вверх
digitalWrite (ledPin6, HIGH); // питание датчиков Холла
}
}
}
Это что? Вы в смысле хотите оставить миру учебное пособие как это делать? Так хоти пару предложений бы написали что к чему то.
написал ниже.
Это что? Вы в смысле хотите оставить миру учебное пособие как это делать? Так хоти пару предложений бы написали что к чему то.
НЕ сумел сразу отправить в одном блоке.
я так и не поял - это у вас нажатие двух кнопок 200 строк кода занимает?
я так и не поял - это у вас нажатие двух кнопок 200 строк кода занимает?
Нет алгоритм нажатия с 51 по 140 строку.
Ниже управление другими моторами, там все работает.
https://youtu.be/uLGMQ6WG9Kc
Ссылка на видео как должно работать.
Спасибо за подсказку. Сейчас проверю эту версию.
Собственно претензий к valLight у меня и не было, всё выплоняется как задумано.
Вопрос к исполнению val . Всегда первым исполняется val==1.Вторым нажатием переключается на val==2.
А нужно чтобы нажал исполнилось val==1. При следующем запуске valLight. Исполнилось val==2.
Походу я понял свою ошибку.
Кнопкой lightswitch исполняется два алгоритма.
1. Включение реле свет. На 60сек. при повторном нажатии счетчик обнуляется и считает заново.
2.управление запуском и остановом мотора.
А я все обозначил все одной константой и переменной.
Вот у меня все и крутилось возле val=1
А кнопка switch это всего лишь выбор состояния мотора.
Вверх или вниз.