реле поворотов, вопрос реализации прерываний.
- Войдите на сайт для отправки комментариев
Доброго всем дня, вот возникла такая необходимость.
Задачка: включение поворотника раздельными кнопка(право лево) выключение при нажатии на любую, при нажатии больше 500мс на обе включение аварийки, отключение поворота через 3 сек после начала или в движении
Вроде всё работает, но вот реализовать выключение через 3 сек после начала движения никак не могу победить.
думаю так: подключение датчика холла от спидометра для определения наличия движения, работа через прерывание, и добавить функцию проверки времени в код прерывания или программы.
Столкнулся с такой штукой, при работе программы в порт при нажатии кнопки поворота bt1 или bt2 летит и "0" и слово "time" которое должно появиться только после хотя-бы одного срабатывания прерывания, если нажать кнопку на ножке прерывания в течении секунды видим только "time" что верно, но потом снова чередующиеся 0 time
никак не могу понять где ошибся может кто подскажет?! не судите строго только начинаю разбираться.
#include "button.h" button bt1(PD3); //кнопка левого поворота button bt2(PD4); //кнопка правого поворота const int tr = PD6; //поворот на лево const int tl = PD7; //поворот на право unsigned long pt_time = 0; unsigned long interval = 350; unsigned long lastmillis = 0; unsigned long time_off = 0; unsigned long pt_time_off = 0; volatile bool flag = false; void setup() { Serial.begin(9600); pinMode (tl, OUTPUT); pinMode (tr, OUTPUT); digitalWrite(tr, LOW); digitalWrite(tl, LOW); pinMode(PD2, INPUT); attachInterrupt(0,Speed,FALLING); } void Speed() { lastmillis=millis(); flag=!true; Serial.println(flag); } void loop() { if (bt1.hold() && bt2.hold()) { for(;;) { unsigned long currentMillis = millis(); if(currentMillis - pt_time > interval) { pt_time = currentMillis; digitalWrite(tr, !digitalRead(tr)); digitalWrite(tl, !digitalRead(tl)); } if(bt1.click() || bt2.click()) { digitalWrite(tr, LOW); digitalWrite(tl, LOW); break; } } } if (bt1.click()) { for(;;) { if ((millis()-lastmillis)>1000) { flag = false; Serial.println(flag); } unsigned long currentMillis = millis(); if(currentMillis - pt_time > interval) { pt_time = currentMillis; digitalWrite(tl, !digitalRead(tl)); } if (flag = true) { Serial.println("time"); } if(bt1.click() || bt2.click()) { digitalWrite(tl, LOW); flag==false; break; } } } if (bt2.click()) { for(;;) { if ((millis()-lastmillis)>1000) { flag = false; Serial.println(flag); } unsigned long currentMillis = millis(); if(currentMillis - pt_time > interval) { pt_time = currentMillis; digitalWrite(tr, !digitalRead(tr)); } if(flag = true) { Serial.println("time"); } if(bt1.click() || bt2.click()) { digitalWrite(tr, LOW); break; } } } }
Таймеры тебе нужны, а не вот это вот всё.
спасибо погляжу!
Но тут то тоже интересно разобраться, почему оно так работает?!
Алгоритм довольно путанный для не подготовленного пользователя. (я не понял).
К тому же вы путаете == и = ,
027 flag=!true; Это ошибка или так и задумано.
Напишите, какая строка выполняется не в то время, и по каким условиям она должна выполняться. Проверьте нет ли там путаницы с = == !=
Может не знает как false пишется?))
с !flag ошибка!
За = и == спасибо! разобрался, поправил, работает как нужно!
отключение поворота через 3 сек после начала или в движении
это зачем такое ?
реле поворотов для постройки кастома. пульты и всё остальное может быть любым и работать должно при всяких итерациях.
Поправил и свернул в функцию обработку нажатия кнопки поворота. В таком виде, на макетке, вроде работает как надо.
получилось как-то так.
Буду рад критике ибо без неё не видно что можно улучшить.
Это ты сам писал?
когда то в институте изучал С но это забылось давно не работаю с ним.
Тут посмотрел уроки по реализации функций.
как избавиться от delay ибо тормозить процессор не правильно.
реализация и программный фильтр дребезга контактов через millis (хотя в реале один фиг разведу на плате через резюк на минус :))
обработка кнопок в классе!(это позаимствовал, хотя можно было и основном файле написать обработчик).
как реализовать прерывания.
дальше как свернуть в функцию поглядел синтаксис.
вроде ничего сложного но как показала практика детские ошибки типа = и == случаются :(
теперь это всё надо будет ещё перенести на ATTINY(там я так понял свои способы по реализации прерываний, но для начала почитать и попробовать а там видно будет) и будет хорошо.
Тут посмотрел уроки по реализации функций.
как избавиться от delay ибо тормозить процессор не правильно.
Но добавили бесконечные циклы. От них тоже надо избавляться тогда уж.
Но добавили бесконечные циклы. От них тоже надо избавляться тогда уж.
В данной реализации это не имеет значения, а так да... буду читать дальше.