Доброго всем дня, вот возникла такая необходимость.
Задачка: включение поворотника раздельными кнопка(право лево) выключение при нажатии на любую, при нажатии больше 500мс на обе включение аварийки, отключение поворота через 3 сек после начала или в движении
Вроде всё работает, но вот реализовать выключение через 3 сек после начала движения никак не могу победить.
думаю так: подключение датчика холла от спидометра для определения наличия движения, работа через прерывание, и добавить функцию проверки времени в код прерывания или программы.
Столкнулся с такой штукой, при работе программы в порт при нажатии кнопки поворота bt1 или bt2 летит и "0" и слово "time" которое должно появиться только после хотя-бы одного срабатывания прерывания, если нажать кнопку на ножке прерывания в течении секунды видим только "time" что верно, но потом снова чередующиеся 0 time
никак не могу понять где ошибся может кто подскажет?! не судите строго только начинаю разбираться.
006 | unsigned long pt_time = 0; |
007 | unsigned long interval = 350; |
008 | unsigned long lastmillis = 0; |
009 | unsigned long time_off = 0; |
010 | unsigned long pt_time_off = 0; |
011 | volatile bool flag = false ; |
016 | pinMode (tl, OUTPUT); |
017 | pinMode (tr, OUTPUT); |
018 | digitalWrite(tr, LOW); |
019 | digitalWrite(tl, LOW); |
021 | attachInterrupt(0,Speed,FALLING); |
028 | Serial .println(flag); |
033 | if (bt1.hold() && bt2.hold()) |
037 | unsigned long currentMillis = millis(); |
038 | if (currentMillis - pt_time > interval) |
040 | pt_time = currentMillis; |
041 | digitalWrite(tr, !digitalRead(tr)); |
042 | digitalWrite(tl, !digitalRead(tl)); |
044 | if (bt1.click() || bt2.click()) |
046 | digitalWrite(tr, LOW); |
047 | digitalWrite(tl, LOW); |
057 | if ((millis()-lastmillis)>1000) |
060 | Serial .println(flag); |
062 | unsigned long currentMillis = millis(); |
063 | if (currentMillis - pt_time > interval) |
065 | pt_time = currentMillis; |
066 | digitalWrite(tl, !digitalRead(tl)); |
070 | Serial .println( "time" ); |
072 | if (bt1.click() || bt2.click()) |
074 | digitalWrite(tl, LOW); |
085 | if ((millis()-lastmillis)>1000) |
088 | Serial .println(flag); |
090 | unsigned long currentMillis = millis(); |
091 | if (currentMillis - pt_time > interval) |
093 | pt_time = currentMillis; |
094 | digitalWrite(tr, !digitalRead(tr)); |
098 | Serial .println( "time" ); |
100 | if (bt1.click() || bt2.click()) |
102 | digitalWrite(tr, LOW); |
Таймеры тебе нужны, а не вот это вот всё.
спасибо погляжу!
Но тут то тоже интересно разобраться, почему оно так работает?!
Алгоритм довольно путанный для не подготовленного пользователя. (я не понял).
К тому же вы путаете == и = ,
027 flag=!true; Это ошибка или так и задумано.
Напишите, какая строка выполняется не в то время, и по каким условиям она должна выполняться. Проверьте нет ли там путаницы с = == !=
Может не знает как false пишется?))
с !flag ошибка!
За = и == спасибо! разобрался, поправил, работает как нужно!
отключение поворота через 3 сек после начала или в движении
это зачем такое ?
реле поворотов для постройки кастома. пульты и всё остальное может быть любым и работать должно при всяких итерациях.
Поправил и свернул в функцию обработку нажатия кнопки поворота. В таком виде, на макетке, вроде работает как надо.
получилось как-то так.
Буду рад критике ибо без неё не видно что можно улучшить.
001
#include "button.h"
002
button bt1(PD3);
//кнопка левого поворота
003
button bt2(PD4);
//кнопка правого поворота
004
const
int
tr = PD6;
//поворот на лево
005
const
int
tl = PD7;
//поворот на право
006
unsigned
long
pt_time = 0;
// переменная для работы мигания.
007
unsigned
long
interval = 350;
//интервал мигания поворота
008
unsigned
long
lastmillis = 0;
// переменная для определения стоим или едем
009
unsigned
long
pt_time_off = 0;
// переменная для работы таймера отключения по времени
010
volatile
bool
flag =
false
;
// флаг едем или нет
011
bool
_turn =
false
;
// флаг была ли нажата кнопка поворота.
012
013
void
setup
()
014
{
015
pinMode (tl, OUTPUT);
016
pinMode (tr, OUTPUT);
017
digitalWrite(tr, LOW);
018
digitalWrite(tl, LOW);
019
pinMode(PD2, INPUT);
020
digitalWrite(PD2, LOW);
021
attachInterrupt(0,Speed,FALLING);
022
}
023
024
void
Speed()
//функция флага едем или нет.
025
{
026
lastmillis=millis();
027
flag=
true
;
028
}
029
030
void
turn(
byte
side)
// функция обработки мигания поворота
031
{
032
for
(;;)
033
{
034
if
((millis()-lastmillis)>1000)
// проверяем если не едем 1 сек то флаг в 0.
035
{
036
flag =
false
;
037
}
038
unsigned
long
currentMillis = millis();
039
if
(currentMillis - pt_time > interval)
040
{
041
pt_time = currentMillis;
042
digitalWrite(side, !digitalRead(side));
043
}
044
if
(flag ==
true
)
045
{
046
if
(millis() - pt_time_off > 10000)
// таймер отключения через 10 сек, после начала движения или в движении.
047
{
048
digitalWrite(side, LOW);
049
_turn =
false
;
050
pt_time_off = 0;
051
break
;
052
}
053
}
054
if
(bt1.click() || bt2.click())
055
{
056
digitalWrite(side, LOW);
057
_turn =
false
;
058
pt_time_off = 0;
059
break
;
060
}
061
}
062
}
063
064
void
loop
()
065
{
066
// аварийка если зажаты 2 кнопки одновременно
067
if
(bt1.hold() && bt2.hold())
068
{
069
for
(;;)
070
{
071
unsigned
long
currentMillis = millis();
072
if
(currentMillis - pt_time > interval)
073
{
074
pt_time = currentMillis;
075
digitalWrite(tr, !digitalRead(tr));
076
digitalWrite(tl, !digitalRead(tl));
077
}
078
if
(bt1.click() || bt2.click())
079
{
080
digitalWrite(tr, LOW);
081
digitalWrite(tl, LOW);
082
break
;
083
}
084
}
085
}
086
087
if
(bt1.click())
// проверяем нажат ли левый поворот
088
{
089
_turn =
true
;
090
pt_time_off=millis();
091
turn(tl);
092
}
093
094
if
(bt2.click())
// проверяем нажат ли правый поворот
095
{
096
_turn =
true
;
097
pt_time_off=millis();
098
turn(tr);
099
}
100
}
Это ты сам писал?
когда то в институте изучал С но это забылось давно не работаю с ним.
Тут посмотрел уроки по реализации функций.
как избавиться от delay ибо тормозить процессор не правильно.
реализация и программный фильтр дребезга контактов через millis (хотя в реале один фиг разведу на плате через резюк на минус :))
обработка кнопок в классе!(это позаимствовал, хотя можно было и основном файле написать обработчик).
как реализовать прерывания.
дальше как свернуть в функцию поглядел синтаксис.
вроде ничего сложного но как показала практика детские ошибки типа = и == случаются :(
теперь это всё надо будет ещё перенести на ATTINY(там я так понял свои способы по реализации прерываний, но для начала почитать и попробовать а там видно будет) и будет хорошо.
Тут посмотрел уроки по реализации функций.
как избавиться от delay ибо тормозить процессор не правильно.
Но добавили бесконечные циклы. От них тоже надо избавляться тогда уж.
Но добавили бесконечные циклы. От них тоже надо избавляться тогда уж.
В данной реализации это не имеет значения, а так да... буду читать дальше.