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!