Включение реверса двигателя по тактовой кнопке.
- Войдите на сайт для отправки комментариев
Чт, 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 это всего лишь выбор состояния мотора.
Вверх или вниз.