Sterownik LED do podświetlenia schodów, podjazdu i co tam się jeszcze wymyśli

dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

Powoli zbliżam się ku ukończeniu sterownika opartego o projekt http://technika-laika.blogspot.com/2014 ... ow-na.html z małymi modyfikacjami planuję jeszcze dodać ESP oraz rozważam zmianę rezystorów kondensatorów i diody na transoptor przy włącznikach sterujących względem projektu z linka.
Z ESP może być taki problem, że trzeba będzie pokombinować jak i na czym poustawiać GPIO i tu najbardziej odpowiednie było by sterowane jak bramą bo można dać krótkie i długie impulsy i wtedy była by możliwość załączania oświetlenia schodów od dołu do góry z góry na dół, ewentualnie od środka i świecenie stałe.

Poniżej schemat, wizualka PCB oraz obudowa, w którą planuję to wpakować.
Do sterownika będzie można podłączyć do 32 pasków LED tylko będzie potrzebny do tego spory zasilacz w zależności jak one będą długie i prądożerne mogą to być też lampki na trawniku bądź specjalna lampka w formie kostki brukowej na podjeździe.
.
schemat.jpg
schemat.jpg (1.28 MiB) Przejrzano 5300 razy
.
sterownik schodów, podjazdu i oświetlenia zewnętrznego.jpg
sterownik schodów, podjazdu i oświetlenia zewnętrznego.jpg (218.28 KiB) Przejrzano 5302 razy
.
1422544583_85235000.jpg
1422544583_85235000.jpg (200.99 KiB) Przejrzano 5302 razy
Awatar użytkownika
YoMan
Posty: 2250
Rejestracja: czw kwie 30, 2020 5:18 pm
Lokalizacja: Częstochowa

będziesz zamawiał płytkę u majfrendów?
YoMan
________________________________________
Wziąłem udział w Supla Offline Party 2023 ;)
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

Całkiem możliwe uzależniam to od rozmieszczenia ścieżek bo jak na razie rozlokowałem tylko elementy czekam na dostawę obudowy aby precyzyjnie zlokalizować otwory montażowe oraz dokładnie określić wielkość PCB.
elmaya
Posty: 1482
Rejestracja: śr cze 27, 2018 5:48 pm
Lokalizacja: El Saucejo - Sevilla

I was thinking of something similar based on PCA9685, adding a potentiometer to set the speed and using 2 Gpio to activate in one direction or the other.
so it could be connected to almost any device.
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

Projekt chciałem oprzeć na PCA9685 i ESP ale @krycha88 nie widział w tym potencjału ;)
Sam nie napiszę kodu ponieważ przez budowę domu i wykańczanie go mam mocno ograniczone moce przerobowe aby przeznaczyć czas na naukę kodowania w arduino ale może za 2 lata to się zmieni.
W związku z powyższym dokonałem małych modyfikacji innego projektu z gotowym kodem który mi pasował do moich założeń dodając diody LED, moduł zasilania oraz trochę na około możliwość sterowania przez ESP. Jak już kiedyś ogarnę arduino to też bym dodał potencjometry aby sterować czasem podświetlania oraz prędkością załączania się kolejnych stopni.
elmaya
Posty: 1482
Rejestracja: śr cze 27, 2018 5:48 pm
Lokalizacja: El Saucejo - Sevilla

obviously this is not something for GUI Generic as it is something that is out of the ordinary. ;)
but the idea of using an arduino to control PCA9685 and that it is controlled the same as two relays "two inputs one for each direction" would make it possible to connect easily with any ESP82XX as a supplement.

years ago I did something similar to illuminate the hallway of a school but without PCA "on and off in sequence"

I'm considering doing some of this but it won't be quick.
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

W swoim rozwiązaniu mam 3 włączniki
1 załącza oświetlenie od dołu do góry
2 załącza oświetlenie od góry do dołu
3 załącza oświetlenie od środka na dół i do góry
dodatkowo dłuższe przytrzymanie któregokolwiek przycisku załącza oświetlenie na stałe i analogicznie dłuższe przytrzymanie gasi całość.

