PWM abfragen Digital schalten

Okay, ganz verstanden hab ich es noch nicht, leichter wäre es, wenn du deinen Code hier einstellen würdest. Also geht es im konkreten Fall nicht um die Invertierung eines Signals, sondern um nur um eine einfache if-then-Anweisung abhängig vom PWM-Wert?

If (PWMwert==0) digitalWrite(10, HIGH);

Reicht das nicht aus, ggf. noch durch ein else ergänzt?

[edit] Okay, das läuft auf den Codeschnipsel von Uwe hinaus, nur eben ohne die analogWrite-Anweisung...

Bernd_S:
Mein PWM pin ist als blue1pin deklariert. Es geht um eine Lichtsteuerung. Der Pin wird soll tagsüber eine LED ansteuern.
Ich möchte gerne den Pin (2) so abfragen, das wenn er ausserhalb der Zeit auf null ist, ein Digitaler Pin (10) eingeschaltet wird.
Mit dem Aktiv werden von Pin 2 soll Pin 10 wieder ausgeschaltet werden.

Ich hoffe das es jetzt etwas klarer ist.

So ganz verstehe ich das noch nicht. Wird der "PWM-Pin" von "Außen" geschaltet, oder ist das nur ein Wert innerhalb des Programms, der auf Pin 2 als PWM ausgegeben wird (was aber nicht geht, das Pin 2 kein PWM Pin ist) und Du willst nur für den Fall das der Wert innerhalb des Programms auf "0" steht den Pin 10 auf HIGH schalten?

Wenn der Pin von außen ein PWM-Signal bekommt, dann hast Du vermutlich das Problem, das der Eingang ja zwischen HIGH und LOW hin und her schaltet. Jenachdem wann Du gerade den Pin abfragst, kann es passieren, das der halt gerade LOW ist, obwohl er ein PWM-Signal von außen bekommt. Dann solltest Du über pulseIn() auf einen HIGH-Puls warten und einen timeout-Wert angeben. Wenn der Timeout greift, kannst Du sicher sein, das kein PWM-Signal anliegt, sondern der Pin tatsächlich auf LOW steht.

Hallo,

Der PWM-Pin (2) dient zur Ausgabe und Steuerung einer LED. Diese soll den Sonnenaufgang, die Sonne und den Untergang simulieren.
Der digitale Pin (10) soll ausserhalb dieser Zeit eine LED als Mond einschalten.

Meinen Sketch kann ich leider im Moment nicht zur Verfügung stellen, da ich arbeiten muss

Der angefügte Sketch funktioniert zwar, so ganz verstanden habe ich ihn aber auch noch nicht, und mein Wissen in Bezug auf Arduino programmieren steckt noch in den Anfängen.
Ich kann mir zwar aus meinen Basic-Anfängen (vor 30 Jahren) innerhalb des Programms das ein oder andere zusammen reimen, aber das war es schon.

Ich hoffe ihr könnt mir weiter helfen

Gruss Bernd

Naja, Uwe hat doch schlicht in "Arduinisch" genau das geschrieben was Du beschrieben hast.

Wenn Sonne aus dann Mond an sonst Mond aus.

Und in Basic sieht das doch fast gleich aus.

Ihr überseht fast alle, daß Pin 2 kein PWM Ausgang ist. Pin 10 ist PWM fähig. Also Sonne und Mond umtauschen :wink: .
Ciao Uwe

uwefed:
...Also Sonne und Mond umtauschen :wink: .

Kannst doch nicht so einfach machen, wenn da jeder macht kommt ja das ganze Raumzeitgefüge durcheinander :smiley:

Eine ungedimmte Sonne aber auch nicht 8) 8) 8) 8) 8) 8) 8) 8) 8) 8) 8) 8) :wink:
Grüße Uwe

Blöde Frage, aber wäre es nicht besser Sonne UND Mond zu dimmen? Beide leuchten und gehen auf und unter. Die Sonne ist halt etwas heller. Also statt Pin 2 und 10 vielleicht einfach Pin 5 und 6 verwenden, die können beide PWM und liegen auch noch schön nebeneinander.
Mario.

Hallo zusammen

@Mario,
der Mond dient nicht zur Ausleuchtung, sondern nur als Notlicht, (besteht nur aus zwei bis drei normalen LED) Die Sonne hingegen aus 2x10W LED.
Ich glaube da muß der Mond nicht gedimmt werden.

@Uwe,
habe deinen Vorschlag aus dem zweiten Post mal in meinen Sketch integriert. Warte zur Zeit auf Ergebnisse, da das ganze über RTC läuft, und ich leider nicht weiss wie ich einen Zeitraffer einbauen könnte.
Und du hast Recht, Pin 2 ist kein PWM, Habe ich auch direkt geändert Danke

Werde berichten oder nachfragen je nach Ergebnis.

Gruß Bernhard

Hallo Uwe,

anei mal mein ganzer Code.
kannst du mir sagen was ich bei der analogwrite in der Zeile 85 und in der If in 86 anstatt der Fragezeichen einsetzen muß?

Da mir das ganze noch zu frisch ist komme ich nicht weiter.

#include <Wire.h>

#include <Button.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68 // This is the I2C address

// SainSmart LCD 16x2
LiquidCrystal lcd(8, 13, 9, 4, 5, 6);

// Arduino Mega 2560
const int Blue1Pin = 10;
const int White2Pin = 3;
//const int White3Pin = 7;
//const int White4Pin = 12;
const int Night1Pin = 2;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int TARGET_BRIGHTNESS = (255 * 3) / 4; // Target brightness is 3/4 of full

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
Wire.begin();
}

byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}

void loop()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("***");
lcd.setCursor(4,0);

///// Get time from RTC into RTCHour, RTCMinute, RTCSecond

// Set the register pointer to 0 (Second)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.send((byte)0);
Wire.endTransmission();

// Read Second, Minute, and Hour
Wire.requestFrom(DS1307_ADDRESS, 3);

int RTCSecond = bcdToDec(Wire.receive());
int RTCMinute = bcdToDec(Wire.receive());
int RTCHour = bcdToDec(Wire.receive() & 0b111111); //24 hour time

// write Time to LCD XX:XX:XX
if(RTCHour < 10) {
lcd.print("0");
}
lcd.print(RTCHour);
Serial.println(" ");
Serial.print(RTCHour);
lcd.print(":");
Serial.print(":");
if(RTCMinute < 10) {
lcd.print("0");
}
lcd.print(RTCMinute);
lcd.print(":");
Serial.print(RTCMinute);
Serial.print(":");
if(RTCSecond < 10) {
lcd.print("0");
}
lcd.print(RTCSecond);
Serial.print(RTCSecond);
lcd.setCursor(13,0);
lcd.print("***");

unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Time in seconds

// write value within the timeframe to PWM
analogWrite(Blue1Pin, brightness(time, 7HOUR+00MINUTE, 21HOUR+00MINUTE));
analogWrite(White2Pin, brightness(time, 8HOUR+30MINUTE, 19HOUR+30MINUTE));

// write actual value in % to LCD (max. 255 = 100%)
analogWrite(10,??);
if (??==0)
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
//Blue1Pin
lcd.setCursor(0,1);
lcd.print("Blue ");
if(((brightness(time, 7HOUR+00MINUTE, 21HOUR+00MINUTE))100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 7
HOUR+00MINUTE, 21HOUR+00*MINUTE))*100/255);
lcd.print("%");

//White2Pin

lcd.setCursor(9,1);
lcd.print("Sun ");
if(((brightness(time, 8HOUR+30MINUTE, 19HOUR+30MINUTE))100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 8
HOUR+30MINUTE, 19HOUR+30*MINUTE))*100/255);
lcd.print("%");
delay(1000);
}

byte brightness(unsigned long time, unsigned long fadeUpStart, unsigned long fadeDownStart)
{
// Mid day, light is at maximum brightness
if (time >= fadeUpStart + HOUR && time <= fadeDownStart)
return TARGET_BRIGHTNESS;

// Dawn: fade up the light
if (time >= fadeUpStart && time <= fadeUpStart + HOUR) // Fading up
{
unsigned long seconds = time - fadeUpStart; // Number of seconds into the fade time
return TARGET_BRIGHTNESS * seconds / (HOUR); // Fade up based on portion of interval completed.
}

// Evening: Fade down the light
if (time >= fadeDownStart && time <= fadeDownStart + HOUR) // Fading down
{
unsigned long seconds = (fadeDownStart + (HOUR)) - time; // Number of seconds remaining in the fade time
return TARGET_BRIGHTNESS * seconds / (HOUR); // Fade down based on portion of interval left.
}

// The remaining times are night and the lights is off
return 0; // Shouldn't get here
}

Hat eventuell jemand noch ein Codeschnipsel, damit ich mit zwei Tasten die Uhrzeit manuell verstellen kann??

Danke und Gruss

Bernd

muß ich jetzt die Zeilen Zählen?
Ok in eine Editor kopiert und schon sind die Zeilennummern da.

Hast Du jetzt einen Arduino UNO oder einen Arduino Mega 2560?

analogWrite(Blue1Pin,   brightness(time, 7*HOUR+00*MINUTE,                 21*HOUR+00*MINUTE));
analogWrite(White2Pin,  brightness(time, 8*HOUR+30*MINUTE,                 19*HOUR+30*MINUTE));

Was willst Du mit dem bezwecken?

Erklärst Du mir bitte wie Du Dir die Tageslichtgeschtaltung vorschwebt.

Grüße Uwe

@Uwe: Da steht aber noch eine Funktion drin:

// write value within the timeframe to PWM
  analogWrite(Blue1Pin,   brightness(time, 7*HOUR+00*MINUTE,                 21*HOUR+00*MINUTE));
  analogWrite(White2Pin,  brightness(time, 8*HOUR+30*MINUTE,                 19*HOUR+30*MINUTE));

Die Funktion "brightness()" rechnet vermutlich die Helligkeit aus, die für das Auf- und Untergehen, abhängig von der Zeit, gesetzt werden soll.
00*MINUTE ist aber immer 0, daher würde ich das weglassen.

@All:
Viel spannender finde ich folgendes Konstrukt:

// write actual value in % to LCD (max. 255 = 100%)
analogWrite(10,??);
if (??==0)
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}

Was bitte ist "??" ?
Falls das eine Variable sein soll, wird das kaum funktionieren. Es wundert mich schon, das der Compiler hier nicht meckert. Dazu kommt, das für diese Variable der Wert nie gesetzt wird, da wird der wohl immer "0" sein.
das analogWrite(10,??) schreibt dann den "vermutlichen" Wert 0 auf der Pin 10. Das ist aber Dein Blue1Pin, das Du 3 Zeilen darüber gerade gesetzt hast. Am Ende wird dann also immer 0 auf das Blue1Pin geschrieben, also "Sonne aus" und weil Sonne aus, dürfte dann der Mond immer an sein, weil Du dann immer das "digitalWrite(2, HIGH);".

Wenn Du schon Variable definierst, um Pins zu identifizieren, dann verwende die auch konsequent im Code, sonst bekommst Du irgendwann Probleme. Versuch mal die Helligkeit in Variablen zu speichern und die dann zu verwenden, z.B.:

int sonneHelligeit= brightness(time, 7*HOUR+00*MINUTE,21*HOUR+00*MINUTE);
...
if(sonneHelligkeit==0) {
    digitalWrite(mondPIN,HIGH);
} else {
    digitalWrite(mondPIN,LOW);
}
...

Damit wird Dein Code auch deutlich lesbarer, weil klar ist auf welche Werte sich einzelne Codeabschnitte beziehen.
Mario.

@Mario, das ist nicht spannend mit den Fragezeichen, genau das fehlt ihm doch noch, hat er geschrieben

@Bernd ein Codeschnipsel ist das nicht aber ich habe mal was geschrieben, was ich auch im Einsatzt habe.
da kannst du über ein LCD-Display und zwei Taster die Uhrzeit und das Datum eines DS1307 Modules
ändern, ist aber nicht ganz einfach für einen Anfänger zu verstehen, kann ich dir aber bei Bedarf geben

ok, das ist ein Funktionsaufruf aber Bernd_S muß uns sagen wie er sich die Dämmerung vorstellt. ok, er übergibt eine Start- und eine Endzeit aber sagt uns nict wielange die Dämmerung dauern soll.
Grüße Uwe

maverick1509:
@Mario, das ist nicht spannend mit den Fragezeichen, genau das fehlt ihm doch noch, hat er geschrieben

Stimmt, das hatte ich übersehen. Ein mögliche Lösung hatte ich ja bereits geschrieben.
Ich glaube es wäre besser, den Code neu zu schreiben und dabei schrittweise vorzugehen. Alle Teile nach und nach in einzelnen Funktionen implementieren.
Das hat den Vorteil, das man weiss was man gemacht hat und man lernt viel mehr dabei. Ich würde auch behaupten, das es nicht länger dauert, als ein vorhandenes Programm anzupassen, da man das ja erstmal verstehen muss. Änderungen an Code den man nicht selbst geschrieben hat und der auch noch "zweckentfremded" wird ist immer schwer. Die Tatsache das Bernd noch nicht so viel Erfahrung hat, macht die Sache nicht leichter.
Ich weiss, man scheut sich immer bei Null anzufangen, wenn eigentlich schon was da ist, was irgendwie funktioniert, nur noch nicht so wie man will. Aber genau das ist das Problem. Teile wie die brightness() Funktion kann man ja wiederverwenden.
Falls Du nicht bei Null anfangen willst, dann wirf aber erstmal alles raus, was Du in Deinem Programm nicht brauchst. Das macht es allen einfacher zu verstehen was Dein Programm macht.
Mario.

So wie ich das sehe, kann man statt der ?? Einfach den Rückgabewert der brightness-Funktion verwenden. Wenn der nämlich 0 ist, soll der Mond angehen. Alternativ könnte man auch den Mond schon vorher aufgehen lassen - auch abhängig von brightness.

ich kann Mario nur zustimmen, selbst programmieren ist das beste, so hab ich auch angefangen.
Und vor allem Fragen richtig stellen. Ich weiß immer noch nicht was gemacht werden soll.
Eine LED ein und ausschalten. Gut, aber z.B. wie abhängig von der Zeit oder von der Helligkeit oder von was.
Soll ein Tag- Nacht Ablauf simuliert werden ? Nachdem ich mir den Link jetzt angeschaut habe denke ich mal ja.
Soll der Ablauf immer gleich lang sein? oDer abhängig von der Jahreszeit?
Es gibt so viel zu beachten, da sind die PINs eigentlich erst einmal absolut nebensächlich, das kommt doch viel später.
Mich würde erst einmal das genaue Konzept interessieren, dann kann man weiter helfen.
Gruß
Bernward

Hallo zusammen,

@all,
entschuldigung für die vergessene Erklärung wofür das sein soll.
Ich habe ein Riffbecken, bei dem mir die Beleuchtung kaputtgegangen ist.
Diese wollte ich schon vor längerer Zeit mal auf LED (Hi Power LED 10 W) umbauen.
Durch den Defekt wurde ich halt gezwungen diesen Umbau vorzuziehen.

Den Arduino hatte ich mir angeschafft um halt irgend wann wenn ich diesen verstehe meine Beleuchtung "naturgetreu" zu simulieren. Da jetzt alles vorgerückt ist bin ich halt ins Eiswasser gesprungen.

Wenn Nachtlicht geht werde ich auch nicht mehr mit solchen Konstrukten belästigen bis ich die Tutorials und durch und verstanden habe.An meiner Fragestellung werde ich auch noch arbeiten.

Versprochen

Ich habe weisse HP LED, blaue HP LED und eine "normale" LED Lichtleiste.

Morgens sollen die blauen angehen und hochgedimmt werden (Funktioniert)
Später sollen die weissen angehen und hochfahren (funktioniert)

Den Zeitraum des hoch und runterfahrens liegt mit diesem Code bei etwa einer Stunde.
Abends im zuerst die weissen, dann die blauen runter bis null (funktioniert.
Wenn blau Null ist soll die Lichtleiste den Mondschein simulieren. (geht nicht)

@Uwe,
entschuldige das Zeilen zählen, aber ich hatte auch an das Copy Paste oder STRG+F gedacht.
Ich habe einen Uno (Jeelabs RBBB).
Wie schon in einem anderen Post geschrieben habe ich den Code fertig aufgefunden und nur an meine Bedürfnisse angepasst.
(ein paar Lampen entfernt).
Ich habe auch vor mich von Anfang an in die Arduino Programmierung einzuarbeiten, mußte aber durch einen Notfall (Meerwasseraquarium mit Beleuchtungsausfall) in tiefe Gewässer vorwagen.
Wenn da das Viechzeug drauf geht habe ich ein großes Problem.
Ich versuche jetzt nur den Code noch ein bisschen anzupassen, damit ich diese Baustelle aus den Füssen habe.

@Mario,

Dieses "Konstruct" habe ich in aus einem Post von Uwe übernommen, in meinen Code kopiert und gehofft das es geht.
Anstatt der Fragezeichen habe ich verschiedene werte genommen, die Uhrzeit verbogen, auf den duino gesppielt, geändert
neu aufgespielt, .... Halt "Trial and error" bis mir gar nichts mehr einfiel.
Erst dann habe ich die Fragezeichen gesetzt , da diese mit "STRG+F" leichter zu finden sind als ein Wort das -zig mal vor kommt.
Ich werde mal versuchen Deinen Vorschlag umzusetzen.
Danke erst mal

@Maverick1509,

habe leider keinen Vornamen gefunden.
Würde gern auf dein DS1307 Angebot zurück kommen, schicke dir eine PN mit meiner Email.
Wenn ich nicht durchblicke, kann ich es noch zurückstellen.
Das manuelle Verstellen per Tasten ist so das was ich mir an Komfort für die Beleuchtung noch vorstelle, um nicht den Duino zum Einstellen ausschrauben zu müssen. Danke schon mal im voraus.

Ich hoffe ich konnte jetzt ein bisschen Klarheit rein bringen.

Gruss Bernd

na so kommen wir der Sache doch schon näher :slight_smile:
ich hab dir schon geantwortet, ich werde dir mal ein Programm schicken und
dann können wir uns austauschen