помогите разобраться с таймером в программе

kmk
Offline
Зарегистрирован: 22.09.2015

Кнопка, таймер, запускают последовательно функции. в конце тймер обнуляется и всё должно останавливаться. но вторая функция периодически запускается через каждые 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;
     } 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если я правильно понял Вашу задачу, то попробуйте так:

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();
    }
  }

 

kmk
Offline
Зарегистрирован: 22.09.2015

Спасибо

Но не работает, я проверил, даже первая функция не запускается

В моём варианте всё запускается и останвливается после исполнения второй функции но через 10 сек 

идёт запуск второй функции и это всё повторяется. Не могу остановить этот непроизвольный повтор.

vvadim
Offline
Зарегистрирован: 23.05.2012
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; 
} 

 

keefa
Offline
Зарегистрирован: 19.06.2015
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;
  }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

 Код начиная с 29й строчки по 37ю, а это у вас остановка, не будет выполняться потому что ему не дает код с 15 по 23 строк где  val обнуляется и условие 34й строки выполнится не может

kmk
Offline
Зарегистрирован: 22.09.2015

Всем спасибо
НО: в скэтче vvadim идёт запуск первой функции с помощью кнопки и всё, она не останавливается и не переходит во вторую.

В скэтче keefa идет запуск сразу второй функции даже без кнопки и тоже не останавливатся.

В моём скэтче кратковерменное нажатие на кнопку идёт запуск первой функции, через некоторое время автоматически запускается вторая функция и через время останов, ну и потом через 10 сек ложный старт исполнения вторй функции.

--------------------------------
 

keefa
Offline
Зарегистрирован: 19.06.2015

kmk пишет:

Всем спасибо
НО: в скэтче vvadim идёт запуск первой функции с помощью кнопки и всё, она не останавливается и не переходит во вторую.

В скэтче keefa идет запуск сразу второй функции даже без кнопки и тоже не останавливатся.

В моём скэтче кратковерменное нажатие на кнопку идёт запуск первой функции, через некоторое время автоматически запускается вторая функция и через время останов, ну и потом через 10 сек ложный старт исполнения вторй функции.

--------------------------------
 

У меня есть подозрения, что у тебя кнопка шумит. Она у тебя подтянута к минусу через сопротивление? я обычно кнопками комутирую минус, а подтяжку организовываю внутренним сопротивлением в контроллере, что бы не навешивать дополнительные сопротивления. если у тебя вход контроллера висит в воздухе до нажатия кнопки, то на нем может быть что угодно, и 1 и ноль.... может из за этого непонятно как работает код?

 

keefa
Offline
Зарегистрирован: 19.06.2015

вот про что я говорю. Два варианта подключения кнопок.

kmk
Offline
Зарегистрирован: 22.09.2015

наружное сопротивление на землю, как положено. тут что-то не то с этими 10 сек. Я ппопытался убрать val = 0 в 24-25 строке, всё сбиватся и вторая функция не запускается. Может то , что там прописано два таймера и они в конфликте? Убирал  в 37 строке val=0 estate=0. всё прекращает работать. Откуда-то лезет такт 10 сек

 

kmk
Offline
Зарегистрирован: 22.09.2015

у меня UNO one. Первая схема 10к на землю

keefa
Offline
Зарегистрирован: 19.06.2015

kmk пишет:

у меня UNO one. Первая схема 10к на землю

Без разницы.

что мой код, что vvadima, с плюсами минусами должны работать. ищите причину в остальном коде. либо выкладывайте полностью код, а не вырезку... 

kmk
Offline
Зарегистрирован: 22.09.2015
хорошо, это функция первая и вторая:
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));
 
 }  }

 

keefa
Offline
Зарегистрирован: 19.06.2015

В моем коде в 13 строке поменяй   if (val = 10) на   if (val == 10)

Araris
Offline
Зарегистрирован: 09.11.2012

Первая функция запускается один раз после нажатия кнопки, вторая - один раз через 10 секунд.

Попробуйте такой код:

long previousMillis = 0;

void loop(){      

if ( digitalRead(button1) && (previousMillis == 0) )
 {
 previousMillis = millis();
 tune();
 }
if ( (previousMillis != 0) && (millis() - previousMillis >= 10000) )   
 {
 previousMillis = 0; 
 fineTune();
 }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
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;
      }
     }
    } 

 

kmk
Offline
Зарегистрирован: 22.09.2015

Всем кто участвовал, большое спасибо, что удивительно, последний вариант от keefa и vosara работают. хотя прописаны немного по разному. К сожалению от Araris даже нет запуска первой функции. Ещё раз большое спасибо, буду теперь разбираться с логикой написания.