Tak jak napisałeś wyjścia GPIO ESP do sterowania przekaźnikami chcę podłączyć pod wejścia włączników w arduino.
Zobaczę tylko czy zmieszczę złącze na moduł Wemos czy pady z możliwością wlutowania ESP12F/ESP-07 lub ESP-01M.
elmaya
Posty: 1482
Rejestracja: śr cze 27, 2018 5:48 pm
Lokalizacja: El Saucejo - Sevilla

It would be more compatible if:
1 when activated turns on from bottom to top and stays on while active, when deactivated turns off from top to bottom.
same for 2 and 3 with their respective directions
so you could use stair timer channel and set the duration in the cloud
so it would be compatible with any device/ software
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

Większość tego typu sterowników schodowych działa na zasadzie, że po naciśnięciu przycisku po zapaleniu wszystkich schodów zaczyna ich gaszenie. Do zapalania wykorzystywane są włączniki lub inne czujki np. PIR, mikrofalowe czy odbiciowe wtedy po dojściu na piętro nie trzeba podchodzić do włącznika aby zgasić światło dlatego realizowane jest to czasowo co nie zmienia, że można by tak oprogramować jak opisałeś.
Jeszcze lepiej by było kod całkowicie przenieść na ESP jako samodzielne oprogramowanie, które działało by również bez połączenia z WiFi.
Kod sterownika arduino nie jest duży więc bez problemu zmieści się na ESP. Wtedy bez potencjometrów można by było ustawiać czas załączania się kolejnego schodka, kroki rozjaśniania, maksymalną jasność itp. i sposób działania.
Zamówię potrzebne części i będę kombinował z ESP jak na obecnym etapie mojej wiedzy nie uda mi się tego ogarnąć to zostanę przy arduino i nie będę kombinował. Bo w innym wypadku dzieciaki nie doczekają się osobnych pokoi dla siebie, a ja będę wykańczał dom i siebie z 10 lat ;)

PS
Teraz dopatrzyłem się, że w tym kodzie brakuje pinu do rozświetlania od środka choć autor zaprezentował to na filmiku.

Kod: Zaznacz cały

#include <Tlc5940.h>

const int downButtonPin = 8;     // the number of the pushbutton pin
const int upButtonPin = 7;     // the number of the pushbutton pin
int downButtonState = 0;         // variable for reading the pushbutton status
int upButtonState = 0;         // variable for reading the pushbutton status
int ledCount = 17; //liczba aktywnych wyjść (taśm led)
int brightness = 4095; //maksymalna jasność 
int brightStep = 12; //krok przy rozjaśnianiu
int delayTime = 1;
int outs[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19}; //wyjścia do których podpinane są taśmy

void setup()
{
  Tlc.init();
  pinMode(downButtonPin, INPUT);
  digitalWrite(downButtonPin, HIGH);  
  pinMode(upButtonPin, INPUT);     
  digitalWrite(upButtonPin, HIGH);  

 for (byte diode = 0; diode<ledCount;diode++) {
     Tlc.set(outs[diode], brightness);

 }
 Tlc.update();
  
}

void loop()
{
downButtonState = digitalRead(downButtonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:

 if (downButtonState == LOW) {     
    downButton();
  //  upButton();
  } 

  upButtonState = digitalRead(upButtonPin);
  if (upButtonState == LOW) {     
    upButton();
  } 
}

void downButton() {

 for (int diode = 0; diode<ledCount;diode++) {
   
   int bright = brightness;
   do {
      if (bright<0) {
        bright = 0;
      }
      Tlc.set(outs[diode], bright);
      Tlc.update();

      delay(delayTime);
      bright = bright - brightStep;
   } while (bright>=0);
  }
  
  for (int diode = 0; diode<ledCount;diode++) {
    int bright = 0;
    while (bright<brightness) {
      bright = bright + brightStep;
      if (bright>brightness) {
        bright = brightness;
      }

      Tlc.set(outs[diode], bright);
      Tlc.update();
      delay(delayTime);
    } ;
  }

}

void upButton() {

for (int diode = ledCount-1; diode>=0;diode--) {
   
   int bright = brightness;
   do {
      if (bright<0) {
        bright = 0;
      }
      Tlc.set(outs[diode], bright);
      Tlc.update();

      delay(delayTime);
      bright = bright - brightStep;
   } while (bright>=0);
  }
  
  for (int diode = ledCount-1; diode>=0;diode--) {
    int bright = 0;
    while (bright<brightness) {
      bright = bright + brightStep;
      if (bright>brightness) {
        bright = brightness;
      }

     Tlc.set(outs[diode], bright);
     Tlc.update();
     delay(delayTime);
   } ;
  } 
}


Ten jest z 3 przyciskami - na tyle potrafię coś zrozumieć z kodu :D

Kod: Zaznacz cały

#include <Tlc5940.h>
#include "ClickButton.h"
const int downButtonPin = 8;
const int upButtonPin = 6;
const int midButtonPin = 7;
int ledCount = 18; //liczba aktywnych wyjść (taśm led)
int brightness = 4095; //maksymalna jasność 
int delayTime = 1;
int midStep = 13;
int outs[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; //wyjścia do których podpinane są taśmy
int outState[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// Nr. of buttons in the array
const int buttons = 3;
ClickButton button[3] = {
  ClickButton (downButtonPin, LOW, CLICKBTN_PULLUP),
  ClickButton (upButtonPin, LOW, CLICKBTN_PULLUP),
  ClickButton (midButtonPin, LOW, CLICKBTN_PULLUP),
};
int LEDfunction[buttons]  = { 0, 0, 0 };
const int DOWN_BUTTON = 0;
const int UP_BUTTON = 1;
const int MID_BUTTON = 2;
const int STAN_WYLACZONY = 0;
const int STAN_ROZJASNIANIE_OD_DOLU = 1;
const int STAN_SCIEMNIANIE_OD_DOLU = 2;
const int STAN_ROZJASNIANIE_OD_GORY = 3;
const int STAN_SCIEMNIANIE_OD_GORY = 4;
const int STAN_ROZJASNIANIE_OD_SRODKA = 5;
const int STAN_SCIEMNIANIE_OD_SRODKA = 6;
const int STAN_ROZJASNIANIE_CALOSCI = 7;
const int STAN_SCIEMNIANIE_CALOSCI = 8;
const int STAN_WLACZONY = 9;

const int SCIEMNIANIE_POJEDYNCZE_STEP = 5;
const int SCIEMNIANIE_CALOSCI_STEP = 10;
const int ROZJASNIANIE_POJEDYNCZE_STEP = 25;
const int ROZJASNIANIE_CALOSCI_STEP = 10;
int STAN = STAN_WYLACZONY;
void setup()
{

  Tlc.init();
  for (int i=0; i<buttons; i++)
  {
    // Setup button timers (all in milliseconds / ms)
    // (These are default if not set, but changeable for convenience)
    button[i].debounceTime   = 20;   // Debounce timer in ms
    button[i].multiclickTime = 250;  // Time limit for multi clicks
    button[i].longClickTime  = 800; // Time until long clicks register
  }    
   updateLed();

}


void loop()
{
  
for (int i=0; i<buttons; i++) {
    // Update state of all buitton
    button[i].Update();
  
    // Save click codes in LEDfunction, as clicks counts are reset at next Update()
    if (button[i].clicks != 0) LEDfunction[i] = button[i].clicks;
  
      // Simply toggle LED on single clicks
    // (Cant use LEDfunction like the others here,
    //  as it would toggle on and off all the time)
    if(button[i].clicks == 1) {
      wlaczPianino(i);
    }

    // slow blink (must hold down button. 1 second long blinks)
    if(LEDfunction[i] == -1) {
      ustawStanStaly(i);
      LEDfunction[i] = 0;
    }
  }  
  
  updateCircuitState(); 
  updateLed();
   delay(delayTime);  
}

void updateLed() {
   for (byte diode = 0; diode<ledCount;diode++) {
     Tlc.set(outs[diode], brightness-outState[diode]);
    }
    Tlc.update();
}

void updateCircuitState() {
  if (STAN == STAN_ROZJASNIANIE_OD_DOLU) {
    rozjasnianieOdDolu();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_DOLU) {
    sciemnianieOdDolu();
  }

  if (STAN == STAN_ROZJASNIANIE_OD_GORY) {
    rozjasnianieOdGory();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_GORY) {
    sciemnianieOdGory();
  }
  if (STAN == STAN_ROZJASNIANIE_CALOSCI) {
    rozjasnianieCalosci();
  }
  if (STAN == STAN_SCIEMNIANIE_CALOSCI) {
    sciemnianieCalosci();
  }

  if (STAN == STAN_ROZJASNIANIE_OD_SRODKA) {
    rozjasnianieOdSrodka();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_SRODKA) {
    sciemnianieOdSrodka();
  }

}

void rozjasnianieOdSrodka() {
  bool changed = false;

  for (int diode = midStep; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
  }
  for (int diode = midStep-1; diode>=0;diode--) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
  }
      if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_SRODKA;
    }    

}

void sciemnianieOdSrodka() {
 bool changed = false;

  for (int diode = midStep; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0 ) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
  }
  for (int diode = midStep-1; diode>=0;diode--) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
     
  }
   if (!changed) {
      STAN = STAN_WYLACZONY;
    }  
}

