Pages: 1 [2]   Go Down
Author Topic: PWM abfragen Digital schalten  (Read 2103 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Near Cologne
Offline Offline
Newbie
*
Karma: 1
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 
Logged

Near Cologne
Offline Offline
Newbie
*
Karma: 1
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
 
Quote
#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, 7*HOUR+00*MINUTE,                 21*HOUR+00*MINUTE));
  analogWrite(White2Pin,  brightness(time, 8*HOUR+30*MINUTE,                 19*HOUR+30*MINUTE));

// 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, 7*HOUR+00*MINUTE,                 21*HOUR+00*MINUTE))*100/255) < 10) {
    lcd.print("0");
  }
lcd.print((brightness(time, 7*HOUR+00*MINUTE,                 21*HOUR+00*MINUTE))*100/255);
lcd.print("%");

//White2Pin

lcd.setCursor(9,1);
lcd.print("Sun ");
if(((brightness(time, 8*HOUR+30*MINUTE,                 19*HOUR+30*MINUTE))*100/255) < 10) {
    lcd.print("0");
  }
lcd.print((brightness(time, 8*HOUR+30*MINUTE,                 19*HOUR+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
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21857
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Code:
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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Uwe: Da steht aber noch eine Funktion drin:
Code:
// 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:
Code:
// 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.:
Code:
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.
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
« Last Edit: April 17, 2012, 11:42:02 pm by maverick1509 » Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 270
Posts: 21857
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2338
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Near Cologne
Offline Offline
Newbie
*
Karma: 1
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: 1 [2]   Go Up
Jump to: