Lampka RGB z arkusza pleksi

Pochwal się, co ostatnio zmajstrowałeś.
ODPOWIEDZ
st_karol
Młodszy majsterkowicz
Posty: 2
Rejestracja: 21 gru 2015, 10:51

Lampka RGB z arkusza pleksi

Post autor: st_karol » 21 gru 2015, 13:47

Cześć!
Jako, że jest to mój pierwszy post na tym forum, chciałbym się przywitać.
Mam nadzieję, że wątek założyłem w odpowiednim dziale;-)
Od niedawna zacząłem interesować się Arduino, niestety nie za bardzo znam się zarówno na elektronice jak i na programowaniu. Tak więc dopiero poprzez zabawę z Arduino zacząłem się tego uczyć. Wykonałem większość przykładów zawartych w Arduino IDE, ale doszedłem do wniosku, że można zrobić coś więcej.
Wpadłem na pomysł wykonania lampki LED z arkuszy pleksi, na wzór takiej lampki:

https://www youtube com/watch?v=kgPghSJhkzU

Jest to lampka w której za pomocą diod podświetlane są arkusze z przezroczystego tworzywa sztucznego.
Chciałbym aby w podstawie były 3 arkusze pleksi, wszystkie podświetlane za pomocą taśmy LED RGB. Dodatkowo do lampki chciałbym dodać termometr wraz z wyświetlaczem siedmiosegmentowym wyświetlającym zmierzoną temperaturę. Chciałbym również sterować lampką za pomocą pilota. Lampka miałaby być zasilana 12V, a sterowana za pomocą Arduino UNO (taki tylko mam).

Zasada działania lampki:

Zasilanie 12V DC.
Po włączeniu zasilania uruchamia się pomiar temperatury za pomocą termistora MCP7900AE, a następnie pokazanie wartości na wyświetlaczy siedmiosegmentowym trzycyfrowym. (dwie cyfry – wartość zmierzona, trzecia – symbol stopnia). Oświetlenie arkuszy pleksi włączone/wyłączane za pomocą pilota IR, zastosowano odbiornik IR TSOP4836. Dodatkowo oświetlenie będzie działać w trzech trybach:
- tryb 1 – świecenie ciągłe w jednym ze zdefiniowanych kolorów, przełączanie między kolorami odbywa się również za pomocą pilota.
- tryb 2 – kolor oświetlenia zależy od odczytanej temperatury, od koloru niebieskiego (temperatura poniżej 18ºC), przez seledynowy, zielony, pomarańczowy do czerwonego ( temp. powyżej 24ºC).
- tryb 3 – wygaszanie i rozjaśnianie wybranego koloru (jeszcze nie gotowe).

Jak do tej pory układ zbudowany jest na płytce stykowej i zaprogramowany. Wszystko działa prawie tak jak bym chciał…
Prawie… stąd prośba o pomoc. Mam nadzieję, że będziecie w stanie mi pomóc.

Pierwszy problem polega na tym, że odczytywane są różne kody tych samych przycisków na pilocie. W kodzie programu dla każdego wykorzystywanego przycisku przypisane są dwa najczęściej pojawiające się kody, jednak czasami podczas pracy program odczytuje mi cztery, czasami pięć różnych kodów dla tego samego przycisku. Wykorzystuje pilot do sterowania multimediów z laptopa HP Pavilion, pilot jest sprawny, działa prawidłowo z laptopem. Problem pojawia się również przy używaniu innych pilotów. Skąd mogą brać się problemy z odczytaniem kodu przycisku? Odbiornik IR podłączony jest zgodnie z kartą katalogową.

Drugi problem polega na tym, że nie mam pojęcia jak wykonać wcześniej wspomniany tryb 3. Chodzi o płynne rozjaśnianie i ściemnianie taśmy LED przy wcześniej wybranym kolorze. Czy jedyną możliwością jest odpowiednie zmniejszanie wartości „jasności” dla każdego koloru podłączonego do PWM? Czy można to wykonać w jakiś inny, prostszy (szybszy) sposób?

Kod programu:

Kod: Zaznacz cały


#include <IRremote.h>

int A = 2;              //Piny sygnałowe poszczególnych segmantów wyświetlacza 
int B = 3;
int C = 4;
int D = 5;
int E = 6;
int F = 7;
int G = 8;
int H = 12;
int Vc1 = 15;            //Piny zasilające poszczególne cyfry wyświetlacza 7-segmentowego
int Vc2 = 16;
int Vc3 = 17;

int tempSensor = A0;     //analogowe wejście czujnika temperatury MCP7900AE

int IR_Pin = 13;         //Pin sygnału z odbiornika IR TSOP4836

int red = 9;            //Pin czerwonej diody
int green = 10;         //Pin zielonej diody
int blue = 11;          //Pin niebieskiej diody
//int V_LED = 3;

float temp_in;          //Wartość wejściowa z czujnika temperatury
float temp;             //Wartość rzeczywista temperatury, po przeliczeniu
int temp_out;           //Wartość wyjściowa temperatury, wyświetlana 

int przerwa = 50;
int przerwa2 = 2;

int cyfra1;
int cyfra2;
int temp_pom;

int i = 1;
int j = 1;
int DEBUG = 0;          //Zmienna uruchamiająca debuggowanie, dla 1 eksport danych na Serial.port
int on = 0;
int tryb = 0;
int nr_kolor;
int k = 5;


IRrecv irrecv(IR_Pin);
decode_results results;


void setup() {
  // put your setup code here, to run once:

  irrecv.enableIRIn();
  Serial.begin(9600); 

  pinMode (A, OUTPUT);
  pinMode (B, OUTPUT);
  pinMode (C, OUTPUT);
  pinMode (D, OUTPUT);
  pinMode (E, OUTPUT);
  pinMode (F, OUTPUT);
  pinMode (G, OUTPUT);
  pinMode (H, OUTPUT);
  pinMode (Vc1, OUTPUT);
  pinMode (Vc2, OUTPUT);
  pinMode (Vc3, OUTPUT);

  digitalWrite (A, HIGH);
  digitalWrite (B, HIGH);
  digitalWrite (C, HIGH);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, HIGH);
  digitalWrite (H, HIGH);
  
}

void loop() {
   
  if (i == 1)
  {
  temperatura();
  cyfra1 = temp_out/100;
  cyfra2 = (temp_out-(cyfra1*100))/10;
  temp_pom = temp_out/10;
  }
  //segment1(8);
  //segment2(8);
  //segment3(1);
  
  segment1(cyfra1);
  segment2(cyfra2);
  segment3(1);
  i++;
  if (i == 500)
  {
    i=1;
  }
  if (DEBUG == 1) debug();
  
  segment1(cyfra1);
  segment2(cyfra2);
  segment3(1);

  //analogWrite(blue,255);

  if (irrecv.decode(&results)) {
      Serial.print("0x");
      Serial.print(results.value, HEX);
      Serial.print("-----");
    switch (results.value) {
       case 0x800F040C:
            Serial.println("ON/OFF");
            on =! on;
            delay(100);
            break;

       case 0x461B5987:
            Serial.println("ON/OFF");
            on =! on;
            delay(100);
            break;
 
       case 0x800F8420:
            Serial.println("w lewo");
            if (k < 8)
            { 
            k = k+1;
            }
            delay(100);
            break;

        case 0x634A7668:
            Serial.println("w lewo");
            if (k < 8)
            { 
            k = k+1;
            }
            delay(100);
            break;
 
       case 0x800F8421:
            Serial.println("w prawo");
            if (k > 0)
            { 
              k = k- 1;
            }
           
            delay(100);
           break;

        case 0x79945765:
            Serial.println("w prawo");
            if (k > 0)
            { 
              k = k- 1;
            }
           
            delay(100);
           break;
 
       case 0x800F046E:
            Serial.println("tryb 1");
            tryb = 0;
            delay(100);
            break;

       case 0x21328DB1:
            Serial.println("tryb 1");
            tryb = 0;
            delay(100);
            break;
            
       case 0x800F8415:
            Serial.println("tryb 2");
            tryb = 1;          
            delay(100);
            break;

        case 0x6A8BC852:
            Serial.println("tryb 2");
            tryb = 1;          
            delay(100);
            break;

        case 0x800F0414:
            Serial.println("tryb 3");
            tryb = 2;            
            delay(100);
            break;

         case 0x1EF2C5C6:
            Serial.println("tryb 3");
            tryb = 2;            
            delay(100);
            break;
               
         }
         
 
   irrecv.resume();
  }

  if (on == 1)
  {
    if (tryb == 0)
    {
      LED (k);
    }
    
    if (tryb == 1)
    {
    if (temp_pom < 18) LED(5);
    if (temp_pom >= 18 && temp_pom < 20) LED(4);
    if (temp_pom >= 20 && temp_pom < 22) LED(3);
    if (temp_pom >= 22 && temp_pom < 24) LED(8);
    if (temp_pom >= 24) LED(1);
    }
    
    if (tryb == 2)
    {
      if (j==1)
      {
        for (j = 1;j<7;j++)
        {
          LED(j);
          delay(500);
        }
        if (j==7)
        {
          for (j=7; j>0;j--)
          {
            LED(j);
            delay(500);
          }
        }
      }
    }
  }
}

//==========================================================================================

void debug()
{
  Serial.print(i);
  Serial.print(" | ");
  Serial.print(temp_in);
  Serial.print(" | ");
  Serial.print(temp);
  Serial.print(" | ");
  Serial.print(temp_out);
  Serial.print(" | ");
  Serial.print(j);
  Serial.print(" -- ");
  Serial.print(on);
  Serial.print(" - ");
  Serial.print(tryb);
  Serial.print(" - ");
  Serial.print(k);
   Serial.print(" ----- ");
  Serial.println(results.value);
  
}
//---------------------------------------------
void temperatura()
{
  temp_in = analogRead(tempSensor);
  temp = temp_in*5/1024.0;
  temp = temp - 0.5;
  temp = temp / 0.01;
  temp_out = temp*10;
  
}
//-------------------------------------------
void kolo ()
{
  digitalWrite (Vc1, HIGH);
    
  digitalWrite (A, LOW);
  delay (przerwa);
  digitalWrite (B, LOW);
  delay (przerwa);
  digitalWrite (C, LOW);
  delay (przerwa);
  digitalWrite (D, LOW);
  delay (przerwa);
  digitalWrite (E, LOW);
  delay (przerwa);
  digitalWrite (F, LOW);
  delay (przerwa);
  digitalWrite (A, HIGH);
  delay (przerwa);
  digitalWrite (B, HIGH);
  delay (przerwa);
  digitalWrite (C, HIGH);
  delay (przerwa);
  digitalWrite (D, HIGH);
  delay (przerwa);
  digitalWrite (E, HIGH);
  delay (przerwa);
  digitalWrite (F, HIGH);
  delay (przerwa);
}
//-------------------------------------------
void wait()
{
  digitalWrite (Vc1, HIGH);
    
  digitalWrite (A, LOW);
  delay (przerwa);
  digitalWrite (F, HIGH);
  delay (przerwa);
  digitalWrite (B, LOW);
  delay (przerwa);
  digitalWrite (A, HIGH);
  delay (przerwa);  
  digitalWrite (C, LOW);
  delay (przerwa);
  digitalWrite (B, HIGH);
  delay (przerwa);
  digitalWrite (D, LOW);
  delay (przerwa);
  digitalWrite (C, HIGH);
  delay (przerwa);
  digitalWrite (E, LOW);
  delay (przerwa);
  digitalWrite (D, HIGH);
  delay (przerwa);
  digitalWrite (F, LOW);
  delay (przerwa);
  digitalWrite (E, HIGH);
  delay (przerwa);
  
}
//-------------------------------------------
void test()
{
  wait();
  kolo();
  jeden();
  delay (1000);
  dwa();
  delay (1000);
  trzy();
  delay (1000);
  cztery();
  delay (1000);
  piec();
  delay (1000);
  szesc();
  delay (1000);
  siedem();
  delay (1000);
  osiem();
  delay (1000);
  dziewiec();
  delay (1000);
  zero();
  delay(1000);
  kolo();
  delay(1000);
  stopien();
  delay(1000);
  ce();
  delay(1000);
  err();
  delay(1000);
}
//-------------------------------------------
void jeden()
{
  digitalWrite (A, HIGH);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, HIGH);
  digitalWrite (H, HIGH);
}

void dwa()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, HIGH);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, HIGH);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void trzy()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void cztery()
{
  digitalWrite (A, HIGH);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void piec()
{
  digitalWrite (A, LOW);
  digitalWrite (B, HIGH);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, HIGH);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void szesc()
{
  digitalWrite (A, LOW);
  digitalWrite (B, HIGH);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void siedem()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, HIGH);
  digitalWrite (H, HIGH);
}

void osiem()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void dziewiec()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, HIGH);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void zero()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, LOW);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, LOW);
  digitalWrite (G, HIGH);
  digitalWrite (H, HIGH);
}

void stopien()
{
  digitalWrite (A, LOW);
  digitalWrite (B, LOW);
  digitalWrite (C, HIGH);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void ce()
{
  digitalWrite (A, LOW);
  digitalWrite (B, HIGH);
  digitalWrite (C, HIGH);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, LOW);
  digitalWrite (G, HIGH);
  digitalWrite (H, HIGH);
}

void err()
{
  digitalWrite (A, LOW);
  digitalWrite (B, HIGH);
  digitalWrite (C, HIGH);
  digitalWrite (D, LOW);
  digitalWrite (E, LOW);
  digitalWrite (F, LOW);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}

void kropka()
{
  digitalWrite (A, HIGH);
  digitalWrite (B, HIGH);
  digitalWrite (C, HIGH);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, HIGH);
  digitalWrite (H, LOW);
}

void minus()
{
  digitalWrite (A, HIGH);
  digitalWrite (B, HIGH);
  digitalWrite (C, HIGH);
  digitalWrite (D, HIGH);
  digitalWrite (E, HIGH);
  digitalWrite (F, HIGH);
  digitalWrite (G, LOW);
  digitalWrite (H, HIGH);
}
//-------------------------------------------
void wait2()
{
  minus();
  digitalWrite (Vc1, HIGH);
  delay(przerwa);
  digitalWrite (Vc2, HIGH);
  delay(przerwa);
  digitalWrite (Vc1, LOW);
  delay(przerwa);
  digitalWrite (Vc3, HIGH);
  delay(przerwa);
  digitalWrite (Vc2, LOW);
  delay(przerwa);
  digitalWrite (Vc3, LOW);
  delay(przerwa);
  digitalWrite (Vc3, HIGH);
  delay(przerwa);
  digitalWrite (Vc2, HIGH);
  delay(przerwa);
  digitalWrite (Vc3, LOW);
  delay(przerwa);
  digitalWrite (Vc1, HIGH);
  delay(przerwa);
  digitalWrite (Vc2, LOW);
  delay(przerwa);
  digitalWrite (Vc1, LOW);
  delay(przerwa);
}
//-------------------------------------------
void segment1(int znak1)
{
  digitalWrite (Vc1, HIGH);
  switch (znak1)
  {
    case 1:
    jeden();
    break;
    case 2:
    dwa();
    break;
    case 3:
    trzy();
    break;
    case 4:
    cztery();
    break;
    case 5:
    piec();
    break;
    case 6:
    szesc();
    break;
    case 7:
    siedem();
    break;
    case 8:
    osiem();
    break;
    case 9:
    dziewiec();
    break;
    case 0:
    zero();
    break;
  }
  delay (przerwa2);
  digitalWrite (Vc1, LOW);
}

void segment2(int znak2)
{
  digitalWrite (Vc2, HIGH);
  switch (znak2)
  {
    case 1:
    jeden();
    break;
    case 2:
    dwa();
    break;
    case 3:
    trzy();
    break;
    case 4:
    cztery();
    break;
    case 5:
    piec();
    break;
    case 6:
    szesc();
    break;
    case 7:
    siedem();
    break;
    case 8:
    osiem();
    break;
    case 9:
    dziewiec();
    break;
    case 0:
    zero();
    break;
  }
  delay (przerwa2);
  digitalWrite (Vc2, LOW);
}

void segment3(int znak3)
{
  digitalWrite (Vc3, HIGH);
  switch (znak3)
  {
    case 1:
    stopien();
    break;
    case 2:
    ce();
    break;
    case 3:
    minus();
    break;
    case 4:
    err();
    break;
  }
  delay (przerwa2);
  digitalWrite (Vc3, LOW);
}
//-------------------------------------------
void LED (int nr_kolor)
{
  switch (nr_kolor)
  {
    case 1:                     //czerwony
      analogWrite(red, 255);
      analogWrite(green, 0);
      analogWrite(blue, 0);
      break;

    case 2:                     //pomarańczowy
      analogWrite(red, 255);
      analogWrite(green, 255);
      analogWrite(blue, 0);
      break;
      
    case 3:                     //zielony
      analogWrite(red, 0);
      analogWrite(green, 255);
      analogWrite(blue, 0);
      break;
      
    case 4:                     //cyjan
      analogWrite(red, 0);
      analogWrite(green, 255);
      analogWrite(blue, 255);
      break;
      
    case 5:                     //niebieski
      analogWrite(red, 0);
      analogWrite(green, 0);
      analogWrite(blue, 255);
      break;
      
    case 6:                       //magenta
      analogWrite(red, 255);
      analogWrite(green, 0);
      analogWrite(blue, 255);
      break;
      
    case 7:                       //biały
      analogWrite(red, 255);
      analogWrite(green, 255);
      analogWrite(blue, 255);
      break;

    case 8:                     //żółty
      analogWrite(red, 255);
      analogWrite(green, 125);
      analogWrite(blue, 0);
      break;
  }
}


Załączam schemat układu wykonany w programie Fritzing oraz model koncepcyjny gotowej lampki.

Drewnianą podstawę chciałbym wykonać z gotowego, kupionego pudełka drewnianego o wymiarach 205mm x 133mm x 80mm. Nie chcę bawić się w samodzielne wykonanie pudełka, bo znam swoje umiejętności i nie wyjdzie to za ładnie;-)
Arkusze pleksi mają mieć wymiary około 175mm x 100mm x 4mm.
Za wykonanie podstawy zabiorę się jak elektronika zacznie mi działać i jak dostanę pudełko, także z czasem będę uzupełniać wpis.

Wszelkie uwagi, porady, sugestie są jak najbardziej pożądane;-)

Pozdrawiam!
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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


kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Lampka RGB z arkusza pleksi

Post autor: kazzik87 » 21 gru 2015, 14:42

Co do rozjaśniania diod RGB - link
Co do pilota to nie może być tak że ten sam guzik to inny kod odczytany. Nie moższesz zastosowac zwyklego pilotra IR np. takiego - Standart RC5
---
Jeżeli pomogłem to kliknij "Pomógł".
st_karol
Młodszy majsterkowicz
Posty: 2
Rejestracja: 21 gru 2015, 10:51

Re: Lampka RGB z arkusza pleksi

Post autor: st_karol » 28 gru 2015, 19:00

Dzięki za odpowiedź. Artykuł z linka na pewno się przyda, a co do pilota, nie chciałbym kupować dodatkowego pilota, chcę wykorzystać to co mam. Miałem nadzieję, że wszystko będzie działać, zwłaszcza, że pilot z laptopem działa bez zarzutu. Dodatkowo inny pilot, od tv, działa tak samo, dla jednego przycisku zczytywane są różne kody. Stąd moje przypuszczenia, że to wina odbiornika...
Arduino
Majsterkowicz
Posty: 56
Rejestracja: 18 sty 2016, 22:23

Re: Lampka RGB z arkusza pleksi

Post autor: Arduino » 22 sty 2016, 09:42

Szkoda marnować arduino można to zrobić na zaprogramowanej atmedze.
kamildrn
Młodszy majsterkowicz
Posty: 1
Rejestracja: 7 kwie 2016, 09:19
Kontakt:

Re: Lampka RGB z arkusza pleksi

Post autor: kamildrn » 11 kwie 2016, 12:38

Również zrobiłem takie cudeńko na Atmedze. Zamiast pleksy użyłem litrowej butelki po pewnej wódce a w środek wsypałem potłuczone szkło z samochodowej szyby. Mega efekt.
ODPOWIEDZ

Strony partnerskie: