Zaawansowane sterowanie oświetleniem w salonie

Zrobiłeś coś fajnego z wykorzystaniem Arduino? Pochwal się tym!
ODPOWIEDZ
pomier
Młodszy majsterkowicz
Posty: 7
Rejestracja: 10 lut 2018, 19:11

Zaawansowane sterowanie oświetleniem w salonie

Post autor: pomier » 15 gru 2022, 09:48

Witam serdecznie wszystkich.

Siedzę nad małym projekcikiem i już opisuję co chciałem osiągnąć a co wyszło w praktyce :)

Generalnie po małym remoncie zbudowałem ściankę kinowo/TV z oświetleniem LED dookoła.
Mam tam trzy paski LED oddzielnie zasilane.
ledon.jpg
Moduł sterowania:
1) Power ON/OFF na pilocie : płynne włączenie i wyłączenie LED (w projekcie mam trzy IRF520 sterowane PWM)

2) VolUP/DOWN : ma działać tylko gdy mamy włączone światełka i wykonywać 4 skoki przyciemnienia i rozjaśnienia.
Naciśnięcie klawisza power w każdym momencie przyciemnienia wyłącza płynnie ledy od tego kroku przyciemnienia.

3) Włącznik zbliżeniowy (po prostu czujnik odległości IR) : Zadanie tego modułu to włączenie i wyłączenie LED to samo co power na pilocie.
Zamontowałem na wszelki wypadek, piloty giną baterie padają no i dzieci potrafią naprawdę skutecznie posiać pilota :)
Działą to jak włącznik bezdotykowy, przesuwamy ręką w odległości około 10cm i jest światełko.

4) Przycisk muzyka na pilocie : ta opcja uruchamia dodatkowy moduł audio, który zbiera dźwięk z otoczenia i diody migają w ryt muzyki.
Lubię sobie posłuchać muzyczki i postanowiłem dla zabawy wykorzystać te ledy jak swoisty stroboskop audio lub UVW meter.
Oczywiście nie da się uruchomić tej opcji jeśli mamy włączone światło lub przyciemnione. Działa dopiero jak zrobimy OFF power.

5) Czujnik przeszkód : od góry tam gdzie mam pasek LED 3 (obrazek wyżej) wysuwa się ekran do projektora. Ten czujnik jest zamontowany na środku LED 3. Ekran się wysuwa i diody gasną najpierw płynnie wygasza się pasek LED3 potem te boczne po jakimś czasie (30s)
w tym trybie nie da się uruchomić modułu audio oraz ręcznie włączyć światła. Jeśli ekran się schowa to wszystkie LEDy się płynnie włączają jeśli wcześniej były włączone. Oczywiście gdy LEDy nie są włączone a wysuniemy ekran to nic się nie dzieje. LEDy się nie uruchamiają ale blokada wszystkiego działa tak samo.
IMG_3529 (1).JPG
6) Sterowanie włącz/wyłącz LED z TV: tutaj mam podłączony sygnał 5v z USB TV i ma to działać tylko jako wyłącznik światełek jak wyłączymy TV.
Taka dodatkowa opcja by nie szukać pilota od światełek.

Oczywiście ten kod, który podsyłam działa u mnie wyśmienicie i dokładnie tak jak opisałem.

filmik:
Niestety nie pozwalają mi umieścić linka do filmu.

UAKTUALNIENIE KODU 19-12-2022 godzina 19:07

Kod: Zaznacz cały

#include <Timers.h>
#include <IRremote.h>

int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;

// Nazwy głównych pętli programu ********************************************************************************************
boolean powerONOFF = 0;           // włącz wyłącz zasilanie paska LED
boolean audioONOFF = 0;           // włącz wyłącz zasilanie modułu audio - ledy migaja w rytm muzyki
boolean ekranONOFF = 0;           // włącz wyłącz zasilanie modułu projektor - czujnik wykrywa ekran projekcyjny i wyłącza LEDy
// Koniec nazwy głównych pętli programu *************************************************************************************

