Anfänger braucht Hilfe bei LED Stuerung mit Arduino

:sleeping: :sleeping:

Hast du dir überhaupt die einfachsten Basics vom Arduino angeschaut. Das hätte spätestens bei dem Blink Sketch auffallen müssen, da sofern nicht anderes geplant ist, pinMode nur in der setup vorkommt. Das habe ich dir vorhin auch bereits geschrieben.

int rot = 8; bzw. #define ROT 8
gehören im GLOBAL Teil.

Also nun habe ich die Variable und pinMode gesetzt wie im Blinkbeispiel.
int... habe ich durch "unsigned long Zeit = RTC.second + RTC.minute *60 + RTC.hour *3600L;" ersetzt wie Michael gesagt hat.
Müsste der Sketch jetzt so stimmen?

MFG

// #############################################################################
// #############################################################################
// #
// # Scriptname : DS1307_Test.pde
// # Author     : Peter Schmelzer, Oliver Kraus
// # Date       : 2011-04-08
 
// # Editor     : Lauren from DFRobot
// # Date       : 30.12.2011
 
// # Description:
// # Test file for the DS1307new library. Assumes that you have a DS1307
// # connected to the I2C-Bus of your Arduino and that it has a battery backup.
// # Update the library and sketch to compatible with IDE V1.0 and earlier
 
// # Version    : 1.0
// #############################################################################
// *********************************************
// INCLUDE
// *********************************************




#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <DS1307new.h>


 
// *********************************************
// DEFINE
// *********************************************
 
// *********************************************
// VARIABLES
// *********************************************
uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again
 
// *********************************************
// SETUP
// *********************************************


int rot = 8;                                            //Variable mit Pin8-------------------------------------------------------
void setup()
{
pinMode(rot, OUTPUT);                                    //Digitaler Pin8 als Ausgang----------------------------------------------


  pinMode(2, INPUT);                    // Test of the SQW pin, D2 = INPUT
  digitalWrite(2, HIGH);                // Test of the SQW pin, D2 = Pullup on
  Serial.begin(9600);


 
/*
   PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!!
                  NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0
                  TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF
                  ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56!
*/
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08
 
/*
   Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
*/
//  TimeIsSet = 0xffff;
//  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); 
 
/*
  Control the clock.
  Clock will only be set if NV-RAM Address does not contain 0xaa.
  DS1307 should have a battery backup.
*/
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));      // 54 auf 55 stellen und datum + Zeiteinstellen
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
         
    RTC.fillByYMD(2014,9,1);
    RTC.fillByHMS(11,36,0);
     
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }
 
/*
   Control Register for SQW pin which can be used as an interrupt.
*/
  RTC.ctrl = 0x00;                      // 0x00=disable SQW pin, 0x10=1Hz,
                                        // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
  RTC.setCTRL();
 
  Serial.println("DS1307 Testsketch");
  Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");
 
  uint8_t MESZ;
 
  MESZ = RTC.isMEZSummerTime();
  Serial.print("MEZ=0, MESZ=1 : ");
  Serial.println(MESZ, DEC);   
  Serial.println();
}


 
// *********************************************
// MAIN (LOOP)
// *********************************************
void loop()
{
  RTC.getTime();
  if (RTC.hour < 10)                    // correct hour if necessary
  {
    Serial.print("0");
    Serial.print(RTC.hour, DEC);
  }
  else
  {
    Serial.print(RTC.hour, DEC);
  }
  Serial.print(":");
  if (RTC.minute < 10)                  // correct minute if necessary
  {
    Serial.print("0");
    Serial.print(RTC.minute, DEC);
  }
  else
  {
    Serial.print(RTC.minute, DEC);
  }
  Serial.print(":");
  if (RTC.second < 10)                  // correct second if necessary
  {
    Serial.print("0");
    Serial.print(RTC.second, DEC);
  }
  else
  {
    Serial.print(RTC.second, DEC);
  }
  Serial.print(" ");
  if (RTC.day < 10)                    // correct date if necessary
  {
    Serial.print("0");
    Serial.print(RTC.day, DEC);
  }
  else
  {
    Serial.print(RTC.day, DEC);
  }
  Serial.print("-");
  if (RTC.month < 10)                   // correct month if necessary
  {
    Serial.print("0");
    Serial.print(RTC.month, DEC);
  }
  else
  {
    Serial.print(RTC.month, DEC);
  }
  Serial.print("-");
  Serial.print(RTC.year, DEC);          // Year need not to be changed
  Serial.print(" ");
  switch (RTC.dow)                      // Friendly printout the weekday
  {
    case 1:
      Serial.print("MON");
      break;
    case 2:
      Serial.print("TUE");
      break;
    case 3:
      Serial.print("WED");
      break;
    case 4:
      Serial.print("THU");
      break;
    case 5:
      Serial.print("FRI");
      break;
    case 6:
      Serial.print("SAT");
      break;
    case 7:
      Serial.print("SUN");
      break;
  }
  Serial.print(" seconds since 1.1.2000:");
  Serial.print(RTC.time2000, DEC);
  uint8_t MESZ = RTC.isMEZSummerTime();
  Serial.print(" MEZ=0, MESZ=1 : ");
  Serial.print(MESZ, DEC); 
   
  Serial.print(" - Address in NV-RAM is: ");
  RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  Serial.print(lastAddr, HEX);
  lastAddr = lastAddr + 1;              // we want to use it as addresscounter for example
  RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet == 0xaa55)              // check if the clock was set or not
  {
    Serial.println(" - Clock was set!");
  }
  else
  {
    Serial.println(" - Clock was NOT set!");
  }   
  delay(1000);                          // wait a second
  {
  

    
unsigned long Zeit = RTC.second + RTC.minute *60 + RTC.hour *3600L;      //Sketch für Led
   
if (Zeit >= 60000){
  digitalWrite(rot, HIGH);} 
else
   digitalWrite(rot, LOW);
   
   
   if(Zeit <= 70000){
   digitalWrite(rot, HIGH);}
else
   digitalWrite(rot, LOW);
}


}

Warum testest du ihn nicht? Hast doch bei den anderen Versuchen auch gemacht.

Die Sache mit dem pinMode passt zumindest nun.

Ich habe ihn getestet,
also meine Led geht nach 1-2Sekunden an nachdem der Sketch draufgeladen ist obwohl die Led von der Zeit noch aus sein sollte.
Es leuchtet auch immer gleich die Diode auf dem Board die mit dem Pin13 verbunden ist.

Wenn ich an Pin13 auch noch eine Led anschließe dann leuchtet die Diode und Led an 13 nicht aber die Led an Pin8 leuchtet trotzdem wie oben schon gesagt nach 1-2Sekunden auf.

Wenn ich ehrlich bin versteh ich das nicht.

MFG

Warum beginnst du nicht mit den Basics und arbeitest dich langsam voran? Haben viele andere auch nicht anders gemacht.
Es bringt nichts, wenn du den copy&paste Code nicht verstehst. Zu den Basics gehört unter anderen das Verständnis der if-Anweisungen (if, else if, else)

/*01)*/if (Zeit >= 60000){
/*02)*/  digitalWrite(rot, HIGH);} 
/*03)*/else
/*04)*/   digitalWrite(rot, LOW);
/*05)*/   
/*06)*/   
/*07)*/   if(Zeit <= 70000){
/*08)*/   digitalWrite(rot, HIGH);}
/*09)*/else
/*10)*/   digitalWrite(rot, LOW);
}

Einen fertigen Code werde ich nicht schicken, denn copy&paste kann nicht der Weg zu Ziel sein.

Zum einen möchtest du die LED einschalten(2), wenn die Zeit >= 60000 ist(1). Trifft dieser Fall nicht zu, wird diese ausgeschaltet(4).

Im zweiten Schritt schaltest du die LED ein (8), sobald der Wert kleiner 70000 (7), anderns falls wieder aus.

Das sollte doch ersichtlich sein, dass eine solche Anweisung überhaupt nichts bringt.
Die Logik, die am Ende der loop steht ist wie folgt.

Zeit <= 70000 LED AN
Zeit > 70000 LED AUS

Ja hast recht, und eine fertige Lösung würde ich auch nicht wollen.
Ich werde jetzt mal ein paar kleine Übungen aus meinem Buch nachbauen sodass ich den Aufbau besser verstehe.
Hast du mir vll noch eine Seite wo es vll auch die eine oder andere gute Übung für den Anfang gibt mit Led´s und vll Zeitsteuerungen.
Dann kann ich mich ja nochmal melden wenn ich die Übungen gemacht habe und das alles besser verstehe,
vll klappt der rest dann auch mal alleine :wink:

An dieser Stelle möchte ich mich nochmals bei allen die mir geholfen haben herzlich bedanken.

MFG Andi

Kontrollstrukturen:

Nicht direkt auf den Arduino bezogen, aber die die Grunlegenden Sachen sind nicht anders.

Vielen dank,
dann werde ich mich mal besser einlesen.

MFG Andi

Hallo ich bin es mal wieder,
hab die letzten 2Tage ein paar kleine Schaltungen gebaut und dann wieder an dem Sketch von mir weiter gemacht.
Nun funktioniert soweit alles bis auf das hoch und runter dimmen zu gewissen Zeiten.
Das ein und aus schalten der Led zu gewissen Zeiten war kein Problem da verwendete ich diesen Code

if(Zeit >= 61200){                  
  digitalWrite(ledpin1, HIGH);} 
if(Zeit >= 61210){
   digitalWrite(ledpin1, LOW);
 }}

Aber wie muss ich den Code nun ändern das die Led hoch und runter dimmt, das muss ich ja alles ohne delay machen.
Hab schon ein bisschen ausprobiert aber es noch nicht hinbekommen
Muss ich das mit einer for-schleife machen?

MFG Andi

Ich habe auch schon anstatt HIGH und LOW eine Variabel (Licht) eingesetzt und diese Formel zum hochdimmen verwendet.

Licht = (Zeit-61200) * 255 / 1800


if(Zeit>=61200){;
analogWrite(5, Licht);
}

MFG Andi

Schön, dass du Code in Code - Tags ( # ) packst.
Allerdings ist Code ohne Variablen-Deklaration nicht sehr aussagefähig

Du meinst sicher

unsigned long Zeit = 62999; // zum Test: 17:29:59

if ( Zeit >= 61200 && Zeit <= 63000 )    // 17:00 bis 17:30
{ 
   byte Licht = (Zeit-61200) * 255 / 1800;  // von 0 nach 255 ansteigend
   analogWrite(5, Licht);
}

So empfinden es die meisten Leute auch als am besten lesbar.
Auch sind überzählige ; manchmal egal, aber nicht immer. Deshalb besser entfernen, um keinen zu verwirren

Danke Michael, das Hochdimmen klappt nun,
aber fürs runter dimmen muss ich ja eine andere Formel nehmen
und da wird es ja schwieriger weil der Wert von der Zeit ja immer größer wird.
Wie bekomme ich es dahin das er von den 255 wieder runter rechnet?
MFG

Wie bekomme ich es dahin das er von den 255 wieder runter rechnet?

Das ist jetzt nicht dein Ernst ?

  byte Licht = (63000 - Zeit) * 255 / 1800;  // was passiert bei Zeit = 61200, was bei 63000 ???

Die Funktion map() kannst du dir auch mal anschauen, die macht das Gleiche.

61200 entspricht 255 und bei 62100 ca 127 und bei 63000 entspricht es ca0.
Sorry hab gestern glaub vor lauter Bäume den Wald nicht gesehen :slight_smile:
Das mit dem map hab ich probiert hat aber nicht geklappt.
Und in meinem buch hab ich die funktion nicht gesehen zum nachlesen.
Muss man vor dem sketchteil "ledvalue = map ( zeit, 28800, 30600, 0, 204);" trotzdem eine if funktion machen?
Oder woher weis der arduino wann er beginnt und welche ledpin gemeint ist?
If(zeit>=61200)
{aber wie schreib ich den teil dann hier bei der map funktion, das er die ledpin startet
}

Mit freundlichen Grüßen

Natürlich müssen die Werte passen, sonst bringt das nichts, siehe auch in der Referenz map().
http://arduino.cc/en/Reference/Map

if(time >= 28800 && time <= 30600) value = map ( zeit, 28800, 30600, 0, 204);

Hab mein Fehler glaub entdeckt, hab bei analogWrite vergessen value anzugeben.
Jetzt hätte ich noch eine Frage, hat jemand von euch schon die KSQ Meanwell ldd ausprobiert.
Sind die gut oder gibt es da bessere KSQ.
Vielen dank an alle das Ihr euch soviel zeit für mich und mein Anliegen genommen habt.
Kann den Forum hier nur weiterempfehlen.
Mit freundlichen Grüßen andi