Создание диммера без детектора нуля

kalbas0000
Offline
Зарегистрирован: 02.09.2016

Добрый день вечер кому как форумчане ! помогите как соединить два кода вместе чтобы получить ик диммер управляемый двумя кнопкоми пульта. алгоритм такой ! кратковременное нажатие вкл. выкл. светик а долгое + или - яркость ! вот два кода.......


 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

kalbas0000 пишет:

Добрый день вечер кому как форумчане ! помогите как соединить два кода вместе чтобы получить ик диммер управляемый двумя кнопкоми пульта. алгоритм такой ! кратковременное нажатие вкл. выкл. светик а долгое + или - яркость ! вот два кода.......


 

Да, сильный код :)

kalbas0000
Offline
Зарегистрирован: 02.09.2016


#define BUTTON 2
#define RELE_1 4
#define RELE_2 7

#define DELAY 1000

void setup() 
{     
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH);  
  pinMode(RELE_1, OUTPUT);
  pinMode(RELE_2, OUTPUT);
}

void loop() 
{
  static uint32_t smillis = 0;
  static bool flag = 0;
  if(!digitalRead(BUTTON)) 
  {
    if(!smillis) smillis = millis();
    if(!flag && millis()-smillis > DELAY)
    {
      digitalWrite(RELE_2, !digitalRead(RELE_2));
      flag = 1;
    }
  }

  if(smillis && digitalRead(BUTTON))
  {
    if(millis()-smillis <= DELAY && millis()-smillis > 50) 
      digitalWrite(RELE_1, !digitalRead(RELE_1));
    smillis = 0;
    flag = 0;
  }
}

 

kalbas0000
Offline
Зарегистрирован: 02.09.2016
#include 
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
int i;
void setup()
{
irrecv.enableIRIn(); // Start the receiver
pinMode(11, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
if(results.value==0x1 || results.value==0x801){
i=255;
}
if(results.value==0x4 || results.value==0x804){
i=0;
}
if(results.value==0x2 || results.value==0x802){
if(i < 255){
i+=5;
}
}
if(results.value==0x3 || results.value==0x803){
if(i > 0){
i-=5;
}
}
analogWrite(11, i);
irrecv.resume();
}
}

 

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

А что это там за "#include" в первой строке?

И вообще, kalbas0000, Вы же не сами писали эти, прости господи, коды? Поверьте, это не коды - это бред сивой кобылы и объединять их - пустая трата времени.

kalbas0000
Offline
Зарегистрирован: 02.09.2016

вот выкладываю что помог человек! но работает както не правильно. Где косяк помогите если сможете плиз !

#include <IRremote.h>

#define dimmer 11
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;


byte button = 0;
byte licht  = 0;
boolean flag = 0;
unsigned long time;


void setup(){
  irrecv.enableIRIn(); // Start the receiver
  pinMode(dimmer, OUTPUT);
}
void loop(){
  if (irrecv.decode(&results)) {
    time = millis();
    if(results.value==0xFFCF30){// кнопка вкл.
      button = 255;
    }
    if(results.value==0xFF2FD0){//кнопка выкл.
      button = 0;
    }
    irrecv.resume();
    flag = 1;
  }
  if(millis()-time > 100 && flag == 1){
    analogWrite(dimmer, button);
    licht = button;
    flag = 0;
  }
  else {
    if(button == 255 && licht>0 && flag == 1){
      licht--;
      analogWrite(dimmer, licht);
      flag = 0;
    }
    if(button == 0 && licht<254 && flag == 1){
      licht++;
      analogWrite(dimmer, licht);
      flag = 0;
    }
  }
  if(millis()-time > 1000) flag = 0;
}

 

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

kalbas0000, ну поймите Вы, зто бред.

Ну, вот смотрите, первый пример бреда. 

В строке 12 описана переменная time.

Допустим. Вы запустили этот, прости Господи, код. Он начал работать.

Проверка в строке 20 ничего не дала. т.к. сигнал пока ещё не пришёл.

Отлично, программа перебралась на строку 31 и хочет выполнить проверку

if(millis()-time > 100 && flag == 1)

но, простите, а чему у Вас равна перменная time? Вы ей хоть какое-то значение присвоили? 

Ну и вообще. пройдитесь по логике этой программы и подумайте. а что она собственно делает.

kalbas0000
Offline
Зарегистрирован: 02.09.2016

Ребят ! есть готовый рабочий скетч ик диммера только он работает от 3х кнопок одна вкл. выкл. а две регулировка яркости. вопрос ! реально замутить все это дело только от двух кнопок ? за ранее спасибо ! 

#include <IRremote.h> 
#define RECV_PIN 7 
#define OUT1 9
#define POWER 0x2F5807F // кнопка вкл. выкл.
#define KEY1 0xFF2FD0 // яркость +
#define KEY2 0xFFCF30 // яркость -
 
byte flag1, flag2 = 0;
uint32_t val; 
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
irrecv.enableIRIn();  
}
void loop(){
if (irrecv.decode(&results)){ 
if (results.value != 0xFFFFFFFF){
val = results.value;     
}                        
if (val == KEY1){      
if (flag1 > 0)
flag1-=5;
analogWrite(OUT1, flag1);       
}    
if (val == KEY2){     
if (flag1 < 255)
flag1+=5;
analogWrite(OUT1, flag1); 
}   
if (results.value == POWER){  
if (flag1 != 0 && flag2 != 0){ 
analogWrite(OUT1, 0);
flag1 = 0;
flag2 = 0;
}
else{
analogWrite(OUT1, 255); 
flag1 = 255;
flag2 = 255;
}          
}  
irrecv.resume(); 
}
}

 

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

От каких двух, типа "пока одну держишь" яркость нарастает, а пока другую держишь - понижается. Так, что-ли?

kalbas0000
Offline
Зарегистрирован: 02.09.2016

нет ! допустим нажали на пультике кратковременно + светодиод горит нажали кратковременно - светик потух . А если удерживать + яркость плавно растет ну и с - тож самое плавно понижается !

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

Если "удерживать долговременно", то этот код не переделывается. Новый нужен. Дело в том, что пока Вы держите кнопку нажатой, у Вас нет постоянного "сигнала", что она нажата. Вместо этого Вы полстоянно получаете последовательность "нажата"/"отжата" и эту последовательность нужно отрабатывать.

Вчера только это исследовали. Посмотрите тему, начиная с 16-го поста (можете и сначала - невредно).