// Blokady dla klawiszy pilota **********************************************************************************************
boolean blokadaPowerPilot = 0;         // blokowanie klawisza POWER na pilocie oraz CZUJNIKA ZBLIŻENIOWEGO jak działa inna opcja modułu
boolean blokadaAudioPilot = 0;         // blokowanie klawisza AUDIO na pilocie jak działa inna opcja modułu
boolean blokadaUpDownPilot = 0;        // blokowanie klawisza UP i DOWN na pilocie jak działa inna opcja modułu
boolean blokadaekran = 0;
// Koniec blokady dla klawiszy pilota ***************************************************************************************

// Moduł audio wykrywanie dzwięku MIC ***************************************************************************************
int sensorvalue = 0;              // wykrywanie dzwięku na mikrofonie
int soundsensor = 3;              // pin do którego jest podłączony moduła audio mikrofon
// Koniec moduł audio wykrywanie dzwięku MIC ********************************************************************************

// Elementy czujnik zbliżeniowy ON OFF POWER ********************************************************************************
int przyciskStatus = 0;           // pozycja 0/1 po wykryciu ruchu ręką przed czujnikiem ON/OFF POWER 
const int buttonPin = 8;          // pin do którego jest podłączony moduła IRF zbliżeniowy (wykrywanie przeszkody)
byte OstatnieUstawienie = 0;
unsigned long CzasTrwaniaOdbicia = 50; // millis
unsigned long OstatniCzasWykryciaUstawieniaZmiany = 0;
// Koniec czujnik zbliżeniowy ON OFF POWER **********************************************************************************

// Taśma LED ****************************************************************************************************************
const int ledPin1 = 9;            // Pin Taśma LED 1 lewa strona
const int ledPin2 = 10;           // Pin Taśma LED 2 prawa strona
const int ledPin3 = 6;            // Pin Taśma LED 3 gora strona
// Koniec taśma LED *********************************************************************************************************

const int EkranButtonPin = 7;     // przycisk analogowy lub czujnik przeszkód IR - projektor ekran
int EkranprzyciskStatus = 0;      // pozycja 0/1 po wykryciu wysuwania się kranu projktora ON/OFF POWER 

const int TVButtonPin = 2; 
int TVprzyciskStatus = 0; 

int i = 0;                        // liczenie do 512 dla rozjasniania i przygaszania led jak wciskamy POWER na pilocie. ON liczy od 0 do 256, OFF liczy od 256 do 512
int j = 0;                        // jasność diody LED 0-255 wypełnienie na alalogWrite pin cyfrowy PWM
int klik = 0;                     // zliczanie kliknięc w pilocie UP/DOWN klawisze - jasność świecenia LED

unsigned long CzasTrwaniaOdbiciaTV = 50; // millis
unsigned long OstatniCzasWykryciaUstawieniaZmianyTV = 0;
byte OstatnieUstawienieTV = 0;

int led1=0;
int led2=0;
int led3=0;

LimitedTimerPool timer;





void setup()
{
  Serial.begin(9600);
  pinMode(TVButtonPin, INPUT_PULLUP);
  pinMode(EkranButtonPin, INPUT);
  pinMode(soundsensor, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  timer.connect(0, 2, on);
  timer.connect(1, 3, off);
  timer.connect(3, 20, ekranon);
}



// ************* Start glowna petla bez TIMERa ****************************************************************************
void loop() {
timer.update();

// ************* Start liczenie jasnosci i kroków dla LED ON OFF **********************************************************
if (i > 508)
{
  j = 0;
  i = 0;
}
// ************* Koniec liczenie jasnosci i kroków dla LED ON OFF *********************************************************


// ************* Start pilot **********************************************************************************************
if (irrecv.decode(&results)) {
    irrecv.resume(); // Receive the next value

    switch (results.value) {

     
// ************* Start klawisz POWER na pilocie MALYM OD KLIMY***************************************************************************
      case 0x4FB40BF:
      if (blokadaPowerPilot == 0 && ekranONOFF == 0)
      {
        powerONOFF = !powerONOFF;
         if (powerONOFF == 1)
          {
            blokadaAudioPilot = 1;
          } else {
            blokadaAudioPilot = 0;
          }
        klik=0;
      }
      break;
// ************* koniec klawisz POWER na pilocie MALYM OD KLIMY*************************************************************************
// ************* Start klawisz POWER na pilocie YAMAHA***************************************************************************
      case 0xFE8016E9:
      if (blokadaPowerPilot == 0 && ekranONOFF == 0)
      {
        powerONOFF = !powerONOFF;
         if (powerONOFF == 1)
          {
            blokadaAudioPilot = 1;
          } else {
            blokadaAudioPilot = 0;
          }
        klik=0;
      }
      break;
// ************* koniec klawisz POWER na pilocie YAMAHA*************************************************************************

   
// ************* Start klawisz AUDIO na pilocie OD KLIMY**************************************************************************
      case 0x4FB58A7:
      if (blokadaAudioPilot == 0 ) //&& ekranONOFF == 0
      {
        audioONOFF = !audioONOFF;
          if (audioONOFF == 1)
          {
            for (led1=0; led1 < 255; led1++)
            {
              analogWrite(ledPin1, led1);
              delay (2);
            }
            for (led2=0; led2 < 255; led2++)
            {
              analogWrite(ledPin2, led2);
              delay (2);         
            }
            for (led3=0; led3 < 255; led3++)
            {
              if (ekranONOFF == 1)
              {
                analogWrite(ledPin3, 0);
                } else {
                  analogWrite(ledPin3, led3);
                }
              delay (2);
            } 
            blokadaPowerPilot = 1;
            } else {
            blokadaPowerPilot = 0;
            }

            
            if (audioONOFF == 0)
            {
              for (led3=0; led3 < 255; led3++)
              {
                analogWrite(ledPin1, led3);
                analogWrite(ledPin2, led3);
                if (ekranONOFF == 1)
                {
                  analogWrite(ledPin3, 0);
                  } else {
                    analogWrite(ledPin3, led3);
                  } 
              delay (4);
              } if(led3==255)
              {
                for (led3=255; led3 >= 0; led3--)
                {
                  analogWrite(ledPin1, led3);
                  analogWrite(ledPin2, led3);
                  if (ekranONOFF == 1)
                  {
                    analogWrite(ledPin3, 0);
                  } else {
                    analogWrite(ledPin3, led3);
                  }
                delay (3);
                }
              }
          }
       }
       break;
// ************* koniec klawisz AUDIO na pilocie OD KLIMY ****************
// ************* Start klawisz AUDIO na pilocie YAMAHA**************************************************************************
      case 0xFE809669:
       if (blokadaAudioPilot == 0 ) //&& ekranONOFF == 0
      {
        audioONOFF = !audioONOFF;
          if (audioONOFF == 1)
          {
            for (led1=0; led1 < 255; led1++)
            {
              analogWrite(ledPin1, led1);
              delay (2);
            }
            for (led2=0; led2 < 255; led2++)
            {
              analogWrite(ledPin2, led2);
              delay (2);         
            }
            for (led3=0; led3 < 255; led3++)
            {
              if (ekranONOFF == 1)
              {
                analogWrite(ledPin3, 0);
                } else {
                  analogWrite(ledPin3, led3);
                }
              delay (2);
            } 
            blokadaPowerPilot = 1;
            } else {
            blokadaPowerPilot = 0;
            }

            
            if (audioONOFF == 0)
            {
              for (led3=0; led3 < 255; led3++)
              {
                analogWrite(ledPin1, led3);
                analogWrite(ledPin2, led3);
                if (ekranONOFF == 1)
                {
                  analogWrite(ledPin3, 0);
                  } else {
                    analogWrite(ledPin3, led3);
                  } 
              delay (4);
              } if(led3==255)
              {
                for (led3=255; led3 >= 0; led3--)
                {
                  analogWrite(ledPin1, led3);
                  analogWrite(ledPin2, led3);
                  if (ekranONOFF == 1)
                  {
                    analogWrite(ledPin3, 0);
                  } else {
                    analogWrite(ledPin3, led3);
                  }
                delay (3);
                }
              }
          }
       }
       break;
// ************* koniec klawisz AUDIO na pilocie YAMAHA ****************


// ************* Start klawisz UP na pilocie OD KLIMY rozjasnianie LED ****************
      case 0x4FB50AF:
      if (blokadaUpDownPilot == 0 && ekranONOFF == 0)
      {
        if (klik>=2)
        {
          if (powerONOFF == 1)
          {
            j = j+31;
            i = i-31;
            analogWrite(ledPin1, j);
            analogWrite(ledPin2, j);
            analogWrite(ledPin3, j);
            klik--;
          }
        }
      }
  break;
// ************* Koniec klawisz UP na pilocie OD KLIMY rozjasnianie LED ****************


// ************* Start klawisz DOWN na pilocie OD KLIMY rozjasnianie LED ****************
        case 0x4FB8877:
        if (blokadaUpDownPilot == 0 && ekranONOFF == 0)
        {
          if (klik<=7)
          {
            if (powerONOFF == 1)
            {
              j = j-31;
              i = i+31;
              analogWrite(ledPin1, j);
              analogWrite(ledPin2, j);
              analogWrite(ledPin3, j);
              klik++;
            }
          }
        }
  break;
// ************* Koniec klawisz DOWN na pilocie OD KLIMYrozjasnianie LED ****************
// ************* Start klawisz UP na pilocie YAMAHA rozjasnianie LED ****************
      case 0xFE80B649:
      if (blokadaUpDownPilot == 0 && ekranONOFF == 0)
      {
        if (klik>=2)
        {
          if (powerONOFF == 1)
          {
            j = j+31;
            i = i-31;
            analogWrite(ledPin1, j);
            analogWrite(ledPin2, j);
            analogWrite(ledPin3, j);
            klik--;
          }
        }
      }
  break;
// ************* Koniec klawisz UP na pilocie YAMAHA rozjasnianie LED ****************


// ************* Start klawisz DOWN na pilocie YAMAHA ściemnianie LED ****************
        case 0xFE8036C9:
        if (blokadaUpDownPilot == 0 && ekranONOFF == 0)
        {
          if (klik<=7)
          {
            if (powerONOFF == 1)
            {
              j = j-31;
              i = i+31;
              analogWrite(ledPin1, j);
              analogWrite(ledPin2, j);
              analogWrite(ledPin3, j);
              klik++;
            }
          }
        }
  break;
// ************* Koniec klawisz DOWN na pilocie YAMAHA ściemnianie LED ****************

    }
    irrecv.resume();
   // delay(100);
  } 
// *************** konie pilot *************************










// *************  Start modułu AUDIO ****************
  sensorvalue = digitalRead (soundsensor);
    if (audioONOFF == 1 && blokadaPowerPilot == 1 )
    {
      if (sensorvalue == 1)
      {
        digitalWrite(ledPin1, 1);
        digitalWrite(ledPin2, 1);
        if (ekranONOFF == 1){
          digitalWrite(ledPin3, 0);
        } else {
          digitalWrite(ledPin3, 1);
        }
        
      } else {
        digitalWrite(ledPin1, 0);
        digitalWrite(ledPin2, 0);
        if (ekranONOFF == 1){
          digitalWrite(ledPin3, 0);
        } else {
          digitalWrite(ledPin3, 0);
        }
        }
     }
// *************  koniec modułu AUDIO ****************









// *************  Start czujnik zbliżeniowy ON OFF POWER ****************
przyciskStatus = digitalRead(buttonPin); // bez tego też dziala ??!! dziwne
  if (millis() - OstatniCzasWykryciaUstawieniaZmiany > CzasTrwaniaOdbicia && blokadaPowerPilot == 0 && ekranONOFF == 0)
  {
    byte przyciskStatus = digitalRead(buttonPin);
    if (przyciskStatus != OstatnieUstawienie) 
    {
      OstatniCzasWykryciaUstawieniaZmiany = millis();
      OstatnieUstawienie = przyciskStatus;
      if (przyciskStatus == 0)
      {
        powerONOFF = !powerONOFF;
          if (powerONOFF == 1)
          {
            blokadaAudioPilot = 1;
          } else {
            blokadaAudioPilot = 0;
          }
        klik=0;
      }
    }
  }
// *************  koniec czujnik zbliżeniowy ON OFF POWER ****************








// *************  Start czujnik zbliżeniowy ON OFF ekran się wysuwa ****************
EkranprzyciskStatus = digitalRead(EkranButtonPin);
  if (EkranprzyciskStatus == 0 )
  {
    ekranONOFF = 1;
  } else {
    ekranONOFF = 0;  
  }
// *************  koniec czujnik zbliżeniowy ON OFF ekran się wysuwa ****************









// *************  Start czujnik TV OFF POWER ****************
TVprzyciskStatus = digitalRead(TVButtonPin);
 if (millis() - OstatniCzasWykryciaUstawieniaZmianyTV > CzasTrwaniaOdbiciaTV && blokadaPowerPilot == 0 && ekranONOFF == 0)
  {
    byte TVprzyciskStatus = digitalRead(TVButtonPin);
    if (TVprzyciskStatus != OstatnieUstawienieTV) 
    {
      OstatniCzasWykryciaUstawieniaZmianyTV = millis();
      OstatnieUstawienieTV = TVprzyciskStatus;
      if (TVprzyciskStatus == 1 && powerONOFF == 1)
      {
        powerONOFF = !powerONOFF;
    //    audioONOFF = !audioONOFF;
          if (powerONOFF == 1)
          {
            blokadaAudioPilot = 1;
          } else {
            blokadaAudioPilot = 0;
          }
        klik=0;
      }
    }
  }
// *************  koniec czujnik TV OFF POWER ****************
}
// ************* Koniec glowna petla bez TIMERa *************************











// ************* LEDy się włączają *************************
void on() {
  if (powerONOFF == 1 && blokadaAudioPilot == 1 && ekranONOFF == 0)
  {
    if (i < 254)
    {
      analogWrite(ledPin1, j);
      analogWrite(ledPin2, j);
      analogWrite(ledPin3, j);
      i++;
      j++;
      } else {
        blokadaUpDownPilot = 0;
      }
   }
 }
// ************* koniec LEDy się włączają *************************

// ************* LEDy się wyłączają *************************
void off() {
  if (powerONOFF == 0)
  {
    if (i >= 254)
    {
      analogWrite(ledPin1, j);
      analogWrite(ledPin2, j);
      analogWrite(ledPin3, j);
      i++;
      j--;
    }
  }
}
// ************* koniec LEDy się wyłączają *************************

// ************* Ekran się wysuwa, LEDy gasną *************************
void ekranon() {
  if (ekranONOFF == 1)
  {
    if (i >= 254)
    {
      analogWrite(ledPin1, j);
      analogWrite(ledPin2, j);
      analogWrite(ledPin3, j);
      i++;
      j--;
    }   
  klik=0;
}
}
// ************* koniec Ekran się wysuwa, LEDy gasną *************************
 

 

 
UAKTUALNIENIE KODU 19-12-2022 godzina 19:07

W uaktualnionym kodzie dodałem obsługę ekranu oraz nie ma takiego "piknięcia" led podczas on-off (było widać taki efekt mrygnięcia)
Troszkę zmieniły się funkcje, teraz jak ekran się wysuwa muzykę można włączyć ale bez oświetlenia LED3 (pasek u góry) reszta klawiszy jest nie aktywna
Również jak jest włączony power (wszystkie ledy swiecą) to po wysunięciu ekranu wszystkie gasną bardzo powoli a po zamknięciu ekranu (zwinięciu) ledy uruchamiają się na 100%. Tylko wtedy się włączą jeśli wcześniej były włączone w innym przypadku nic się nie uruchomi.

Opcja wyłączenia wszystkiego też już jest dodana w tym nowym kodzie. Teraz uruchamiam światełka potem jak mam ochotę TV i podczas off TV wszystko gasnie. Oczywiście od razu mogę uruchomić oświetlenie bez TV i mogę włączyć tV w oświetlenie nic się nie zmienia do momentu kliknięcia OFF na TV. :) lub OFF na pilocie.

Jedyne co zauważyłem na ten moment to pulsowanie LED jak mam ustawione wypełnienie na 50.
Problem ten jest tylko jak są sterowane trzy IRF a jak tylko jeden IRF to nie pływa.
Wygląda mi to na problemy z zasilaniem ale jeszcze nie ustaliłem czy zasilacz 12v LED czy zasilacz od atmegi.

Kod ukończony w 99% jeszcze jedna mała zmiana i zabieram się za rysowanie i trawienie płytki.
Podeślę fotki jak to wyszło finalnie oraz filmik (jak administrator mi pozwoli) jak to działa w praktyce.


Dzięki i pozdrawiam wszystkich.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


ODPOWIEDZ

Strony partnerskie: