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

Ciekawe rozwiązanie. Jaką ma odległość oraz kąt detekcji?
marik_te
Posty: 31
Rejestracja: czw maja 13, 2021 2:50 pm

Prawde mowiac bez problemu ogarnia standardowe schody. Czasami wydaje mi sie ze nawet minimalnie czulosc jest za duza, bo dochodzac do schodow juz ok 1m wczesniej zaczyna sie swiatlo wlaczac. Dodam ze mam czulosc ustawiona praktycznie na minimum. Widze ze sporo potrafi wykryc z odbicia o np przeciwlegla sciane.
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

Może ktoś bardziej obeznany w temacie jest w stanie pomóc i ogarnąć modyfikacje kodu tak aby jeden z wolnych pinów Arduino Nano (po podaniu stanu niskiego np. z ESP) załączał pierwszy i ostatni stopień z jasnością na określonym poziomie np. 200.

Po wprowadzeniu wartości 200 dla pierwszego i ostatniego stopnia w

Kod: Zaznacz cały

int outState[] = {200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200};
i uruchomieniu sterownika pierwszy i ostatni stopień delikatnie świecą, a pozostałe są wyłączone czyli jest tak jak chciałem. Wystarczy, że raz włączę schody np. od dołu zacznie się rozjaśnianie gdy za chwilę zacznie się gaszenie gaszą się wszystkie stopnie włącznie z pierwszym stopniem i ostatnim które miały ustawiony parametr 200.
Domyślam się, że problem jest w tym parametrze outState[diode] = newState i to nieszczęsne newState zmienia początkowe ustawienia podświetlenia stopni.


Poniżej cały kod

Kod: Zaznacz cały

#include <Tlc5940.h>
#include "ClickButton.h"
const int downButtonPin = 7;
const int upButtonPin = 6;
const int midButtonPin = 8;
int ledCount = 17; //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}; //wyjścia do których podpinane są taśmy
int outState[] = {200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200};
// 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;
  }
}
pablo5
Posty: 32
Rejestracja: ndz wrz 20, 2020 8:56 pm

Hej :D
Dzięki uprzejmości kolegi @dobo udało mi się polutować mój sterownik, a teraz zacząłem go uruchamiać - bo schody nie mogą już się doczekać jak zaczną ładnie świecić :lol: :lol:
dobo pisze: pn maja 23, 2022 8:51 pm Może ktoś bardziej obeznany w temacie jest w stanie pomóc i ogarnąć modyfikacje kodu tak aby jeden z wolnych pinów Arduino Nano (po podaniu stanu niskiego np. z ESP) załączał pierwszy i ostatni stopień z jasnością na określonym poziomie np. 200.

Po wprowadzeniu wartości 200 dla pierwszego i ostatniego stopnia w

Kod: Zaznacz cały

int outState[] = {200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200};
Czy chodziło Ci może o coś takiego jak na tym filmiku?
https://drive.google.com/file/d/1D8yyly ... p=drivesdk

Chyba udało mi się to zaimplementować, ale na razie tylko w wersji próbnej i testowej - docelowo ma to działać z czujnikiem światła, tak aby skrajne stopnie podświetlane były tylko nocą (gdy jest ciemno, ogólnie).
dobo
Posty: 1042
Rejestracja: ndz kwie 07, 2019 8:14 pm
Lokalizacja: Nadarzyn

pablo5 pisze: czw sty 12, 2023 11:00 am Hej :D
Dzięki uprzejmości kolegi @dobo udało mi się polutować mój sterownik, a teraz zacząłem go uruchamiać - bo schody nie mogą już się doczekać jak zaczną ładnie świecić :lol: :lol:
dobo pisze: pn maja 23, 2022 8:51 pm Może ktoś bardziej obeznany w temacie jest w stanie pomóc i ogarnąć modyfikacje kodu tak aby jeden z wolnych pinów Arduino Nano (po podaniu stanu niskiego np. z ESP) załączał pierwszy i ostatni stopień z jasnością na określonym poziomie np. 200.

Po wprowadzeniu wartości 200 dla pierwszego i ostatniego stopnia w

Kod: Zaznacz cały

int outState[] = {200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200};
Czy chodziło Ci może o coś takiego jak na tym filmiku?
https://drive.google.com/file/d/1D8yyly ... p=drivesdk

Chyba udało mi się to zaimplementować, ale na razie tylko w wersji próbnej i testowej - docelowo ma to działać z czujnikiem światła, tak aby skrajne stopnie podświetlane były tylko nocą (gdy jest ciemno, ogólnie).
Dokładnie o coś takiego.
Czy ta funkcja załączana i wyłączana jest po podaniu stanu wysokiego lub niskiego na jeden z pinów Nano ?
Ja sterowanie czujnikami zrobiłem poprzez ESP, które załącza czujniki o określonej godzinie (włącz po zachodzie, wyłącz po wschodzie)
Mateuszz21
Posty: 2
Rejestracja: wt lut 21, 2023 4:36 pm

Witam bardzo ciekawy projekt i chciałbym go wykonać ale mam mały problem z programem Eagle nie mogę wygenerować plików i stąd moje pytanie czy ma ktoś może pliki "gerber" tej płytki ?
LukaszH
Posty: 640
Rejestracja: sob gru 14, 2019 11:49 pm

Mateuszz21 pisze: wt lut 21, 2023 4:41 pm Witam bardzo ciekawy projekt i chciałbym go wykonać ale mam mały problem z programem Eagle nie mogę wygenerować plików i stąd moje pytanie czy ma ktoś może pliki "gerber" tej płytki ?
Jeśli ktoś by miał ochotę to mam u siebie 6szt PCB ale z projektu który jest pod obudowę kardex (nie szyna DIN jak kolegów). Ja to robiłem 2 lata temu i o dziwo tak schowałem PCB że o tym zapomniałem. Teraz robiłem trochę przegląd co mam na strychu i leżą
Top.JPG
Top.JPG (148.81 KiB) Przejrzano 616 razy
Bottom.JPG
Bottom.JPG (80.42 KiB) Przejrzano 616 razy
Mateuszz21
Posty: 2
Rejestracja: wt lut 21, 2023 4:36 pm

Fajny projekt i płytka ale mi chodziło bardziej o tą płytkę a raczej jej pliki aby samemu ja zrobić albo komuś ja zlecić.
Załączniki
IMG_20210729_120004.jpg
IMG_20210729_120004.jpg (2.49 MiB) Przejrzano 572 razy
Fryga
Posty: 49
Rejestracja: wt paź 13, 2020 5:57 pm
Lokalizacja: Mińsk Mazowiecki

Ja poprosze - jesli masz - jedna / dwie PCB. Plus schemat lub BOM.
Zainstaluje sobie w garazu.
Dzięki
Wiesiek
Posty: 70
Rejestracja: śr sie 12, 2020 4:51 am
Lokalizacja: Bochnia

Mam taki sterownik na zbyciu jak by ktoś potrzebował.
Załączniki
IMG_20231015_215155.jpg
IMG_20231015_215155.jpg (3.46 MiB) Przejrzano 281 razy
ODPOWIEDZ

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