INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Dimmen nach Zeit
19.02.2014, 22:51 (Dieser Beitrag wurde zuletzt bearbeitet: 20.02.2014 17:23 von TrashCo.)
Beitrag #9
RE: Dimmen nach Zeit
Welche Second Variable meinst Du jetzt genau?

Habe mal den Code vereinfacht das er nach Zeit einfach nur
Ein- bzw. Ausschaltet das funktioniert Prima:

#include <Wire.h>
#define DS1307_ADDRESS 0x68 // I2C Adresse

const int MosfetPin = 3;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int hell = (255); // Helligkeit 100%
const int dunkel = (0); //Helligkeit 0%

void setup()
{
Wire.begin();
}

byte bcdToDec(byte val) {
//Konventierung von Binary Decimal zu normal Decimal
return ( (val/16*10) + (val%16) );
}

void loop()
{
///// Erfasse Zeit von RTC in RTCHOUR, RTCMINUTE, RTCSECOND
//Setzt den Registerpointer zu 0 (Second)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();

// Lese Sekunde, Minute, und Stunde
Wire.requestFrom(DS1307_ADDRESS, 7);

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


unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden

analogWrite(MosfetPin, brightness(AktuelleZeit, 6*HOUR, 19*HOUR));

delay(1000);
}

byte brightness(unsigned long AktuelleZeit, unsigned long Einschaltzeit, unsigned long Abschaltzeit)
{
// Licht auf maximale Helligkeit hochdimmen
if (AktuelleZeit >= Einschaltzeit && time < Abschaltzeit)
{
return hell;
}

// Licht herunterdimmen
if (AktuelleZeit >= Abschaltzeit | AktuelleZeit < Einschaltzeit) // Herunterdimmen
{
return dunkel
}
}

Jetzt muss ich nur noch die Funktion einbauen das er jeweils beim Ein- bzw. Ausschalten mit einer gewissen Zeitangabe dimmt also 1Stunde hoch- und runterdimmen

Mit dem Beispiel in meinem Eröffnungsthread hat man wie gesagt den Fehler das er den Dimmbefehl immer wiederholt und nicht konstant lässt also wenn er hochdimmt und die 100% erreicht fällt er schlagartig auf 0% ab und wiederholt den Dimmvorgang

MFG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2014, 19:17
Beitrag #10
RE: Dimmen nach Zeit
Hallo trashCo,
versuchs mal so:
Code:
#include <Wire.h>
#define DS1307_ADDRESS 0x68 // I2C Adresse

const int MosfetPin = 3;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int hell = 255; // Helligkeit 100%
const int dunkel = 0; //Helligkeit 0%
unsigned long time = 0;

void setup()
{
  Wire.begin();
}

byte bcdToDec(byte val) {
  //Konventierung von Binary Decimal zu normal Decimal
  return ( (val / 16 * 10) + (val % 16) );
}

void loop()
{
  ///// Erfasse Zeit von RTC in RTCHOUR, RTCMINUTE, RTCSECOND
  //Setzt den Registerpointer zu 0 (Second)
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write((byte)0);
  Wire.endTransmission();

  // Lese Sekunde, Minute, und Stunde
  Wire.requestFrom(DS1307_ADDRESS, 7);

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

  time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden
  analogWrite(MosfetPin, brightness(time, 6 * HOUR, 19 * HOUR));
  delay(1000);
}

byte brightness(unsigned long AktuelleZeit, unsigned long Einschaltzeit, unsigned long Abschaltzeit)
{
  // Licht auf maximale Helligkeit hochdimmen
  if (AktuelleZeit >= Einschaltzeit)
  {
    if (AktuelleZeit <= Einschaltzeit + 3600) return (int)(hell / 3600) * (AktuelleZeit - Einschaltzeit);
    if (AktuelleZeit > Einschaltzeit + 3600 && AktuelleZeit < Abschaltzeit) return hell;
  }

  // Licht herunterdimmen
  if (AktuelleZeit >= Abschaltzeit) // Herunterdimmen
  {
    if (AktuelleZeit <= Abschaltzeit + 3600) return hell - (int)(hell / 3600) * (AktuelleZeit - Abschaltzeit);
    if (AktuelleZeit > Abschaltzeit + 3600 && AktuelleZeit < Einschaltzeit) return dunkel;
  }
}

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2014, 23:34 (Dieser Beitrag wurde zuletzt bearbeitet: 20.02.2014 23:48 von TrashCo.)
Beitrag #11
RE: Dimmen nach Zeit
Nabend Ricardo,

