LED Streifen mit Helligkeitsensor steuern

Hallo zusammen,
Ich zuerst einmal ich bin ein Arduino Anfänger :confused: .
Ich wollte ich ein LED Streifen mit einem Helligkeitssensor (TSL2561) über ein Arduino steuern. Die Technik funktioniert soweit schon mal. Allerdings habe ich ein Problem mit meinem Sketch.
Ich will das der LED Streifen hochgedimmt wird wenn das Licht unter 500 LUX ist. und wenn das Licht über 750 LUX ist soll der Streifen langsam runtergedimmt werden. Zwischen 500 und 750 LUX soll gar nichts passieren. Hier mal mein bisheriger Sketch:

#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_TSL2561_U.h"


#define LEDROT 6
#define LEDGRUEN 5
#define LEDBLAU 3

Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

void configureSensor(void)
{  
tsl.enableAutoRange(true);
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
}


void setup() 
{
pinMode(LEDROT, OUTPUT);
pinMode(LEDGRUEN, OUTPUT);
pinMode(LEDBLAU, OUTPUT);
}

void loop() 
{

int Zuschlag = 1; 

start:

sensors_event_t event;
tsl.getEvent(&event);                                                               
delay(150);
 

if (event.light < 500) 
for (int i = Zuschlag; i <= 255; i = Zuschlag)
{
   analogWrite(LEDROT, i);
   analogWrite(LEDGRUEN, i);
   analogWrite(LEDBLAU, i);
   delay(20);
   int Zuschlag = Zuschlag + 1;
   goto start;
 }
 
if (event.light >= 500 && event.light <= 750)                              
 {  
   delay(300);
   goto start;
 }

if (event.light > 750)                                                        
 for (int i = Zuschlag; i >= 0; i = Zuschlag)
{
   analogWrite(LEDROT, i);
   analogWrite(LEDGRUEN, i);
   analogWrite(LEDBLAU, i);
   delay(300);
   int Zuschlag = Zuschlag - 1;
   goto start;
 }
}

Wenn ich mit diesem Sketch meinen Sensor verdunkel, erhöht sich die Helligkeit nur einmal und bleibt dann gleich. Ich will aber dass es die Helligkeit solange erhöht oder senkt bis es zwischen 500 und 750 Lux hell ist.
Kann mir jemand weiterhelfen??? :o

versuch es mal so:

#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_TSL2561_U.h"


#define LEDROT 6
#define LEDGRUEN 5
#define LEDBLAU 3

Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

void configureSensor(void)
{ 
tsl.enableAutoRange(true);
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
}


void setup()
{
pinMode(LEDROT, OUTPUT);
pinMode(LEDGRUEN, OUTPUT);
pinMode(LEDBLAU, OUTPUT);
}

void loop()
{
 
sensors_event_t event;
tsl.getEvent(&event);                                                               
//delay(150);
 
if (event.light < 500)
 for (int i = 0; i <= 255;  i++)
 {
    analogWrite(LEDROT, i);
    analogWrite(LEDGRUEN, i);
    analogWrite(LEDBLAU, i);
    delay(20);
  }
 
if (event.light > 750)                                                       
  for (int i = 255; i >= 0; i--)
 {
    analogWrite(LEDROT, i);
    analogWrite(LEDGRUEN, i);
    analogWrite(LEDBLAU, i);
    delay(50);
   
  }
}

Danke für deine schnelle Antwort. Das ganze hat ich auch schon so. Dann dimmt sich der LED streifen aber leider pausenlos von 0 auf 255 hoch und runter.

dann versuch es mal so:

#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_TSL2561_U.h"


#define LEDROT 6
#define LEDGRUEN 5
#define LEDBLAU 3

Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

void configureSensor(void)
{ 
tsl.enableAutoRange(true);
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
}


void setup()
{
pinMode(LEDROT, OUTPUT);
pinMode(LEDGRUEN, OUTPUT);
pinMode(LEDBLAU, OUTPUT);
}

void loop()
{
 static uint8_t i;
sensors_event_t event;
tsl.getEvent(&event);                                                               
//delay(150);
 
if (event.light < 500)
{
 if(i<255){
 for (i = 0; i <= 255;  i++)
 {
    analogWrite(LEDROT, i);
    analogWrite(LEDGRUEN, i);
    analogWrite(LEDBLAU, i);
    delay(20);
  }}}

if (event.light > 750)
{if( i>0){                                                       
  for (i = 255; i >= 0; i--)
 {
    analogWrite(LEDROT, i);
    analogWrite(LEDGRUEN, i);
    analogWrite(LEDBLAU, i);
    delay(50);
   
  }}}
}

Gewöhne dir goto ab. Loop() ist eine Schleife die immer durchläuft.

static uint8_t i;

for (i = 0; i <= 255;  i++)
{
    // ein byte ist immer <= 255 , diese Schleife wird also nie beendet
}

ist ein uint8_t nicht genau dasselbe wie ein byte? Oder was genau macht dieser Befehl?

Ich kann den sketch von ardubu leider erst morgen ausprobieren, da ich mein Arduino nicht da habe...

Im Prinzip wollte ich dass mein Sensor misst dann gegebenenfalls die helligkeit um eine Stufe erhöht und dann wieder misst und dann wieder die Helligkeit um eine Stufe erhöht... das ganz solange bis ich dann zwischen 500 und 750 lux mithilfe des Led Streifens bin. Deswegen das goto um die Schleife vorzeitig abzbrechen und wieder zu messen, da ja sonst die Led bis 255 hochregeln..., oder?

Das ist kein Befehl. Sondern ein Datentyp. Byte ist lediglich eine Arduino-Bezeichnung für uint8_t. Ansonsten ist z.B. unint16_t unabhängig vom Prozessor, da int auf 8 Bit System 2 Byte hat und und auf 32 Bit System 4 Byte.

Das ist so eine Stelle wo voreilige Optimierung schlecht ist. Wenn man da int draus macht kann die Variable auch größere Werte annehmen.

Klar ist uint8_t und byte dasselbe.
und eigentlich brauchst du keine Schleife, da loop selbst schon eine Schleife darstellt.

void loop() {
  static byte ledlevel; 
 
  int helligkeit= event.light; // ?

  if ( helligkeit < 500 && ledlevel < 255) ledlevel++;
  if ( helligkeit > 750 && ledlevel > 0   ) ledlevel--;

  analogWrite(LEDROT, ledlevel); 
   ...
  delay(300); // fade - Geschwindigkeit
}

Eventuell wirkt sich der Wert von ledlevel aber nicht ausreichend auf die Helligkeit aus, so dass er wohl an eine der Grenzen ( 0 oder 255 ) geht und dort bleibt.

Aber so wolltest du es eigentlich haben, oder?

Arduino wird in C programmiert nicht in Basic wo man GOTO braucht.

In Deinem Orginal Sketch braucht es 1x Goto gar nicht weil loop() sowieso eine Schleife ist. Im FOR ist goto falsch weil Du sofort aus der Schleife herausspringst.

In 99,9% der Fälle brauchst Du goto nicht und zum 0,1% ten Fall kommen weder ich noch Du.

for (int i = Zuschlag; i <= 255; i = Zuschlag)

Diese for Schleife hat keinen Sinn da sich die Variable nie ändert. Ja sie funktioniert irgendwie aber das ist kein C.

Grüße Uwe

Michael mit deinem Sketch klappts! Super vielen Dank nochmal!!!

Zu der Zeit gabs noch kein youtube