помогите разобраться с таймером в программе
- Войдите на сайт для отправки комментариев
Чт, 15/10/2015 - 21:57
Кнопка, таймер, запускают последовательно функции. в конце тймер обнуляется и всё должно останавливаться. но вторая функция периодически запускается через каждые 10 сек. Почему и как остановить.
long previousMillis = 0;
int val = 0;
int state = 0;
void loop(){
if(digitalRead(button1) == HIGH && state == 0)
{
state = 1;
}
if (state == 1)
{
tune();
}
if (millis() - previousMillis >=1000)
{
previousMillis = millis();
val++;
}
if(val >= 10)
{
state = 2;
val = 0;
}
if (state == 2)
{
fineTune();
}
if (millis() - previousMillis >=1000)
{
previousMillis = millis();
val++;
}
if(val >= 10)
{
state = 0;
val = 0;
}
Если я правильно понял Вашу задачу, то попробуйте так:
long previousMillis = 0; int val = 0; int state = 0; void loop(){ if(digitalRead(button1) == HIGH && state == 0) { state = 1; tune(); } if (millis() - previousMillis >=1000 && !state) { previousMillis = millis(); val++; } if(val >= 10) { state = 0; val = 0; fineTune(); } }Спасибо
Но не работает, я проверил, даже первая функция не запускается
В моём варианте всё запускается и останвливается после исполнения второй функции но через 10 сек
идёт запуск второй функции и это всё повторяется. Не могу остановить этот непроизвольный повтор.
if(digitalRead(button1) == HIGH && state == 0) { if (millis() - previousMillis >=1000) { previousMillis = millis(); val++; } } if(val < 10) { state = 1; tune(); } if(val > 10) { state = 2; fineTune(); } if(val >= 20) { state = 0; val = 0; previousMillis = 0; }void loop() { if (digitalRead(button1) == HIGH && state == 0) { state = 1; } if (state == 1) { tune(); } if (millis() - previousMillis >= 1000 && state != 0) { previousMillis = millis(); val++; } if (val = 10) { state = 2; } if (state == 2) { fineTune(); } if (val >= 20) { state = 0; val = 0; } }Код начиная с 29й строчки по 37ю, а это у вас остановка, не будет выполняться потому что ему не дает код с 15 по 23 строк где val обнуляется и условие 34й строки выполнится не может
Всем спасибо
НО: в скэтче vvadim идёт запуск первой функции с помощью кнопки и всё, она не останавливается и не переходит во вторую.
В скэтче keefa идет запуск сразу второй функции даже без кнопки и тоже не останавливатся.
В моём скэтче кратковерменное нажатие на кнопку идёт запуск первой функции, через некоторое время автоматически запускается вторая функция и через время останов, ну и потом через 10 сек ложный старт исполнения вторй функции.
--------------------------------
Всем спасибо
НО: в скэтче vvadim идёт запуск первой функции с помощью кнопки и всё, она не останавливается и не переходит во вторую.
В скэтче keefa идет запуск сразу второй функции даже без кнопки и тоже не останавливатся.
В моём скэтче кратковерменное нажатие на кнопку идёт запуск первой функции, через некоторое время автоматически запускается вторая функция и через время останов, ну и потом через 10 сек ложный старт исполнения вторй функции.
--------------------------------
У меня есть подозрения, что у тебя кнопка шумит. Она у тебя подтянута к минусу через сопротивление? я обычно кнопками комутирую минус, а подтяжку организовываю внутренним сопротивлением в контроллере, что бы не навешивать дополнительные сопротивления. если у тебя вход контроллера висит в воздухе до нажатия кнопки, то на нем может быть что угодно, и 1 и ноль.... может из за этого непонятно как работает код?
вот про что я говорю. Два варианта подключения кнопок.
наружное сопротивление на землю, как положено. тут что-то не то с этими 10 сек. Я ппопытался убрать val = 0 в 24-25 строке, всё сбиватся и вторая функция не запускается. Может то , что там прописано два таймера и они в конфликте? Убирал в 37 строке val=0 estate=0. всё прекращает работать. Откуда-то лезет такт 10 сек
у меня UNO one. Первая схема 10к на землю
у меня UNO one. Первая схема 10к на землю
Без разницы.
что мой код, что vvadima, с плюсами минусами должны работать. ищите причину в остальном коде. либо выкладывайте полностью код, а не вырезку...
хорошо, это функция первая и вторая: void tune(){ clockwise(); swrMin=255; swr = analogRead(A0); swr= map(swr,0,1023,0,630); if (swr < swrMin) { swrMin = swr; EEPROM.write(addr, swr); } Serial.print(" SWR - "); Serial.println(swr); //Serial.print(" EPROM - "); Serial.print(EEPROM.read(addr)); } void fineTune(){ swr = analogRead(A0); swr= map(swr,0,1023,0,630); if (abs(swr - (EEPROM.read(addr))) > 2) { if (swr - (EEPROM.read(addr)) > 0) { { stepper.step(-1); swr++; } if (swr - (EEPROM.read(addr)) < 0) { stepper.step(1); swr--; } } Serial.print(" SWR - "); Serial.println(swr); Serial.print(" EPROM - "); Serial.print(EEPROM.read(addr)); } }В моем коде в 13 строке поменяй
if(val = 10) наif(val == 10)Первая функция запускается один раз после нажатия кнопки, вторая - один раз через 10 секунд.
Попробуйте такой код:
long previousMillis = 0; void loop(){ if ( digitalRead(button1) && (previousMillis == 0) ) { previousMillis = millis(); tune(); } if ( (previousMillis != 0) && (millis() - previousMillis >= 10000) ) { previousMillis = 0; fineTune(); } }long previousMillis = 0; int val = 0; int state = 0; void loop(){ if(digitalRead(button1) == HIGH && state == 0) { state = 1; } if (state == 1) { tune(); } if (millis() - previousMillis >=1000 && state == 1) { previousMillis = millis(); val++; if(val >= 10) { state = 2; val = 0; } } if (state == 2) { fineTune(); } if (millis() - previousMillis >=1000 && state == 2) { previousMillis = millis(); val++; if(val >= 10) { state = 0; val = 0; } } }Всем кто участвовал, большое спасибо, что удивительно, последний вариант от keefa и vosara работают. хотя прописаны немного по разному. К сожалению от Araris даже нет запуска первой функции. Ещё раз большое спасибо, буду теперь разбираться с логикой написания.