danke erstmal für deine Mühen die du dir hier machst Smile habe erstmal was korrigieren müssen und die ganzen time in AktuelleZeit geändert denn es hat erstmal garnix funktioniert Wink
Habe hier neben mir das Arduino Handbuch vom Franzis Verlag liegen und nun auch die 2 && in || bei Runterdimmen geändert denn wenn ich es richtig verstehe würde es beim runterdimmen mit dem && ein
problem geben sobald die Zeit auf 00:00 stellt dann würde er ja die bedingung nicht mehr erfüllen da es entweder größer oder kleiner nur sein kann (korrigiere mich wenn ich falsch liege) Smile
Code:
#include <Wire.h>
#define DS1307_ADDRESS 0x68 // I2C Adresse

const int MosfetPin = 3;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int hell = 255; // Helligkeit 100%
const int dunkel = 0; //Helligkeit 0%
unsigned long AktuelleZeit = 0;

void setup()
{
  Wire.begin();
}

byte bcdToDec(byte val) {
  //Konventierung von Binary Decimal zu normal Decimal
  return ( (val / 16 * 10) + (val % 16) );
}

void loop()
{
  ///// Erfasse Zeit von RTC in RTCHOUR, RTCMINUTE, RTCSECOND
  //Setzt den Registerpointer zu 0 (Second)
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write((byte)0);
  Wire.endTransmission();

  // Lese Sekunde, Minute, und Stunde
  Wire.requestFrom(DS1307_ADDRESS, 7);

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

  AktuelleZeit = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden
  analogWrite(MosfetPin, brightness(AktuelleZeit, 6*HOUR, 19*HOUR));
  delay(1000);
}

byte brightness(unsigned long AktuelleZeit, unsigned long Einschaltzeit, unsigned long Abschaltzeit)
{
  // Licht auf maximale Helligkeit hochdimmen
  if (AktuelleZeit >= Einschaltzeit)
  {
    if (AktuelleZeit <= Einschaltzeit + 10) return (int)(hell / 10) * (AktuelleZeit - Einschaltzeit);
    if (AktuelleZeit > Einschaltzeit + 10 && AktuelleZeit < Abschaltzeit) return hell;
  }

  // Licht herunterdimmen
  if (AktuelleZeit >= Abschaltzeit) // Herunterdimmen
  {
    if (AktuelleZeit <= Abschaltzeit + 10) return hell - (int)(hell / 10) * (AktuelleZeit - Abschaltzeit);
    if (AktuelleZeit > Abschaltzeit + 10 || AktuelleZeit < Einschaltzeit) return dunkel;
  }
}

Anbei das Problem ist gleich geblieben er dimmt hoch und wenn er fertig ist beginnt die Prozedur von vorne und es ist ein neuer Fehler hinzugekommen mit diesem Code. Ihm ist die eingestellt Zeit zum hochdimmen egal. Wenn ich einstelle er soll um 23:30 uhr mit dem hochdimmen anfangen fängt er obwohl es gerade mal 23:00 ist schon mit dem dimmen an er ignoriert also die Zeit Huh

Hab mir dein Code durchgelesen nach logik sollte es einwandfrei so klappen wenn ich mich nicht zu blöd dafür anstelle Huh
Bin eigentlich absoluter anfänger bringe aber kleine häppchen Kentnisse mit von hier und da mal über die Schulter gucken *gg*

MFG
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2014, 08:13
Beitrag #12
RE: Dimmen nach Zeit
Moin Trashco,
Zitat:Ihm ist die eingestellt Zeit zum hochdimmen egal. Wenn ich einstelle er soll um 23:30 uhr mit dem hochdimmen anfangen fängt er obwohl es gerade mal 23:00 ist schon mit dem dimmen an er ignoriert also die Zeit

Und hier komme ich wieder auf das zurück, was ich oben schon gesagt hatte. Du musst um eine Zeit in die RTC zu schreiben alle Elemente reinbringen. Nicht nur Stunde, Minute, Sekunde, sondern auch Tag, Monat, Jahr. Sonst akzeptiert die RTC dies nicht wirklich und gibt am Ende auch wieder einen unsinnigen Wert an die Funktion brightness().
Fakt ist aber, dass auch die RTC mit den vergangenen Sekunden seit einem Startzeitpunkt (ich glaube 00:00:00 01.01.1970) als eigentliche Zeitangabe arbeitet. Da die Datumswerte fehlen, weiß die RTC nicht wirklich welche Zeit es ist.

Ein anderes Thema ist dann die Ermittlung der Werte zur Mosfet - Ansteuerung.
Irgendwann kannte ich mich mal damit aus, ist aber viele Jahre her. Kann es sein, dass der Mosfet ab einer bestimmten Steuerspannung vollständig "aufmacht"?


Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2014, 09:44 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2014 09:47 von TrashCo.)
Beitrag #13
RE: Dimmen nach Zeit
Moin,

also es ist Zeit, Datum und Jahr alles einprogrammiert in die RTC habe auch ein Sketch um ihn auszulesen über den Serial Monitor da passt alles das habe ich auch schon mal erwähnt.

Er gibt in folgendem Format aus:
DD/MM/JJJJ HH:MMConfusedS //24Std. Format

Wenn ich wirklich nur ohne Dimmen mache funktioniert es mit Zeit tadellos und auch der Code den ich zur Threaderöffnung benutzt habe hat mit Zeit super geklappt nur halt der Fehler das er von neuem beginnt immer, der Fehler das er die Zeit ignoriert ist erst jetzt mit deinem Code aufgetreten Huh

Am RCT kann es definitiv nicht liegen Confused

Zum Mosfet es ist ein IRLZ44N dieser lässt sich bei Logik-Leveln 5V voll durchschalten.

Mfg
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2014, 21:02 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2014 21:07 von TrashCo.)
Beitrag #14
RE: Dimmen nach Zeit
Erstmal sry für Doppelpost Blush

Wollte nur bescheid sagen das ich es nun hinbekommen habe und der Thread geschlossen bzw. als erledigt markiert werden kann.
Habe noch nen pinMode eingebaut um Fehler auszuschließen und den Dimmfehler mittels einer while-Schleife beseitigt.

Anbei der Code für dich Ricardo und für andere die es interessiert:

Code:
#include "Wire.h"
#define DS1307_ADDRESS 0x68 // I2C Adresse

const int MosfetPin = 3;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int tagbetrieb = (255); // Helligkeit 100%
const int nachtbetrieb = (0); //Nachtbetrieb

void setup()
{
Wire.begin();
pinMode(MosfetPin, OUTPUT);
}

byte bcdToDec(byte val)
{
//Konventierung von Binary Dezimal zu normal Dezimal
return ( (val/16*10) + (val%16) );
}

void loop()
{
///// Erfasse Zeit von RTC in RTCHOUR, RTCMINUTE, RTCSECOND
//Setzt den Registerpointer zu 0 (Second)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();

// Lese Sekunde, Minute, und Stunde
Wire.requestFrom(DS1307_ADDRESS, 7);

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


unsigned long AktuelleZeit = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden

analogWrite(MosfetPin, brightness(AktuelleZeit, 20*HOUR + 40*MINUTE, 20*HOUR + 42*MINUTE));

delay(1000);
}

byte brightness(unsigned long AktuelleZeit, unsigned long Einschaltzeit, unsigned long Abschaltzeit)
{
  
// Tagbetrieb
if (AktuelleZeit >= Einschaltzeit && AktuelleZeit <= Einschaltzeit + 1*MINUTE)
  {
   unsigned long seconds = AktuelleZeit - Einschaltzeit;
   return tagbetrieb * seconds / (MINUTE*1);
  }
   while(AktuelleZeit >= Einschaltzeit + 1*MINUTE  && AktuelleZeit < Abschaltzeit)
    {
     return tagbetrieb;
    }
  

// Nachtbetrieb vor Mitternacht
if (AktuelleZeit >= Abschaltzeit && AktuelleZeit <= Abschaltzeit + 1*MINUTE)
  {
   unsigned long seconds = (Abschaltzeit + (MINUTE*1)) - AktuelleZeit;
   return tagbetrieb * seconds / (MINUTE*1);
  }
   while(AktuelleZeit >= Abschaltzeit + 1*MINUTE || AktuelleZeit < Einschaltzeit)
    {
     return nachtbetrieb;
    }

}

Mfg
TrashCo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2014, 21:07
Beitrag #15
RE: Dimmen nach Zeit
(21.02.2014 21:02)TrashCo schrieb:  Erstmal sry für Doppelpost Blush

Wollte nur bescheid sagen das ich es nun hinbekommen habe und der Thread geschlossen bzw. als erledigt markiert werden kann.
Habe noch nen pinMode eingebaut um Fehler auszuschließen und den Dimmfehler mittels einer while-Schleife beseitigt.

Anbei der Code für dich Ricardo und für andere die es interessiert:

Code:
#include "Wire.h"
#define DS1307_ADDRESS 0x68 // I2C Adresse

const int MosfetPin = 3;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int helligkeit = (255); // Helligkeit 100%
const int nachtbetrieb = (0); //Nachtbetrieb

void setup()
{
Wire.begin();
pinMode(MosfetPin, OUTPUT);
}

byte bcdToDec(byte val)
{
//Konventierung von Binary Dezimal zu normal Dezimal
return ( (val/16*10) + (val%16) );
}

void loop()
{
///// Erfasse Zeit von RTC in RTCHOUR, RTCMINUTE, RTCSECOND
//Setzt den Registerpointer zu 0 (Second)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();

// Lese Sekunde, Minute, und Stunde
Wire.requestFrom(DS1307_ADDRESS, 7);

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


unsigned long AktuelleZeit = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Zeit in Sekunden

analogWrite(MosfetPin, brightness(AktuelleZeit, 20*HOUR + 40*MINUTE, 20*HOUR + 42*MINUTE));

delay(1000);
}

byte brightness(unsigned long AktuelleZeit, unsigned long Einschaltzeit, unsigned long Abschaltzeit)
{
  
// Tagbetrieb
if (AktuelleZeit >= Einschaltzeit && AktuelleZeit <= Einschaltzeit + 1*MINUTE)
  {
   unsigned long seconds = AktuelleZeit - Einschaltzeit;
   return helligkeit * seconds / (MINUTE*1);
  }
   while(AktuelleZeit >= Einschaltzeit + 1*MINUTE  && AktuelleZeit < Abschaltzeit)
    {
     return helligkeit;
    }
  

// Nachtbetrieb vor Mitternacht
if (AktuelleZeit >= Abschaltzeit && AktuelleZeit <= Abschaltzeit + 1*MINUTE)
  {
   unsigned long seconds = (Abschaltzeit + (MINUTE*1)) - AktuelleZeit;
   return helligkeit * seconds / (MINUTE*1);
  }
   while(AktuelleZeit >= Abschaltzeit + 1*MINUTE || AktuelleZeit < Einschaltzeit)
    {
     return nachtbetrieb;
    }

}

Mfg
TrashCo

Super!!!!!!!!
hab das die ganze Zeit ein bissel verfolgt - weil Du ja selbst mitgearbeitet hast und Dein Post einfach anders war.
Danke!!! auch für das fertige und funktionierende Ergebnis!!!
Das nenn ich Ardu- Prinzip - helfen und selbst Erarbeiten!!!!
Greetz
Sloompie

Dimidium facti, qui coepit, habet: SAPERE AUDE, incipe!©Horaz

Vor allem sapere aude! oder wie Immanuel Kant sagt:
"Habe Mut, dich deines eigenen Verstandes zu bedienen!"

Es tut auch nicht weh! Daher: incipe! oder Tu es! wie Yoda sagen würde.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2014, 23:07
Beitrag #16
RE: Dimmen nach Zeit
Hallo TrashCo,

Gratulation zum Erfolg!
Manche Dinge sind auf dem Wege kompliziert und sehen im Ergebnis einfach aus - war es hier aber nicht - aber das trainiert SmileSmile
Die While - Schleife ist eine ziemlich geniale Idee!
Aber nochmal der Hinweis:
Deklariere die Variable "AktuelleZeit" ganz oben und benutze sie in der Loop() nur.
Ansonsten gibts irgendwann Streß mit nem Speicherüberlauf.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 268 23.11.2016 17:40
Letzter Beitrag: Tommy56
Question Keine Verbindung via USB nach flashen des Programms chaoscrack 5 204 23.08.2016 14:58
Letzter Beitrag: hotsystems
  String nach UTF16 konvertieren (UTF-16) ThoEngel 0 303 20.02.2016 19:22
Letzter Beitrag: ThoEngel
  Zeit - Verzögerung bergfrei 12 771 14.01.2016 22:09
Letzter Beitrag: Bitklopfer
  Softserial nach Serial1 für den MEGA2560 umsetzen. arduinofan 2 427 27.12.2015 18:40
Letzter Beitrag: arduinofan
  Integer nach Ascii-String ? itoa arduinofan 2 595 22.12.2015 15:34
Letzter Beitrag: arduinofan
  LED mit Joystick steuern / Dimmen und versch. Modis? Hansaplast 12 854 26.10.2015 19:30
Letzter Beitrag: P.Martin
  Mathe-(nach)-hilfe für UTFT rkuehle 9 1.287 30.08.2015 09:11
Letzter Beitrag: rkuehle
  TinyGPSplus: Zeit (1/100 sec) auslesen von GPS Modul GY-NEO-6M V2 HaWe 0 813 23.07.2015 21:20
Letzter Beitrag: HaWe
  Anfänger braucht Hilfe: Avr libs sind nach Update nicht mehr ansprechbar Legofriend 1 628 15.03.2015 23:32
Letzter Beitrag: Foto-Ralf

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste