GĂ„ til innhold
  • Bli medlem

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 11
  • Thanks 3

1 kommentar


Anbefalte kommentarer

Perbear

Skrevet

Veldig artig prosjekt! Likte spesielt regnbuen🌈 for barnebarna😀

Jeg har grublet pĂ„ et lignende problem: vil ha sterk ledstripe over arbeidsbord men vil unngĂ„ Ă„ bli blendet. Justerbar vinkel hadde jeg ikke tenkt pĂ„. Takk for tipset🙏

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.