Добавить таймер без RTC

maksmkv
Offline
Зарегистрирован: 07.04.2013

Всем привет. Может  быть у кого-то есть наработки  или хотя бы примерно с чего начать, есть код 

#include <IRremote.h>
#include <IRremoteInt.h>

int Pwr = A1; // LED
boolean state = 0;

//IR Receiver Module Pin and variable
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  pinMode(Pwr, OUTPUT); // Вывод Pwr выход
  irrecv.enableIRIn(); //Старт ИК-приёмника
}

void loop(){
  if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК  
    if(results.value == 0xFF111){ // Код кнопки POWER    
      state = !state; 
    }
    digitalWrite(Pwr, state); // Пин Pwr 
    irrecv.resume();
  }
}

Данный код щелкает реле по кнопке с пульта ду, собственно хочудобавить установку таймера (как на обычных вентиляторах) - т.е. кнопку нажал, бипер пикнул, таймер  встал  на  отсчет времени,время выбираемся  от 10 минут до  2 часов, подтверждение - сигнал. Как такое  реализовать? Спасибо 

 

Чечако
Offline
Зарегистрирован: 15.06.2018
maksmkv
Offline
Зарегистрирован: 07.04.2013

Вот  набросал  пример, сейчас не могу проверить, есть вероятность,  что заработает? 

#include <IRremote.h>
#include <IRremoteInt.h>

int Pwr = A1; // LED
unsigned long time; //Переменная для  установки  времени
int count_time; //Число нажатий;

boolean state = 0;

time = 0;
count_time=0;

//IR Receiver Module Pin and variable
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  pinMode(Pwr, OUTPUT); // Вывод Pwr выход
  irrecv.enableIRIn(); //Старт ИК-приёмника
}

void loop(){
  if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК  
   
   if(results.value == 0xAA){  //если  нажата кнопка с кодом АА, тогда  выполнить
		digitalWrite(Pwr, state); // включаем реле
		state = !state; 
		time(millis(10000)){ //10 секунд ждем 
			digitalWrite(Pwr, state); // выключаем реле
			state = !state; 
		}
		count_time =1;  // 1-е нажатие  на кнопку
	}
	
	 if((results.value == 0xAA) &&(count_time =1)){  //если уже была нажата кнопка с кодом АА, тогда  выполнить
		digitalWrite(Pwr, state); // включаем реле
		state = !state; 
		time(millis(20000)){ //20 секунд
			digitalWrite(Pwr, state); // выключаем реле
			state = !state; 
		}
		count_time =2; // 1-е нажатие  на кнопку
	}
	
	// и т.д. для 3-4 нажатий
	
	if(results.value == 0xFF111){ // Код кнопки POWER    
      state = !state; 
    }
    digitalWrite(Pwr, state); // Пин Pwr 
    irrecv.resume();
  }
}

Состояния  лучше через case делать?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

maksmkv пишет:

Состояния  лучше через case делать?

Переключение состояний лучше делать через отдельную функцию в которой уже делать case

maksmkv
Offline
Зарегистрирован: 07.04.2013
#include <IRremote.h>
#include <IRremoteInt.h>

int Pwr = A1; // LED
unsigned long time; //Переменная для  установки  времени
int count_time, n; //Число нажатий;

boolean state = 0;

time = 0;
count_time=0;

//IR Receiver Module Pin and variable
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  pinMode(Pwr, OUTPUT); // Вывод Pwr выход
  irrecv.enableIRIn(); //Старт ИК-приёмника
}

void loop(){
  if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК  
   	if(results.value == 0xFF111){ // Код кнопки POWER    
      state = !state; 
    }
    digitalWrite(Pwr, state); // Пин Pwr 
    irrecv.resume();
  }
  
  if(results.value == 0xAA){  //если  нажата кнопка с кодом АА, тогда  выполнить
	 ++n;
	 if (n>5) n=0;
	 button_ch(); 
  }
}


void button_ch(){
switch(n)	
	case 0: 
			digitalWrite(Pwr, state); // включаем реле
			state = !state; 
			break;
	case 1: 	
			digitalWrite(Pwr, state); // включаем реле
			state = !state; 
			time(millis(10000)){ //10 секунд ждем 
			digitalWrite(Pwr, state); // выключаем реле
			state = !state; 
			break;
	
	case 2:		
			digitalWrite(Pwr, state); // включаем реле
			state = !state; 
			time(millis(20000)){ //20 секунд ждем 
			digitalWrite(Pwr, state); // выключаем реле
			state = !state; 
			break;
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
void button_ch(byte n) {
  ...
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maksmkv пишет:
есть вероятность,  что заработает?

Есть, но нулевая.

maksmkv пишет:
сейчас не могу проверить

Что мешает сначала проверить, а потом постить вопросы? Вы куда-то так торопитесь, что не можете дождаться возможности проверить?

maksmkv
Offline
Зарегистрирован: 07.04.2013

ЕвгенийП пишет:

maksmkv пишет:
есть вероятность,  что заработает?

Есть, но нулевая.

maksmkv пишет:
сейчас не могу проверить

Что мешает сначала проверить, а потом постить вопросы? Вы куда-то так торопитесь, что не можете дождаться возможности проверить?

 

Просто, домой возвращаюсь оочень поздно  и  писать коды приходится на работе- проверяю  позже.  По  времени  - не  тороплюсь, но хотелось бы  уже доделать. Что-то  с  этими millis вообще все туго ((( 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maksmkv пишет:

Просто, домой возвращаюсь оочень поздно  и  писать коды приходится на работе- проверяю  позже. 

Ну и не постите вопросов пока сами не прверили. Посмотрите со стороны, как это выглядит: "я человек зантой, мне проверять некогда, а вам делать нехрен, проверьте всё и мне расскажите что там да как".