Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

LED stripe med regulerbar vinkel


På hytta hadde jeg en vegg der jeg ønsket meg noe indirekte lys. En LED stripe hadde vært fint men skulle jeg sette den litt ned på veggen for å lyse på taket eller skulle jeg sette den i taket for å lyse ned på veggen? Hmmm hva med å gjøre den styrbar med en steppermotor og tilte den som det passet meg?

 

En U aluminiumsprofl med plass til en LED stripe med adresserbare LEDs.
Profilene kunne henges opp i hver ende med et ELFA garderobestang-feste slik som dette:

 

image.png

 

med en 3D printet plugg 

 

image.png

 

Og så måtte jeg ha en boks på midten der jeg hadde elektronikken og en steppermotor:

 

image.png

 

Det var allerede et lampepunkt i taket og boksen ble laget stor nok til å dekke dette.

 

Fordi steppermotoren jeg hadde var 5V og ganske svak måtte jeg ha et gir. Onshape har ferdige rutiner for Wormgear så jeg definerte et sånn passe stort ett:

 

image.png

 

Så ble det ganske mye fikling og måling, modellering og testprinting:

 

image.png

 

Og når alt var på plass og skulle testes så vise det seg at poweret fra Ali var av dårlig kvalitet og sank spenningen når det ble belastet slik at ESP32'en restartet 😞
Nytt power ble bestillt men jeg orket ikke å printe en ny boks så det fikk være at den var litt oversized:

image.png

 

Stepperen er en slik:
 

image.png

 

og drives av en ULN2003 som ofte følger med når du kjøper se små stepperne

 

image.png

 

For å slippe å måtte styre de høye strømmene med MOS-FET brukte jeg selvfølgelig adresserbare LED

 

image.png

 

Så var det bare å skru alt opp i taket:

 

image.png

 

Fordi lyspunktet i taket styres av en fysisk bryter er det programmert slik at den husker siste innstilling av farge og lysstyrke.

Når den starter tenner den lysene en og en utover (because I can!) 

 

Etter litt testing tror jeg jeg har funnet den optimale vinkelen så det er ikke sikkert jeg lager så mye Alexa kommandoer for å justere denne, men barnebarna har fått en egen regnbue kommando da 🙂

 

Her er en video der jeg skrur på strømmen og ber Alexa om rainbow:

 

 

Foreløpig har HS bare fått disse devicene for testing:

 

 image.png

 

Her er koden rå, dere får heller spørre om dere lurer på noe.

Tar gjerne tips om ting som kan gjøres bedre også.

 

Sitat
#include <Preferences.h>
#include "FastLED.h"
#include "FastLED_RGBW.h"
#include <EspMQTTClient.h>
#define NUM_LEDS 193
#define DATA_PIN 4 //GPIO nr
#define DATA_PIN2 2
CRGBW leds[NUM_LEDS];
CRGB *ledsRGB = (CRGB *) &leds[0];
const uint8_t brightness = 255;
#include <Stepper.h>
 
Preferences preferanser;
 
const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution
 
// ULN2003 Motor Driver Pins
#define MOTORPIN1 19 //GPIO nr
#define MOTORPIN2 18
#define MOTORPIN3 5
#define MOTORPIN4 17
 
// initialize the stepper library
Stepper myStepper(stepsPerRevolution, MOTORPIN1, MOTORPIN3, MOTORPIN2, MOTORPIN4);
 
int lastRed;
int lastGreen;
int lastBlue;
int lastWhite;
volatile int newRed;
volatile int newGreen;
volatile int newBlue;
volatile int newWhite;
 
//MQTT
EspMQTTClient MQTTclient(
  "thePromisedLAN",
  "pwd",
  "192.168.x.x",  // MQTT Broker server ip
  "",   // MQTTUsername Can be omitted if not needed
  "",   // MQTTPassword Can be omitted if not needed
  "takLEDClient",     // Client name that uniquely identify your device
  1883              // The MQTT port, default to 1883. this line can be omitted
);
 
// ****************************************
void setup() {
  // initialize the serial port
  Serial.begin(115200);
 
 // Prefs
 preferanser.begin("Prefs",false);
 lastRed=preferanser.getShort("red",100);
 lastGreen=preferanser.getShort("green",100);
 lastBlue=preferanser.getShort("blue",100);
 lastWhite=preferanser.getShort("white",100);
 
 // FastLED
  FastLED.addLeds<WS2812B, DATA_PIN, RGB>(ledsRGB, getRGBWsize(NUM_LEDS));
  FastLED.addLeds<WS2812B, DATA_PIN2, RGB>(ledsRGB, getRGBWsize(NUM_LEDS));
  FastLED.setBrightness(brightness);
  FastLED.show();
 
 show_last_colors();
 
 MQTTclient.setKeepAlive(60);
 MQTTclient.enableHTTPWebUpdater("meg","hemmelig"); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overridded with enableHTTPWebUpdater("user", "password").
 MQTTclient.enableOTA("pwd"); // Enable OTA (Over The Air) updates. Password defaults to MQTTPassword. Port is the default OTA port. Can be overridden with enableOTA("password", port).
 
//Stepper
  myStepper.setSpeed(10);
   
}
 
void roter (int nRot) {
  // step one revolution in the other direction:
  Serial.print("Roter:");
  nRot=nRot * 1000;
  Serial.println(nRot);
  myStepper.step(nRot);
}
 
// ***************************************
void loop() {
   MQTTclient.loop();
//  colorFill(CRGB::Red);
//  colorFill(CRGB::Green);
//  colorFill(CRGB::Blue);
//  fillWhite();
 //delay(1000);
    // LED Connection status
    if (MQTTclient.isMqttConnected() && MQTTclient.isWifiConnected() ) {
     //        Serial.println("Mqtt wifi");
     }
    if (!MQTTclient.isMqttConnected() && MQTTclient.isWifiConnected() ) {
        leds[NUM_LEDS-1] = CRGBW(0, 0, 255, 0); // blue  for wait MQTT
      //  Serial.println("!Mqtt wifi");
     }
    if (!MQTTclient.isMqttConnected() && !MQTTclient.isWifiConnected() ) {
        leds[NUM_LEDS-1] = CRGBW(255, 0, 0, 0); // red for wait WiFi
      //  Serial.println("!Mqtt !wifi");
     }
}
 
//********************************
 
void show_last_colors() {
    for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CRGBW(lastRed, lastGreen, lastBlue, lastWhite);
      FastLED.show();
    delay(10);
  }
  leds[NUM_LEDS-1] = CRGBW(255, 0, 0, 0); // red for wait WiFi
  FastLED.show();
}
 
void show_new_colors() {
    for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CRGBW(lastRed, lastGreen, lastBlue, lastWhite);
  }
  FastLED.show();
}
 
void skruAvPower() {
  digitalWrite(MOTORPIN1,LOW);
  digitalWrite(MOTORPIN2,LOW);
  digitalWrite(MOTORPIN3,LOW);
  digitalWrite(MOTORPIN4,LOW);  
}
void colorFill(CRGB c){
  for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = c;
    FastLED.show();
    delay(20);
  }
  delay(500);
}
void fillWhite(){
  for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CRGBW(0, 0, 0, 255);
    FastLED.show();
    delay(30);
  }
  delay(500);
}
void fillLast(){
  for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CRGBW(lastRed, lastGreen, lastBlue, lastWhite);
  }
  FastLED.show();
}
void fillall(){
  for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CRGBW(255, 255, 255, 255);
    FastLED.show();
    delay(15);
  }
  delay(500);
}
void rainbow(){
  static uint8_t hue;
  for(int i = 0; i < NUM_LEDS; i++){
    leds[i] = CHSV((i * 256 / NUM_LEDS) + hue, 255, 255);
  }
  FastLED.show();
  hue++;
}
void rainbowLoop(int nSec){
  long millisIn = millis();
  long loopTime = nSec * 1000; //  seconds
  while(millis() < millisIn + loopTime){
    rainbow();
    delay(5);
  }
}        
 
void onConnectionEstablished()
{
   Serial.println("onConnectionEstablished");
  leds[NUM_LEDS-1] = CRGBW(lastRed, lastGreen, lastBlue, lastWhite);
  FastLED.show();
 
  MQTTclient.publish("takLEDClient/status", "started"); // You can activate the retain flag by setting the third parameter to true
 
  MQTTclient.subscribe("takLEDClient/red", [](const String & payload) {
  Serial.print("red: ");
    Serial.println(payload);
    lastRed=payload.toInt();
    preferanser.putShort("red",lastRed);
    show_new_colors();
  });
 
  MQTTclient.subscribe("takLEDClient/green", [](const String & payload) {
  Serial.print("green: ");
    Serial.println(payload);
    lastGreen=payload.toInt();
    preferanser.putShort("green",lastGreen);
    show_new_colors();
  });
 
  MQTTclient.subscribe("takLEDClient/blue", [](const String & payload) {
  Serial.print("blue: ");
    Serial.println(payload);
    lastBlue=payload.toInt();
    preferanser.putShort("blue",lastBlue);
    show_new_colors();
  });
 
  MQTTclient.subscribe("takLEDClient/white", [](const String & payload) {
  Serial.print("white: ");
    Serial.println(payload);
    lastWhite=payload.toInt();
   preferanser.putShort("white",lastWhite);
    show_new_colors();
  });
 
  MQTTclient.subscribe("takLEDClient/rainbow", [](const String & payload) {
  Serial.print("rainbow: ");
    Serial.println(payload);
    rainbowLoop(payload.toInt());
    show_last_colors(); // reset
  });
 
  MQTTclient.subscribe("takLEDClient/brightness", [](const String & payload) {
  Serial.print("brightness: ");
    Serial.println(payload);
    FastLED.setBrightness(payload.toInt());
    FastLED.show();
  });
 
  MQTTclient.subscribe("takLEDClient/tilt", [](const String & payload) {
  Serial.print("tilt: ");
    Serial.println(payload);
    roter(payload.toInt());
  });
 
  }

 

 

Legg merke til at jeg bruke siste LED på stripa som status LED

 

Om jeg skulle gjøre det omigjen nå ville jeg valgt en 12V stepper så jeg kunne ha 12V LED.
5V gir veldig høy strøm med mulighet for varmgang og fallende spenning i enden av LEDen.

Kanskje til og med 24V med en spenningsregulator til Stepperen og/eller ESP32'en.

 

 

 

  • Like 10
  • Thanks 3

0 kommentarer


Anbefalte kommentarer

Det er ingen kommentarer å vise.

Gjest
Skriv en kommentar...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.