PWM Ausgang Fade-Funktion invertieren

Hallo,

kann man die PWM-Ausgänge, die vom Wert 0-255 (0-100%) z.B. mit einer Konstantstromquelle hoch und herunter gedimmt werden können, invertieren?

Also 255-0 (0-100).

Danke.

Gruß Jens

Arduino.JPG

Meinst Du neuerWert = 255 - alterWert ?

255 soll nicht der maximal Wert am Ausgang sein, sondern 0 und umgekehrt.

Mach mal das als Test:

void setup()
{
  Serial.begin(9600);

  Serial.println(abs(0 - 255));
  Serial.println(abs(10 - 255));
  Serial.println(abs(100 - 255));
  Serial.println(abs(150 - 255));
  Serial.println(abs(255 - 255));
}

void loop()
{
}

Ich dachte halt so:

void setup () {
  Serial.begin(115200);
  Serial.println("Programmanfang");
  for (unsigned int alterWert = 0; alterWert < 256; alterWert += 10) {
    unsigned int neuerWert = 255 - alterWert;
    Serial.print("alterWert: "); Serial.print(alterWert);
    Serial.print("   neuerWert: "); Serial.println(neuerWert);
  }
}

void loop()
{
}

Programmanfang
alterWert: 0 neuerWert: 255
alterWert: 10 neuerWert: 245
alterWert: 20 neuerWert: 235
alterWert: 30 neuerWert: 225
alterWert: 40 neuerWert: 215
alterWert: 50 neuerWert: 205
alterWert: 60 neuerWert: 195
alterWert: 70 neuerWert: 185
alterWert: 80 neuerWert: 175
alterWert: 90 neuerWert: 165
alterWert: 100 neuerWert: 155
alterWert: 110 neuerWert: 145
alterWert: 120 neuerWert: 135
alterWert: 130 neuerWert: 125
alterWert: 140 neuerWert: 115
alterWert: 150 neuerWert: 105
alterWert: 160 neuerWert: 95
alterWert: 170 neuerWert: 85
alterWert: 180 neuerWert: 75
alterWert: 190 neuerWert: 65
alterWert: 200 neuerWert: 55
alterWert: 210 neuerWert: 45
alterWert: 220 neuerWert: 35
alterWert: 230 neuerWert: 25
alterWert: 240 neuerWert: 15
alterWert: 250 neuerWert: 5

Duh. Ist so herum logischer. Dann muss danach nicht noch -1 machen :)

Ich habe in meiner alten Schaltung eine Konstantstromquelle mit angeschlossener LED, die ich zeitgesteuert von 0 auf 100% hoch regel und auch wieder zeitgesteuert herunter fahre. Nur leider habe ich nun eine Konstantstromquelle, die bei der jetzigen Steuerung alles genau umgekehrt macht. Schließe ich an der Konstantstromquelle nicht den Arduino an, dann ist die LED max.an. D.h. erst wenn ich über den Arduino den PWM-Ausgang angeschlossen an der KSQ auf den Wert 255 hochgefahren habe ist die LED aus. Nur muss es jetzt genau andersherum funktionieren.

Danke.

Gruß Jens

Willst du das in Hardware oder im Sketch lösen?

Hardware: Signal invertieren, mit Transistor, Operationsverstärker, TTL IC

Sketch: analogWrite(pin,255-wert);

Nicht via Hardware. Wenn es geht, via Software.

ElEspanol: Sketch: analogWrite(pin,255-wert);

Und das geht nicht?

Hallo EIEspanol,

vielen Dank schon mal für deine Unterstützung. Ich habe einmal meinen Sketch mit aufgeführt.

Mir ist aber nicht ganz so klar, wie ich den darin umsetzen soll.

Gruß Jens

#include “Wire.h”
#define DS1307_ADDRESS 0x68
#include <RTClib.h>
const int Blau = 13;
const int Rot = 12;
const int Weiss = 6;
const int Gruen = 9;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const unsigned long SECOND = 60;
const int TARGET_BRIGHTNESS = 255 ;
RTC_DS1307 RTC; // kann sein, dass das bei deiner RTC library anders geht …
DateTime now;

const char LOGFORMAT = “%02u.%02u.%04u %02u:%02u:%02u”;
char RTCpuffer[16]; // UhrzeitRTCpuffer muss gross genug sein, dass alle Zeichen reinpassen!!

void setup()
{
Serial.begin(9600); //Einschalter Übertragung zum Serial-Monitor
Wire.begin();

RTC.begin();

}

byte bcdToDec(byte val) {

return ( (val/16*10) + (val%16) );
}

void loop()
{
now=RTC.now();

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();

// Lesen der Sekunden, Minuten und Stunden
Wire.requestFrom(DS1307_ADDRESS, 3);

int RTCSecond = bcdToDec(Wire.read());
int RTCMinute = bcdToDec(Wire.read());
int RTCHour = bcdToDec(Wire.read() & 0b111111); //24Std.Zeit

unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden
Serial.println(RTCpuffer);
analogWrite(Blau, brightness(time, 22HOUR+45MINUTE, 01HOUR+49MINUTE));
analogWrite(Rot, brightness(time, 01HOUR+30MINUTE, 01HOUR+32MINUTE));
analogWrite(Weiss, brightness(time, 8HOUR, 15HOUR));
analogWrite(Gruen, brightness(time, 9HOUR, 14HOUR));

delay(1000);
}

byte brightness(unsigned long time, unsigned long fadeUpStart, unsigned long fadeDownStart)
{
// Mittagzeit: max. Helligkeit
if (time >= fadeUpStart + 1HOUR && time <= fadeDownStart)
return TARGET_BRIGHTNESS;
// ----------------------------------------------------------------------------
// Morgendämmerung: Helligkeit steigt
if (time >= fadeUpStart && time <= fadeUpStart + 1
HOUR) // Dimmung nach oben (Dimmzeit=ZahlEinheit)
{
unsigned long seconds = time - fadeUpStart; //(Dimmzeit=Zahl
Einheit)
return TARGET_BRIGHTNESS * seconds / (HOUR1); //(Dimmzeit=ZahlEinheit)
}
// ----------------------------------------------------------------------------
// Abenddämmerung: Helligkeit sinkt
if (time >= fadeDownStart && time <= fadeDownStart + 1HOUR) // Dimmung nach unten (Dimmzeit=ZahlEinheit)
{
unsigned long seconds = (fadeDownStart + (HOUR1)) - time; //(Dimmzeit=ZahlEinheit)
return TARGET_BRIGHTNESS * seconds / (HOUR1); // (Dimmzeit=ZahlEinheit)
// ----------------------------------------------------------------------------
}

return 0;
}

Knippi: Ich habe einmal meinen Sketch mit aufgeführt.

Mir ist aber nicht ganz so klar, wie ich den darin umsetzen soll.

So ließe sich das umsetzen: Einfach 255-(........)

analogWrite(Blue1Pin,   brightness(time, 255-(22*HOUR+45*MINUTE, 01*HOUR+49*MINUTE)));
  analogWrite(Blue2Pin,   brightness(time,255- (01*HOUR+30*MINUTE, 01*HOUR+32*MINUTE)));
  analogWrite(White3Pin, brightness(time,255-( 8*HOUR,                 15*HOUR)));
  analogWrite(White4Pin, brightness(time,255-( 9*HOUR,                 14*HOUR)));

Ok, danke. :) Werde ich nachher mal ausprobieren.

Gruß Jens

Hallo Theseus,

das funktioniert leider nicht. Die LED's werden bei Annäherung an die Hauptzeit (Mittagszeit max. Helligkeit) dunkler, anstatt heller und umgekehrt.

Ich hab es. :slight_smile:

Es muss so umgestellt werden:

analogWrite(Blau,255- brightness(time, 22HOUR+45MINUTE, 01HOUR+49MINUTE));
analogWrite(Rot,255- brightness(time, 01HOUR+30MINUTE, 01HOUR+32MINUTE));
analogWrite(Weiss,255- brightness(time, 8HOUR, 15HOUR));
analogWrite(Gruen,255- brightness(time, 9HOUR, 14HOUR));

Danke.

Gruß Jens

Map kann das auch. Ist zwar vielleicht etwas oversized, aber es funktioniert.

ledBright = map(PotiVar, 0, 1023, 255, 0);

Und wenn du vorher vielleicht schon Map dastehen hattest, vertauscht du nur min und max am Ende der Zeile und schon hast du das gewünschte Ergebnis ;)

ledBright = map(PotiVar, 0, 1023, 0, 255);

Knippi: Ich hab es. :)

Es muss so umgestellt werden:

Genau, so hatten meine Vorschreiber und ich es gemeint.

Mit map wäre mit der Kirche ums Dorf analogWrite(Pin, map(0, wert, 255,0)); oder so ähnlich.

Mit map wäre mit der Kirche ums Dorf

… mal abgesehen davon, dass *255L/1023 falsch ist, wenn man eigentlich /4 meint.
(oder für nerds >>2) :wink:

Wenn man den Wertebereich 0 … 1023 in 256 gleich breite Abschnitte teilt,
sollte der Erste 0…3 und der Letzte 1020…1023 entsprechen, oder ?

Danke dass ich mal wieder Senf ablassen konnte :wink:

Wie du ja weisst, gibt es da verschiedene Ansichten, wovon eine richtiger ist als die andere. :confused:

geteilt durch 4 gibt mMn ein ziemlich richtiges Ergebnis, *255/1023 hat ja auch nur aprox. 0,3% Fehler. Richtig wäre ja auch *256/1024 und vielleicht für manchen, der in Mathe nicht so bewandert ist, leichter nachzuvollziehen ;) und somit das beste Ergebnis