Elektronické svítání

Z HBblog
Přejít na: navigace, hledání

Také vás nebaví vstávat do tmy? Elektronické svítání vám nahradí východ slunce v zimních měsících...

V nastavenou dobu se začne postupně rozsvěcovat RGB LED pásek, postupně od tmavě modré, přes světle modrou, bílou až po teple bílou barvu slunečného rána. Začátek svítání se nastaví na spínacích hodinách, délka svítání je nastavena v kódu (60 minut). Takže ideálně hodinu před zvoněním budíku nastavíte začátek svítán a v době buzení už bude "den". Na spínacích hodinách pak nastavíte kdy má LED pásek zhasnout.

Potřebujete k tomu

  • 1x arduino
  • 3x bezkontaktní výkonový spínač
  • napájecí zdroj 12V/5A
  • RGB LED pásek
  • hlinikový profil pro LED pásek
  • vhodnou krabičku
  • spínací hodiny

Základní zapojení

Arduino-rgb.jpg

Software

// *****************
//   SVITANI v 1.0
// *****************

int red_light_pin= 9;
int green_light_pin = 10;
int blue_light_pin = 11;

int program[6][4] = { {   0,  0,0,0 },
                      {  30,  0,0,100 },
                      {  60, 30,50,100 },
                      { 100, 50,100,100 },
                      { 150,150,150,150 },
                      { 255,255,120,30 }
};

int max_cil = 255;  // prvni hodnota z posledniho radku tabulky

float R = 0;          // hodnoty jasu
float G = 0;
float B = 0;

float R_cil = 0;      // cilove hodnoty v kroku
float G_cil = 0;
float B_cil = 0;

float R_prirustek = 0;  // prirustek hodnoty v kroku
float G_prirustek = 0;
float B_prirustek = 0;

long celkovy_cas = 60; // doba svítání v minutách
long zpozdeni = (celkovy_cas * 60 * 1000) / max_cil;

int dalsi_cil = 0;  // dalsi nacteni programu
int krok = 0;       // aktuální krok programu
                       
void setup() {
  Serial.begin(9600);
  pinMode(red_light_pin, OUTPUT);
  pinMode(green_light_pin, OUTPUT);
  pinMode(blue_light_pin, OUTPUT);
  pinMode(13, OUTPUT);

  krok = program[0][0];
  R = program[0][1];
  G = program[0][2];
  B = program[0][3];

  for (int i = 0; i < max_cil; i++) {
    if (i >= dalsi_cil) {
      krok++;
      dalsi_cil = program[krok][0];
      R_cil = program[krok][1];
      G_cil = program[krok][2];
      B_cil = program[krok][3];

      R_prirustek = (R_cil - R) / (dalsi_cil - i);
      G_prirustek = (G_cil - G) / (dalsi_cil - i);
      B_prirustek = (B_cil - B) / (dalsi_cil - i);  

      Serial.print("Celkovy cas: ");
      Serial.print(celkovy_cas);
      Serial.println(" minut");
      Serial.print("Zpozdeni: ");
      Serial.print(zpozdeni);
      Serial.println(" ms");
      Serial.print(krok);
      Serial.print(". KROK PROGRAMU: ");
      Serial.print(R_cil);
      Serial.print(" ");
      Serial.print(G_cil);
      Serial.print(" ");
      Serial.print(B_cil);
      
      Serial.print(", + ");
      Serial.print(R_prirustek);
      Serial.print(" ");
      Serial.print(G_prirustek);
      Serial.print(" ");
      Serial.println(B_prirustek);
      //delay(5000);
    }

    R = R + R_prirustek;
    G = G + G_prirustek;
    B = B + B_prirustek;

    //Serial.print(i);
    //Serial.print(": RGB => ");
    //Serial.print(R);
    //Serial.print(" ");
    //Serial.print(G);
    //Serial.print(" ");
    //Serial.println(B);
    
    RGB_color(R, G, B);
    delay(zpozdeni);
  }
  Serial.println("KONEC");
  digitalWrite(13,true);
}



void loop() {
  
}



void RGB_color(int red_light_value, int green_light_value, int blue_light_value)
 {
  if (red_light_value > 255) red_light_value = 255;
  if (green_light_value > 255) green_light_value = 255;
  if (blue_light_value > 255) blue_light_value = 255;
  
  analogWrite(red_light_pin, red_light_value);
  analogWrite(green_light_pin, green_light_value);
  analogWrite(blue_light_pin, blue_light_value);
}