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

dobo
Posts: 1049
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Spróbuję jeszcze pokombinować z podmianą na TLC5947.
Chyba, że czyta to ktoś bardziej ogarnięty ode mnie i wie gdzie wprowadzić zmiany :D

Jak by co kod poniżej.

Code: Select all

#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;
  }
}
dobo
Posts: 1049
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Sterownik częściowo zmontowany i przetestowany.

https://youtu.be/m6yPE6fRjeI
Nagrywane z ręki więc lekko lata ;)
radzik_r
Posts: 394
Joined: Sun Aug 11, 2019 5:32 pm

Post

Super.
Fajnie, że z diodami wskazującymi stan poszczególnych wyjść bez potrzeby podłączania taśmy led .
User avatar
lesny8
Posts: 2814
Joined: Mon Dec 11, 2017 9:43 pm

Post

Fajny projekt 👏
Czekam na kolejne Supla Offline Party 👍
dobo
Posts: 1049
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Sterownik już kompletny.
Główne linie zasilania wzmocniłem przewodem miedzianym i przyoszczędziłem na cynie ;)
Wlutowane złącza śrubowe trzeba było podzielić i połączyć po 4 sztuki bo Chińczyk walnął się i zamiast wysłać 5,08 wysłał 5,0 inaczej całość nie dało się włożyć w PCB.
W obudowie elementy podtrzymujące PCB wymagały lekkiego podcięcia ponieważ nóżki paru tranzystorów wypadały w ich miejscu, podobnie przy przewodzie miedzianym elementy podtrzymujące PCB na krawędzi również wymagały lekkiego podcięcia.
.
IMG_20210729_120004.jpg
.
IMG_20210729_120121.jpg
.
IMG_20210729_124857.jpg
You do not have the required permissions to view the files attached to this post.
radzik_r
Posts: 394
Joined: Sun Aug 11, 2019 5:32 pm

Post

Fajne.
Nagraj film jak działa.
Gratuluje samozaparcia w projekcie.
dobo
Posts: 1049
Joined: Sun Apr 07, 2019 8:14 pm
Location: Nadarzyn

Post

Nie ma problemu na pewno się pochwalę.
Muszę jeszcze zamówić profile aluminiowe oraz zamontować je z ledami we wcześniej przygotowane frezy.
Najgorszy jest brak czasu, a jak się już czas znajdzie to znowu jest tak, że i brakuje weny twórczej :)
A jak tam twój projekt?
radzik_r
Posts: 394
Joined: Sun Aug 11, 2019 5:32 pm

Post

Pomału w realizacji.
elmaya
Posts: 1482
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

radzik_r
Posts: 394
Joined: Sun Aug 11, 2019 5:32 pm

Post

@elmaya opracowal soft z uzyciem PCA9685 do realizacji sterownika schodowego.
Fajny projekt, wlasnie testuje na złożonej platformie testowej.
You do not have the required permissions to view the files attached to this post.

Return to “Projekty użytkowników”