Wieso glimmt LED nur?

Hallo, ich bin dabei, meinem Sohn ein Nachtlicht zu bauen. Ich verwende dafür ein ATtiny85, den ich mit der Arduino ID programmiere. Gesteuert über einen LDR-Sensor schaltet sich eine rote 3-Watt-LED an, deren Helligkeit über ein Poti gesteuert wird. Auf Knopfdruck wird eine weiße LED - vielleicht auch zwei - geschaltet. Und diese weiße LED macht mir jetzt Kopfzerbrechen. Wenn ich den Knopf drücke, glimmt sie nur leicht, und ich finde nicht heraus, warum. Wenn ich den Sketch per Arduino as ISP aufspiele, leuchtet sie währenddessen sehr hell.

Was mache ich falsch?

Hier die aktuelle Version des Sketches:

const int led = 0;
long levelLED;

const int ledWhite = 2;
int ledWhiteState = LOW;

const int ldr = 3;
long levelLDR;

const int poti = 2;
long levelPoti;

const int button = 1;
int button_state = HIGH;

void setup() {
    pinMode(led, OUTPUT);
    pinMode(ledWhite, OUTPUT);
    pinMode(ldr, INPUT);
    pinMode(poti, INPUT);
    pinMode(button, INPUT_PULLUP);
}

// TODO: void sensor_levelling()
 
void ledRedSwitching(){ // TODO: Fade-in
  if (levelLDR < 250)
      analogWrite(led, levelLED);
    else
      digitalWrite(led, LOW);
}

void ledWhiteSwitching(){
      if (button_state == LOW)
        ledWhiteState = !ledWhiteState;
        digitalWrite(ledWhite, ledWhiteState);
}

void loop() {
    levelPoti = analogRead(poti);
    levelLDR = analogRead(ldr);
    levelLED = map(levelPoti, 0, 1023, 0, 255);
    button_state = digitalRead(button);
    ledRedSwitching();
    ledWhiteSwitching();
    }

Und hier der Schaltplan.

Verstehe ich dich richtig, du schaltest eine 3Watt Led direkt über den ATtiny85 ?
Wie funktioniert das ?

po11ux:
Und diese weiße LED macht mir jetzt Kopfzerbrechen. Wenn ich den Knopf drücke, glimmt sie nur leicht, und ich finde nicht heraus, warum.

Du überschreitest den maximalen Strom je Pin:
5 V / 75 Ω = 66 mA
Mir bereitet das Überleben des ATtiny Kopfzerbrechen!

agmue:
Du überschreitest den maximalen Strom je Pin:

5 V / 75 Ω = 66 mA

Mir bereitet das Überleben des ATtiny Kopfzerbrechen!

Du musst aber die Flußspannung der Led abziehen.

@po11ux
Die analogen Eingänge brauchst du nicht als Input zu definieren.

HotSystems:
Verstehe ich dich richtig, du schaltest eine 3Watt Led direkt über den ATtiny85 ?
Wie funktioniert das ?

Gute Frage. Ich bekomme gerade Zweifel, dass die LEDs, die mir als 3-Watt-LEDs verkauft wurden, tatsächlich welche sind. Ich habe gerade nachgemessen: Die LED zieht "voll aufgedreht" 18 mA.

po11ux:
Gute Frage. Ich bekomme gerade Zweifel, dass die LEDs, die mir als 3-Watt-LEDs verkauft wurden, tatsächlich welche sind. Ich habe gerade nachgemessen: Die LED zieht "voll aufgedreht" 18 mA.

Du begrenzt ja auch noch mit einem 220 Ohm Widerstand.

agmue:
Du überschreitest den maximalen Strom je Pin:

5 V / 75 Ω = 66 mA

Mir bereitet das Überleben des ATtiny Kopfzerbrechen!

(5 V-3,6 V) / 75 Ω = 18,67mA

Die weiße LED, um die es mir eigentlich geht, zieht nur 67,1µA. Jemand eine Idee, warum? Wie bereits geschrieben: Beim Programmieren leuchtet sie mit voller Stärke.

Und was deine weiße Led betrifft, liegt es an deinem Sketch.

Die schaltet sehr schnell hintereinander ein und aus. Daher wohl das "Glimmen".

HotSystems:
@po11ux
Die analogen Eingänge brauchst du nicht als Input zu definieren.

Gibt es einen Vorteil, das nicht zu tun?

po11ux:
Gibt es einen Vorteil, das nicht zu tun?

Du sparst Zeilen im Sketch. :wink:
Da gewinnt die Übersichtlichkeit.

HotSystems:
Und was deine weiße Led betrifft, liegt es an deinem Sketch.

Die schaltet sehr schnell hintereinander ein und aus. Daher wohl das “Glimmen”.

Den Verdacht hatte ich auch schon ich habe dann testweise den Code in der Funktion ledWhiteSwitching wie folgt geändert.

void ledWhiteSwitching(){
      if (button_state == LOW)
        ledWhiteState = !ledWhiteState;
      digitalWrite(ledWhite, ledWhiteState);
      delay(5000);

Hat nichts geholfen.

Du hast die Klammern für den if-Block vergessen:

Dann mach mal folgendes:

void ledWhiteSwitching() {
if (button_state == LOW)
{
digitalWrite(ledWhite, LOW);
}
else
{
digitalWrite(ledWhite, HIGH);
}

HotSystems:
Du hast die Klammern für den if-Block vergessen:

Dann mach mal folgendes:

void ledWhiteSwitching() {
if (button_state == LOW)
{
digitalWrite(ledWhite, LOW);
}
else
{
digitalWrite(ledWhite, HIGH);
}

Das ändert leider auch nichts am Dimmen. Und die LED glimmt nur, während der Taster gehalten wird. Ziel ist, dass sie beim ersten Drücken an- und beim zweiten ausgestellt wird.

Du schaltest mit

    pinMode(poti, INPUT);

den Pin der LED auf Input, der Pullup reicht nur zum leichten Glimmen.

Wäre für poti nicht vielleicht A2 sinnvoller als 2?

(deleted)

po11ux:
Das ändert leider auch nichts am Dimmen. Und die LED glimmt nur, während der Taster gehalten wird. Ziel ist, dass sie beim ersten Drücken an- und beim zweiten ausgestellt wird.

Wieso dimmen ?
Mit dem Taster kannst du nur ein, bzw. ausschalten.
Und das auch nur, wenn du den Pin in den Fuses als normalen Pin definiert hast.
Ohne dies, ist es der Resetpin.
Aber eine Dimmfunktion sehe ich da erstmal nicht.

po11ux:
Ziel ist, dass sie beim ersten Drücken an- und beim zweiten ausgestellt wird.

Das habe ich gerade in https://forum.arduino.cc/index.php?topic=708332.msg4759869#msg4759869 erledigt.

Whandall:
Du schaltest mit

    pinMode(poti, INPUT);

den Pin der LED auf Input, der Pullup reicht nur zum leichten Glimmen.

Wäre für poti nicht vielleicht A2 sinnvoller als 2?

Danke, das war es!

Peter-CAD-HST:
Moin po11ux
Ich habe deinen Sketch gelesen und habe zwei Vorschläge:

const int poti = A2;

und

void ledWhiteSwitching() {

digitalWrite(ledWhite, button_state);
}
/*      if (button_state == LOW)
       ledWhiteState = !ledWhiteState;
       digitalWrite(ledWhite, ledWhiteState);
*/



Viel Erfolg beim Testen 
Gruß Peter
und gesund bleiben

Vielen Dank für die Hinweise. Den Pin habe ich auf A2 geändert und jetzt funktioniert es. Die andere Änderung würde aber dazu führen, dass die weißen LEDs nur leuchten, während der Taster gedrückt wird. Das ist nicht mein Ziel. Beim Drücken soll der Status von HIGH nach LOW wechseln und anders herum und dann so bleiben. Das funktioniert mit meinem Code auch ganz gut.