void rozjasnianieCalosci() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_CALOSCI_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
    }
    
     
  }
   if (!changed) {
      STAN = STAN_WLACZONY;
    }  
}

void sciemnianieCalosci() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_CALOSCI_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;

    }
    
   
  }
   if (!changed) {
      STAN = STAN_WYLACZONY;
    }    
}

void rozjasnianieOdDolu() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      
      }
      outState[diode] = newState;
      changed = true;
      break;
    }    
  }
    if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_DOLU;
    }    

}

void sciemnianieOdDolu() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
   }
    if (!changed) {
      STAN = STAN_WYLACZONY;
    }    

}

void rozjasnianieOdGory() {
  bool changed = false;
  for (int diode = ledCount-1; diode>=0;diode--) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
        
  }
  if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_GORY;
    }
}

void sciemnianieOdGory() {
  bool changed = false;
  for (int diode = ledCount-1; diode>=0;diode--) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
  }
     if (!changed) {
      STAN = STAN_WYLACZONY;
    }    
 
}

void wlaczPianino(int button) {
  /*
  jesli swiatla byly wlaczone, tylko plynnie wylaczamy
  */
  if (STAN == STAN_WLACZONY) {
      if (button == DOWN_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_DOLU;
      }
      if (button == UP_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_GORY;
      }
      if (button == MID_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_SRODKA;
      }
  }
  
  /*
  jesli swiatla byly wylaczone, wtedy plynnie wlaczamy
  */
    if (STAN == STAN_WYLACZONY) {
      if (button == DOWN_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_DOLU;
      }
      if (button == UP_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_GORY;
      }
      if (button == MID_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_SRODKA;
      }
  }

}

void ustawStanStaly(int button) {
    Serial.print("ustawStanStaly ");
  Serial.print(button);
  Serial.print(" ");
  Serial.println(STAN);
  if (
      STAN == STAN_WLACZONY ||
      STAN == STAN_SCIEMNIANIE_OD_DOLU ||      
      STAN == STAN_SCIEMNIANIE_OD_GORY ||            
      STAN == STAN_SCIEMNIANIE_OD_SRODKA            
      ) {
    STAN = STAN_SCIEMNIANIE_CALOSCI;
  }
  
  if (
      STAN == STAN_WYLACZONY ||
      STAN == STAN_ROZJASNIANIE_OD_DOLU ||      
      STAN == STAN_ROZJASNIANIE_OD_GORY ||            
      STAN == STAN_ROZJASNIANIE_OD_SRODKA            
     ) {
    STAN = STAN_ROZJASNIANIE_CALOSCI;
  }
}
radzik_r
Posty: 390
Rejestracja: ndz sie 11, 2019 5:32 pm

Do tego idealnie nadawałby się esp32.

Wszystkie piny ma PWMi jest ich dosyć dużo żeby zastąpić arduino z tlc5940, tlc5947, PCA9685.

Mam tą obudowę, jest to Altinkaya RT-209. Na modelu RT-212 zbudowałem sterownik rolet.

Po roletach właśnie chodził mi po głowie budowa właśnie sterownika oświetlenia schodowego opartego o SUPLĘ.

Pomysł godny realizacji.

dobo, elmaya, któryś z was go buduje (realizuje), testuje?

Zastanawiam się czy pójść w ten temat, myślę że PCB nie było by trudne do zaprojektowania.
ODPOWIEDZ

Wróć do „Projekty użytkowników”