Не работает таймер

yeard
Offline
Зарегистрирован: 31.01.2020

Добрый вечер не работает как следует таймер для включения оптронов через радипульт yk08 уже перепробывал все варианты может кто-нибудь сможет увидеть мою ошибку.В итоге хотел добиться нажал кнопку(кнопки без фиксации) с приемника пришол сигнал на пин ардуино +5v а ардуино по программе вкл выкл свой пин.Пока не нажмут на ту же кнопку для отключения программы.

#define OPTRON_PIN 6 // Вывод к котрому подключена нагрузка
#define TIME_ON_OPTRON 5000  // Время в течении, которого на выводе 1
#define TIME_OFF_OPTRON 5000 // Время в течении, которого на выводе 0
boolean state_optron = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_optron = millis(); // Переменная для хранения времени

int flag = 0; 

 void setup()   
 { 
      pinMode(OPTRON_PIN, OUTPUT);     
     
 } 

 void loop() 

 { 
       
     if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
          
        
       flag=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
       
       
     } 
      
      if(digitalRead(2)==LOW&&flag==1)
       //если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
      {
        if (millis() > new_millis_optron) 
        state_optron = !state_optron;
        digitalWrite(OPTRON_PIN, state_optron);
        if (state_optron){ 
          new_millis_optron = millis() + TIME_ON_OPTRON;
        }
        else {
         new_millis_optron = millis() + TIME_OFF_OPTRON; 
        }
       flag=0;//обнуляем переменную flag 
        }
 }
    

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

yeard пишет:

 через радипульт yk08 уже перепробывал все варианты может кто-нибудь сможет увидеть мою ошибку.В итоге хотел добиться нажал кнопку(кнопки без фиксации) с приемника пришол ...

Да легко. Их целых три. В слове "радиопульт" "о" пропущена, в слове "перепробывал" должна быть "о" вместо "ы", и в слове  "пришел" тоже ашыпка.  Исправляй. 

yeard
Offline
Зарегистрирован: 31.01.2020

Ну с этим понятно засыпал когда печатал я про скетч.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

всё неправильно кроме setup

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Условие в 30 строке срабатывает 1 раз. Следующий 1 раз после нажатие на кнопку. А как Вы хотели?

yeard
Offline
Зарегистрирован: 31.01.2020

Хотел после нажатия на кнопку срабатывает условие в строке 30.И выполняется таймер до тех пор пока кнопку не нажмут еще раз после этого flag обнуляется .

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Так нулите флаг после отработки Вашей программы т.е., похоже, после строки 41

yeard
Offline
Зарегистрирован: 31.01.2020

То есть вот так?

#define OPTRON_PIN 6 // Вывод к котрому подключена нагрузка
#define TIME_ON_OPTRON 5000  // Время в течении, которого на выводе 1
#define TIME_OFF_OPTRON 5000 // Время в течении, которого на выводе 0
boolean state_optron = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_optron = millis(); // Переменная для хранения времени

int flag = 0; 

 void setup()   
 { 
      pinMode(OPTRON_PIN, OUTPUT);     
     
 } 

 void loop() 

 { 
       
     if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
          
        
       flag=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
       
       
     } 
      
      if(digitalRead(2)==LOW&&flag==1)
       //если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
      {
        if (millis() > new_millis_optron) 
        state_optron = !state_optron;
        digitalWrite(OPTRON_PIN, state_optron);
        if (state_optron){ 
          new_millis_optron = millis() + TIME_ON_OPTRON;
        }
        else {
         new_millis_optron = millis() + TIME_OFF_OPTRON; 
       flag=0;//обнуляем переменную flag
        }
        
        }
 }
    

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Строки 34, 38, 41 не самое лучшее решение. В вашей задаче вряд ли скажется, на длительно работающих проектах, выстрелит. Используйте разницу, а не суммируйте.

yeard
Offline
Зарегистрирован: 31.01.2020

А как это реализовать ? Просто это мой первый код.

bwn
Offline
Зарегистрирован: 25.08.2014

Почитайте "Великое переполнение миллис", от ЕвгенийП. 

yeard
Offline
Зарегистрирован: 31.01.2020

Все равно нажимаю кнопку появляется +5v и не работает прерывание и не отключается +5v  с контакта d6.

Подскажите пожалуйста уже измучился.

bwn
Offline
Зарегистрирован: 25.08.2014

Чтобы заработало, надо делать так. Читать вдумчиво.

yeard
Offline
Зарегистрирован: 31.01.2020

Я прочитал не могу понять как это относится к включение программы с кнопки и работы по таймеру и при повторном нажатие отключение программы?То есть в том случаи со светом нужно реагировать на человека включая свет а когда человека нет на месте считывать состояние датчика и включать свет но не как работа по времени.Или вы имели ввиду переделать программу чтобы вместо человека реагировало на нажатие кнопки? Через чур за умно для меня выходит.

bwn
Offline
Зарегистрирован: 25.08.2014

Там великолепный пример не решения именно вашей задачи, а метода решения любой задачи. Прочтите вдумчиво еще раз и попробуйте сделать как там. Сперва продумать и расписать последовательность действий своими словами, а потом перевести их в код.

b707
Offline
Зарегистрирован: 26.05.2017

yeard пишет:

Хотел после нажатия на кнопку срабатывает условие в строке 30.И выполняется таймер до тех пор пока кнопку не нажмут еще раз после этого flag обнуляется .

Для этого нужен еще флаг. Тот флаг, что у вас есть - отвечает за то, чтоб кнопка при нажатии не срабатывала больше одного раза. А теперь добавьте еще флаг, который покажет программе, что нужно мигать диодом.