Прошу помощи с кодом для реализации поворотников на моте
- Войдите на сайт для отправки комментариев
Приветствую!
Прошу помощи знатоков, т.к. сам в программирование ноль, нужен код для реализации реле поворотников на моте, т.к. родное реле кончилось...
Имеем в арсенали три не фиксированных кнопки - левый поворот, правый поворот, выключить моргание...
Одна фиксированая кнопка - аварийка...
Алгаритм представляю себе такой:
Проверяем состояние кнопки аварийки: 1. вкл.- останавливаем все и моргаем левым и правым 2. выкл. - проверяем состояния остальных кнопок
Кнопка левый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо правый поворот или кнопка аварийки
Кнопка правый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо левый поворот или кнопка аварийки
Прощу прощения за сумбур...
Обратитесь вот сюда.
так то на мотоцикле положения фиксированые в переключателе, а отключение иде нажатием на сам переключательв исходном положении.
Тоже всегда думал, что так, а вот на БМВ не так(((
а какой помощи ты ожидаешь? тебе все равно учится придется. если за тебя делать то раздел тебе подсказали
Одна фиксированая кнопка - аварийка...
Алгаритм представляю себе такой:
Проверяем состояние кнопки аварийки: 1. вкл.- останавливаем все и моргаем левым и правым 2. выкл. - проверяем состояния остальных кнопок
Кнопка левый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо правый поворот или кнопка аварийки
Кнопка правый поворот: 1. нажали один раз - моргаем пока не нажали стоп либо левый поворот или кнопка аварийки
Разумеется можно и так. Но все же правильнее так. Создаете 2 класса кнопок: нефиксированая и фиксированая. Если для нефиксированой нужен 1 обработчик вызываемый при переходе отж-наж, то для фиксированой надо два переходчика отж-наж, наж-отж. Ну еще класс мигающий светодиод для мигания, без обработчиков. Потом пишете обработчики для кнопок для управления кнопок и все.
qwone,
вот ТС пишет
Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?
qwone,
вот ТС пишет
Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?
в школу отправил, во второй класс )))
Это у Вас такой троллинг? Или Вы невнимательно читали сообщение ТС?
А что делать. Сейчас на программирование на Ардуине достигла такого уровня регресса.Что новички даже простейший скетч не могут слепить. Я бы даже кинул цитату: на Ардуине программирования нет.
Спасибо за отклик, до компа доберусь, попробую набросать..
Решил отписаться, вообщем решил данную задачу)
Сперва написал все с использованием delay()
#define buttonL 2 // кнопка левый указатель #define buttonR 3 // кнопка правый указатель #define buttonS 4 // кнопка стоп #define buttonA 5 // кнопка аварийки #define inL 6 // вывод реле левый указатель #define inR 7 // вывод реле правый указатеьл int tekL = HIGH; int tekR = HIGH; void setup() { pinMode(buttonL, INPUT); pinMode(buttonR, INPUT); pinMode(buttonS, INPUT); pinMode(buttonA, INPUT); pinMode(inL, OUTPUT); pinMode(inR, OUTPUT); digitalWrite(buttonL, HIGH); digitalWrite(buttonR, HIGH); digitalWrite(buttonS, HIGH); digitalWrite(buttonA, HIGH); digitalWrite(inL, HIGH); digitalWrite(inR, HIGH); } void loop() { tekL = digitalRead(buttonL); tekR = digitalRead(buttonR); while(tekL == LOW && digitalRead(buttonS) == HIGH && digitalRead(buttonR) == HIGH && digitalRead(buttonA) == HIGH) { digitalWrite(inL, LOW); delay(350); digitalWrite(inL, HIGH); delay(350); } while(tekR == LOW && digitalRead(buttonS) == HIGH && digitalRead(buttonL) == HIGH&& digitalRead(buttonA) == HIGH) { digitalWrite(inR, LOW); delay(350); digitalWrite(inR, HIGH); delay(350); } while(digitalRead(buttonA) == LOW) { digitalWrite(inR, LOW); digitalWrite(inL, LOW); delay(350); digitalWrite(inR, HIGH); digitalWrite(inL, HIGH); delay(350); } if (digitalRead(buttonS) == LOW){ tekL = HIGH; tekR = HIGH; } }но меня не устроил данный вариант, поэтому я его переработал во второй вариант
#define buttonL 2 // кнопка левый указатель #define buttonR 3 // кнопка правый указатель #define buttonS 4 // кнопка стоп #define buttonA 5 // кнопка аварийки #define inL 6 // вывод реле левый указатель #define inR 7 // вывод реле правый указатеьл int tekL = HIGH; int tekR = HIGH; void setup() { pinMode(buttonL, INPUT); pinMode(buttonR, INPUT); pinMode(buttonS, INPUT); pinMode(buttonA, INPUT); pinMode(inL, OUTPUT); pinMode(inR, OUTPUT); digitalWrite(buttonL, HIGH); digitalWrite(buttonR, HIGH); digitalWrite(buttonS, HIGH); digitalWrite(buttonA, HIGH); digitalWrite(inL, HIGH); digitalWrite(inR, HIGH); } uint32_t ms, ms1 = 0; bool led_stat = true; bool ll = true; bool lr = true; void loop() { ms = millis(); if(digitalRead(buttonL) == LOW) { tekL = LOW; tekR = HIGH; } if(digitalRead(buttonR) == LOW) { tekR = LOW; tekL = HIGH; } if(tekL == LOW) { digitalWrite(inR, HIGH); if(( ms - ms1 ) > 400 || ms < ms1 ) { ms1 = ms; digitalWrite(inL, ll); ll = !ll; } } if(tekR == LOW) { digitalWrite(inL, HIGH); if(( ms - ms1 ) > 400 || ms < ms1 ) { ms1 = ms; digitalWrite(inR, lr); lr = !lr; } } if(digitalRead(buttonS) == LOW) { tekR = HIGH; digitalWrite(inR, HIGH); tekL = HIGH; digitalWrite(inL, HIGH); } if(digitalRead(buttonA) == LOW) { tekL = HIGH; tekR = HIGH; if( ( ms - ms1 ) > 400 || ms < ms1 ){ ms1 = ms; digitalWrite(inL, led_stat); digitalWrite(inR, led_stat); led_stat = !led_stat; } } if(digitalRead(buttonA) == HIGH && digitalRead(inL) == LOW && digitalRead(inR) == LOW) { digitalWrite(inL, HIGH); digitalWrite(inR, HIGH); } }Этот вариант устраивает больше, но тоже есть свои нюансы, но работает гараздо лучше чем в первом исполнении)
Может кто-нибудь укажет на явные ошибки?
т.к. сам только начинаю в этом разбираться)))
Maglink.Держите код. Код простой, хотя вам покажется сложным. В 2017 уже нет простых вещей. Все вещи сложные, даже те что делают простые вещи.
/*to_Maglink.ino светодиод Led_Right -> 6 1 горит /0 нет Правый поворот светодиод Led_Left -> 7 1 горит /0 нет Левый поворот кнопка Right -> 2 0 нажата/1 нет программная подтядка на+5B Вкл правый поворот кнопка Left -> 3 0 нажата/1 нет программная подтядка на+5B Вкл левый поворот кнопка No_blink -> 4 0 нажата/1 нет программная подтядка на+5B Выкл мигание кнопка Emergency -> 5 0 нажата/1 нет программная подтядка на+5B Аварийка фикст */ //--------------------class Cl_Led------------------------ class Cl_Led { byte pin; bool led = 0; bool stat_blink; // 0 не мигать /1 мигать public: Cl_Led *pnt = NULL; Cl_Led(byte _pin): pin(_pin) {} uint32_t past = 0 ; uint32_t time = 0 ; void setup() { if (this->pnt != NULL) this->pnt->setup(); pinMode (pin, OUTPUT); digitalWrite(pin, LOW); stat_blink = 0; // выкл мигание } void ON() { digitalWrite(pin, HIGH); stat_blink = 0; // выкл мигание } void blink(uint32_t _time = 1000) { stat_blink = 1; // вкл мигание time = _time; past = millis(); digitalWrite(pin, led = 1); } void OFF() { digitalWrite(pin, led = 0); stat_blink = 0; // выкл мигание } void loop() { if (this->pnt != NULL) this->pnt->loop(); if (stat_blink && millis() - past >= time) { digitalWrite(pin, led = !led); } } }; //----------------class Cl_Btn---------------------------- class Cl_Btn { byte pin ; // номер ноги на кнопке void (* Do1)(), (* Do2)(); bool btn, btn_old; bool bounce_btn = 0; // антидребезговый флаг uint32_t past = 0 ; public: Cl_Btn *pnt = NULL; Cl_Btn(byte _pin, void (* _Do1)(), void (* _Do2)()) : pin(_pin), Do1(_Do1), Do2(_Do2) {}; void setup() { if (this->pnt != NULL) this->pnt->setup(); pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой btn = digitalRead(pin); // прочитать реальное значение на выводе}; } void loop() { if (this->pnt != NULL) this->pnt->loop(); if (! bounce_btn && btn != digitalRead(pin)) { // если прошел фронт изм на выводн bounce_btn = 1; // выставить флаг past = millis(); // сделать временую засветку } else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время bounce_btn = 0; // то снять флаг btn_old = btn ; btn = digitalRead(pin) ; // прочитать реальное значение на выводе if (btn_old && !btn) Do1(); if (!btn_old && btn) Do2(); } } }; //-----------------class Cl_sys--------------------------- class Cl_sys { Cl_Led * StartLed = NULL; Cl_Btn * StartBtn = NULL; public: Cl_sys() {}; void setup() { StartLed->setup(); StartBtn->setup(); }; void loop() { StartLed->loop(); StartBtn->loop(); }; void Plug(Cl_Led * Led) { Led->pnt = StartLed; StartLed = Led; }; void Plug(Cl_Btn * Btn) { Btn->pnt = StartBtn; StartBtn = Btn; }; }; //-------------------------------------------- Cl_Led Led_Right(6);// подключить светодиод1 на выв 6 Cl_Led Led_Left(7);// подключить светодиод2 на выв 7 void none() {} // заглушка void Do_Right() { // включить прав поворот Led_Right.blink(500); // 0,5 вкл - 0,5 выкл } void Do_Left() { // включить левый поворот Led_Left.blink(500);// 0,5 вкл - 0,5 выкл } void Do_No_blink() { // выключить мигание Led_Right.OFF(); Led_Left.OFF(); } void Do_Emergency() { // включить аварийку поворот Led_Left.blink(500);// 0,5 вкл - 0,5 выкл Led_Left.blink(500);// 0,5 вкл - 0,5 выкл } Cl_Btn Right (2 , Do_Right , none ) ;// подключить кнопку на выв 2 Cl_Btn Left (3 , Do_Left , none ) ;// подключить кнопку на выв 3 Cl_Btn No_blink (4 , Do_No_blink , none ) ;// подключить кнопку на выв 4 Cl_Btn Emergency(5 , Do_Emergency, Do_No_blink) ;// подключить кнопку на выв 5 Cl_sys Sys; void setup() { Sys.Plug(&Led_Right); Sys.Plug(&Led_Left ); Sys.Plug(&Right ); Sys.Plug(&Left ); Sys.Plug(&No_blink ); Sys.Plug(&Emergency); Sys.setup(); } void loop() { Sys.loop(); }