Настольная лампа + ИК + выключатель

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Всем привет. Есть у меня настольная светодиодная лампа, (светодиодной она стала после того как в ней сдох блок управления и лампа). Ну и конечно скучно просто включать свет. Хотел прикрутить ИК пульт, но вот буда, я же не программист. Похожие темы есть на форуме, но они не дают не конкретный отвеет, не код. Мне бы не хотелось использовать 25 реле с 10-тью группами контактов. Все на много проще, с точки зрения исполнения конечно, но не с точки зрения кода. Взял за основу это:

const int buttonPin = 3;
const int ledPin =  4;
int buttonState = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW);
  }
}

и это:

#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0;
void setup()
{
irrecv.enableIRIn();
pinMode(4, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
delay(300);
if (results.value == 0x6D52472D) {a=a+1;}
if (a==1){digitalWrite(4, HIGH);} else {digitalWrite(4, LOW); a=0;}
{
delay(50);
}
irrecv.resume();
}
}

в итоге вышло что то такое. конечно понимаю что много не правельно и криво, но в коде выразил все свои мысли и понятно что я имел ввиду и что хочу. Ну я же говарю, я не программист. Писал как мог. Помогите кто чем может))

#include <IRremote.h> //библиотека ик пульта

const int irPin = 2; //вход ик приемника
const int buttonPin = 3; // кнопка вкл/выкл
const int ledPin = 4; // Светодиод

int buttonState = 0; //переменная с состоянием кнопки
int ledState = 0; //переменная состояния светодиода
int irval=0; //переменная для ик пульта

IRrecv irrecv(irPin); //не знаю что это
decode_results results; //не знаю что это

void setup() {
irrecv.enableIRIn(); //вкл. ик приемник
pinMode(buttonPin, INPUT); //кнопка как вход
pinMode(ledPin, OUTPUT); //светодиод как выход


}

void loop() {
ledState = digitalRead(ledPin); //присваиваем переменной статус светодиода
buttonState = digitalRead(buttonPin); //присваиваем переменной статус кнопки
if (irrecv.decode(&results)) //вроде как читаем ик пульт
if (results.value == 0x6D52472D) {irval=irval+1;}

if(buttonState == HIGH && ledState == HIGH) //если кнопка нажата и светодиод горит то...
{
  // выполнять действие A
//если отпустить кнопку то выключить светодиод
//если нажать пульт то выключить светодиод
}
else if(buttonState == HIGH && ledState == LOW) //если кнопка нажата и не светодиод горит то...
{
  // выполнять действие B
//если отпустить кнопку то включить светодиод
//если нажать пульт включить светодиод
}
else if(buttonState == LOW && ledState == HIGH) //если не кнопка нажата и светодиод горит то...
{
  // выполнить действие C
//если нажать кнопку то выключить светодиод
//если нажать пульт выключить светодиод
}
else if(buttonState == LOW && ledState == LOW) //если кнопка не нажата и светодиод не горит то...
{
  // выполнять действие  D
//если нажать кнопку то включить светодиод
//если нажать пульт включить светодиод
}

}

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

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Спасибо что помогли. А можете еще помочь??? Немного подумал и сделал так...


#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0;
const int buttonPin = 3;
const int ledPin =  4;
int buttonState = 0;

void setup() {
  irrecv.enableIRIn();
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop() {

if (buttonState = digitalRead(buttonPin) || irrecv.decode(&results))
{
delay(300);
if (buttonState == HIGH || results.value == 0x6D52472D) {a=a+1;}
if (a==1){digitalWrite(ledPin, HIGH);} else {digitalWrite(ledPin, LOW); a=0;}
{
delay(50);
}
irrecv.resume();
}

}

все хорошо, только при включении кнопкой получае блинк. Помогите избавится пожалуйсто...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Отдели мух от котлет.

buttonState = digitalRead(buttonPin);
if (oldButtonState==LOW && buttonState==HIGH)//включили
{
 digitelWrite(ledPin,HIGH); //включаем свет
 oldButtonState = buttonState;
}
if (oldButtonState==HIGH && buttonState==LOW)//выключили
{
 digitelWrite(ledPin,LOW); //выключаем свет
 oldButtonState = buttonState;
}

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

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

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Ещё осталась пара вопросов. Если я сначала включаю с пульта, а затем переключаю кнопку, то лампа сразу не выключается,

а выключается только с второго переключения. Дальше работает корректно, если не включить с пульта при выключенной кнопке(когда она в лав),

и попытаться выключить кнопкой(переключить кнопку). 

#include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote

#define RECV_PIN 4 // IR приемник
#define OUT1 9// выхода на мосфеты

const int  buttonPin = 7; // кнопка включения с фиксацией

#define POWER_KEY 0xFF00FF // коды пульта ДУ
#define KEY1 0xFF807F // v-
#define KEY2 0xFF40BF // v+


byte analogData1 = 0; // значения аналогово выхода
uint32_t val; 
int buttonState = 0; //переменная состояния кнопки
int oldButtonState = 0; //переменная старое состояние кнопки
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn();  //запускаем ик
Serial.begin(9600); //включаем сериал
pinMode(buttonPin, INPUT); //кнопка как вход
}


void loop() {

buttonState = digitalRead(buttonPin);
  if (oldButtonState==LOW && buttonState==HIGH)
   {
     analogWrite(OUT1, 255); // включаем
     analogData1 = 255;
     oldButtonState = buttonState;
   }
  if (oldButtonState==HIGH && buttonState==LOW)//выключили
   {
     analogWrite(OUT1, 0); // выключаем
     analogData1 = 0;
     oldButtonState = buttonState;
   }
   
  ////////////////////////////////////////////////////////////////////////////
  //************************************************************************//
  ////////////////////////////////////////////////////////////////////////////
  if (irrecv.decode(&results)) { // если пришел пакет  
    if (results.value != 0xFFFFFFFF){ // и этот пакет не FF
      val = results.value; // сохраняем правельный пакет в переменную     
    }                 // если пришел FF, соответственно пропускаем.
    
    /// сверяем значение из переменной val.. если пришла команда повтора (пакет с FF)
    /// в переменной останется прошлый, правельный, пакет и код выполнится повторно. 
    if (val == KEY1){      
       if (analogData1 != 0)analogData1--; // если шим не равно 0 отнимаем 1 
       analogWrite(OUT1, analogData1);    // устанавливаем значение в выход     
    }    
     if (val == KEY2){ // и это вторая кнопка     
       if (analogData1 < 255) analogData1++; // если шим меньше 255 прибовляем 1 
       analogWrite(OUT1, analogData1);  // устанавливаем значение 
    }
 

      
     ///
    if (results.value == POWER_KEY) {  
      if (analogData1 != 0){ // если ШИМ неравно 0
        analogWrite(OUT1, 0); // выключаем
     
        analogData1 = 0;
       
      }
      else {
        analogWrite(OUT1, 255); // включаем
     
        analogData1 = 255;

      }   
     }
    
        
Serial.println(val, HEX); //// ТЕСТЫ!
Serial.println(results.value, HEX); 
Serial.println(analogData1); 
Serial.println();
Serial.print("положение кнопки ");
Serial.println(buttonState);


  irrecv.resume(); 
  }
}