LED Helligkeit steuern mit Poti

Hallo,

ich steuere mit einem Poti Helligkeit einer LED so weit so gut. Ich habe eine Map Funktion erstellt, um es in % auf einem Display anzeigen zu lassen. Alles funktioniert, nur seltsamerweise muss ich in der Funktion nicht von 0 bis 100 schreiben, sondern mehr, um am Ende die 100 zu haben. Das ist mir zum ersten Mal passiert. Das Programm läuft auf Uno r4.

Weißt vielleicht jemand, warum es so ist?

Schöne Grüße

#include "rgb_lcd.h"
#include <Wire.h>
rgb_lcd lcd;

const int colorR = 255;
const int colorG = 0;
const int colorB = 0;

const int analogInPin = A3;  // ESP8266 Analog Pin ADC0 = A0
int Helligkeit;

int LED =6;
int ReglerWert=0;

void setup() {
  // initialize serial communication at 115200
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);

lcd.print("set cllor");
}

void loop() {
ReglerWert = analogRead(analogInPin);

Helligkeit = map(ReglerWert, 0, 1023, 0, 138);
// LED mit analogWrite() zum Leuchten bringen
//analogWrite(LED, ReglerWert / 4);
analogWrite (LED, map(ReglerWert ,0,1023,0,255));
Serial.print(Helligkeit);
Serial.println("%");
lcd.setCursor(0, 1);
lcd.print(Helligkeit);

}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

gibt dir aus welchen Maximalwert du auf der Eingangsseite bekommst (ReglerWert)
wenn du nie auf 1023 kämst wirst du auch nie auf 99 kommen.

ja stimmts, ich dachte der Wert ist immer von 0 bis 1023 aber jetzt war bei 745 schluss :face_with_monocle:

kommt halt auf deine Beschaltung an.

Übrigens: Mach bevor du mit deinem Wert in den analogWrite gehst auch noch ein constrain damit die Werte nicht überschritten / unterschritten werden.

Du meinst übrigens eigentlich ReglerWert / 4 ,
oder noch eigentlicher ReglerWert >>2 ,
wenn du aus 10 Bit 8 Bit machen willst.

Wenn du aus den 1024 Werten deines analogRead() ( 0 ... 1023 )
101 im Display machen willst ( 0 ... 100 )
wäre map (ReglerWert,0,1024, 0,101) richtig.

Aber das willst du vermutlich dann doch nicht :slight_smile:

Für LED-Helligkeit ist diese lineare Skalierung in der analgogWrite Ausgabe übrigens auch nicht optimal.

Hallo,

eigentlich möchtest das machen. Wofür 2x mappen?

Helligkeit = map(ReglerWert, 0, 1023, 0, 255);
analogWrite (LED, Helligkeit);

Hier haste einen Artikel zum Thema Led Fading.

Die Werte entsprechen einer Parabelform. Die Werte schreibst du in einer Tabelle. Stichwort Array. Den Potiwert mapst du auf den Indexbereich deiner Tabelle. Sodass du mittels Poti den Index der Tabelle durchgehst. Den Wert vom Tabellenindex gibts du an analogWrite weiter. Dann kannste fürs Auge linear die Helligkeit mittels Poti steuern.

Eigentlich möchte er einmal mappen, um eine Anzeige 0 .. 100% zu haben.
Also eigentlich analogRead()*101UL / 1024 rechnen.

Um aus analogRead einen Wert für analogWrite zu machen, braucht man erst recht kein map.
Entweder schön nichtlinear für LED, oder einfach >>2 .

Übrigens: Wenn das Poti keine Werte 0 ..1023 liefert, ist es dusslig angeschlossen.

Hallo,

Übrigens: Wenn das Poti keine Werte 0 ..1023 liefert, ist es dusslig angeschlossen.

Wenn ein Poti keine Werte zwischen 0 und Vollausschlag liefert, liegt es am Poti selbst und dessen mechanischen Aufbau bzw. dessen interne Kontaktierung. Wenn der mechanische Anschlag vorm oder hinterm Schleiferbereich liegt, dann kann man nichts machen. Dann hilft nur eine Kalibrierfunktion schreiben. Damit mappt man sich jedes Poti zwischen 0 und 100% zurecht.

Zur Steuerung der Helligkeit schau Dir mal diesen Artikel an.

Gruß Tommy

OK, sorry. Das kann natürlich auch sein. Meine begrenzten Erfahrungen zeigten eher einen mehr oder weniger großen Totbereich am Anfang oder Ende, wo sich trotz Bewegung der Widerstand nicht geändert hat.

Wenn man Werte zwischen beliebigen x und y auf 0 .. 100 (oder 0 .. 255) abbilden will, ist natürlich map die dafür sinnvolle Funktion.

Hallo,

kein Problem. Ich habe hier noch einen Daumensteuerknüppel. Das Ding ist eigentlich totaler Schrott, weil allein schon das Minigehäuse den Knüppel zu sehr mechanisch begrenzt, Man bekommt A/D Werte zwischen 300 und 750. X und Y sind auch leicht verschoben. Ich kam damals nicht umhin eine Kalibrierfunktion zu schreiben. Das war die eigene Herausforderung das Ding sinnvoll überhaupt verwenden zu können. Das Ding hole ich irgendwann wieder hervor und steuere meine Modelleisenbahn im manuellen Modus. Das ist der Plan.

Hallo,

ich nähere mich zum Ende von meinem Project und wollte so viel Infos wie nötig zur Verfügung stellen für die nachfolgenden Tüftler.

In diesem Project handelt sich um eine einfache Steuerung des LED mit max 1000 mA Strom Annahme mit Potentiometer.

Schöne Grüße
Verkabelung.pdf (23,9 KB)



#include "rgb_lcd.h"
#include <Wire.h>
rgb_lcd lcd;

const int colorR = 4;
const int colorG = 2;
const int colorB = 115;

const int analogInPin = A0;  //Potentiometer
int Helligkeit;

int LED =6; //LED Digitalen PIN
int ReglerWert=0; 

int Strom;
void setup() {

pinMode(6, OUTPUT);
digitalWrite(6, HIGH);


Serial.begin(9600);
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
lcd.setCursor(0, 0);
lcd.print("HAllo");
lcd.setCursor(0, 1);
lcd.print(":)");
delay(1000);

    for (int positionCounter = 0; positionCounter < 8; positionCounter++) {
        // scroll one position left:
        lcd.scrollDisplayLeft();
        // wait a bit:
        delay(500);
    }

    // scroll 29 positions (string length + display length) to the right
    // to move it offscreen right:
    for (int positionCounter = 0; positionCounter < 8; positionCounter++) {
        // scroll one position right:
        lcd.scrollDisplayRight();
        // wait a bit:
        delay(500);
    }



delay(2000);
lcd.clear();

lcd.setRGB(colorR, colorG, colorB);
}
void loop() {


ReglerWert = analogRead(analogInPin);

//Helligkeit = map(ReglerWert, 0, 1023, 0, 100);
Helligkeit = map(ReglerWert, 1023, 0, 0, 100);
Strom = map(ReglerWert, 1023, 0, 0, 620);

lcd.setCursor(6,0 );
lcd.print("Helligkeit");
lcd.setCursor(0,1);
lcd.print("455nm");

if (Strom>= 100) {
   lcd.setCursor(11,1);
   lcd.print(Strom);
  }
if (Strom <100 & Strom>= 10) {
  lcd.setCursor(11,1);
   lcd.print(" ");
   lcd.setCursor(12,1);
   lcd.print(Strom);
  }
if (Strom <10) {
   lcd.setCursor(11,1);
   lcd.print("  ");
   lcd.setCursor(13,1);
   lcd.print(Strom);
  }  


lcd.setCursor(14,1);
lcd.print("mA");
// LED mit analogWrite() zum Leuchten bringen
analogWrite(LED, ReglerWert / 4);
//analogWrite (LED, map(ReglerWert ,0,1023,0,255));
Serial.print(Helligkeit);
Serial.println("%");
Serial.println(ReglerWert);
lcd.setCursor(0, 0);
lcd.print(Helligkeit);
lcd.setCursor(3, 0);
lcd.print("%");
lcd.setCursor(2,0); // set cursor
if (Helligkeit <100) lcd.print(" ");
lcd.setCursor(1,0); // set cursor
if (Helligkeit <10) lcd.print(" ");
if (Helligkeit >98) {
   lcd.setCursor(0, 0);
    lcd.print("100");
  }
}

Wozu brauchst du noch das Zeitrelais?

Der Zeitrelais brauche ich, damit das LED ausgeschalten bleibt, bis das Programm LOOP läuft. Ich habe erst mal im Programm versucht, es im setup zu lösen. Trotzdem immer nach der Einschalten war das LED eine Millisekunde an. Das LED hat sozusagen geblinkt einmal. Mit dieser LED wäre es auch kein Problem, aber jetzt habe ich vor ein LED einbauen mit 270 nm Wellenlänge und das ist schon ein bisschen gefährlich für Augen und sogar Haut. Mindestens so steht es im Datenblatt, deswegen habe ich mir gedacht, dass ein klein Zeitrelais kann nicht schaden :slight_smile: