Go Down

Topic: Problem mit Zeitsteuerung - achtung Anfänger ;-) (Read 2 times) previous topic - next topic

JochenK

#5
Dec 09, 2011, 09:04 pm Last Edit: Dec 10, 2011, 09:15 am by JochenK Reason: 1
Hallo Leute,

tja wieder ans Reiß(Gedanken)Brett, meine Ideee funktioniert so leider nicht :-(
Ich habe es anfangs mit delay probiert, aber das stört meine Blinkfrequenz der LED, anschließend habe ich die "for" Schleife integriert, und der Summer sollte beim drittten Programmdurchlauf aus gehen, macht er aber einfach nicht...

So lange der Schalter auf High ist, ertönt der Summer (temporär simuliert durch eine LED)

Habt ihr dazu einen Vorschlag für mich?
Hier mein Code:

Code: [Select]
int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
int summer = 11;
int i;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(schalter, INPUT);
  pinMode(summer, OUTPUT);
  digitalWrite(schalter, HIGH);
}
void loop(){
  int val = digitalRead(schalter);
  if (val == LOW) {
    digitalWrite(ledPin2, LOW);
    for (i = 0; i < 3; i++); {
      digitalWrite(summer, HIGH);
    }
    digitalWrite(ledPin1, HIGH);
    delay(500);
  digitalWrite(ledPin1, LOW);
  delay(50);
  digitalWrite(ledPin1, HIGH);
  }
  else { 
   digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(summer, LOW);
  }
}
Gruß Jochen

maverick1509

#6
Dec 10, 2011, 11:58 am Last Edit: Dec 10, 2011, 02:07 pm by maverick1509 Reason: 1
Hallo Jochen,
ich habs mal kurz überflogen.
Deine For Schleife bewirkt eigentlich gar nichts.
Du zählst eine Variable hoch und setzt den Summer auf high, du könntest i auch bis 10.000 hoch zählen lassen,
das wäre das gleiche.
Wenn ich dich richtig verstanden habe soll der Summer einmal gehen wenn der Schalter auf Low geht, ich würde da ein
flag einbauen:
Ich habs jetzt nur kurz hingeschrieben ohne Syntaxprüfung, sollte aber so gehen. Geht aber auch ohne delay, dann muss du mit millis() arbeiten.
Immer wenn der Schalter auf High ist, wird das flag gesetzt. Beim nächsten mal low verzweigt das Programm dann einmal in die if
Schleife, stellt den Summer für 1 Sekunde an und wieder aus.

Code: [Select]

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
int summer = 11;
int flag,i;
void setup()
{
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(schalter, INPUT);
 pinMode(summer, OUTPUT);
 digitalWrite(schalter, HIGH);
 flag=0;
}
void loop(){
 int val = digitalRead(schalter);
 if (val == LOW) {
   digitalWrite(ledPin2, LOW);
   if (flag==1){
     flag=0;
     digitalWrite(summer, HIGH);
     delay(1000);  
    digitalWrite(summer, LOW);    
  }
   digitalWrite(ledPin1, HIGH);
   delay(500);
 digitalWrite(ledPin1, LOW);
 delay(50);
 digitalWrite(ledPin1, HIGH);
 }
 else {  
  flag=1;   
  digitalWrite(ledPin1, LOW);
 digitalWrite(ledPin2, HIGH);
 digitalWrite(summer, LOW);
 }
}

JochenK

Hallo Maverick,

vielen Dank für die Hilfe!
Ich hab es zwar noch nicht verstanden was er nun macht, aber es klappt so wie gewünscht.
Ich habe noch den LEDPin1 zusammen mit dem Summer auf High gesetzt damit Summer und LED gleichzeitig an gehen in der ersten Sekunde, und danach startet meine Blinksequenz.

Super.

Jetzt kann ich in Ruhe anfangen mich durch die beiden Bücher zu arbeiten, hoffentlich bekomm ich die Kurve bald, im Moment stehe ich mir noch oft im Weg wenn ich einfach so versuche Programmcode einzubauen.

Danke Danke Danke ;-)
Gruß Jochen

maverick1509

Hall Jochen,
dafür ist das Forum da.
Wenn du was nicht verstehst: fragen, fragen, fragen.
Gruß
Bernward

Kana

Hallo erstmal,

ich habe ein ähnliches Problem.

Und zwar möchte ich mit dem RTC DS3234 Modul erreichen zu bestimmten Zeiten eine LED zum Leuchten zu bringen.
Aber ich habe keine Ahnung wie ich das bewerkstelligen soll. Ich kann zwarr mittlererweile die Zeit anzeigen lassen (im Serial Monitor) aber ich weiß nicht wie ich da was einfügen soll.
Ich hätte an eine If abfrage gedacht aber so einfach ist das dann doch nicht weil ich nicht weiß nach was die fragen soll.

Vielen Dank schon mal im Voraus.



Quote

#include <SPI.h>
   const int  cs=10; //chip select
   
   void setup() {
     Serial.begin(9600);
     RTC_init();
     //day(1-31), month(1-12), year(0-99), hour(0-23), minute(0-59), second(0-59)
     SetTimeDate(11,12,13,14,15,16);
   }
   
   void loop() {
     Serial.println(ReadTimeDate());
     delay(1000);
   }
   //=====================================
   int RTC_init(){
         pinMode(cs,OUTPUT); // chip select
         // start the SPI library:
         SPI.begin();
         SPI.setBitOrder(MSBFIRST);
         SPI.setDataMode(SPI_MODE1); // both mode 1 & 3 should work
         //set control register
         digitalWrite(cs, LOW);
         SPI.transfer(0x8E);
         SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
         digitalWrite(cs, HIGH);
         delay(10);
   }
   //=====================================
   int SetTimeDate(int d, int mo, int y, int h, int mi, int s){
       int TimeDate [7]={s,mi,h,0,d,mo,y};
       for(int i=0; i<=6;i++){
           if(i==3)
               i++;
           int b= TimeDate/10;
           int a= TimeDate-b*10;
           if(i==2){
               if (b==2)
                   b=B00000010;
               else if (b==1)
                   b=B00000001;
           } 
           TimeDate= a+(b<<4);
              
           digitalWrite(cs, LOW);
           SPI.transfer(i+0x80);
           SPI.transfer(TimeDate);       
           digitalWrite(cs, HIGH);
     }
   }
   //=====================================
   String ReadTimeDate(){
       String temp;
       int TimeDate [7]; //second,minute,hour,null,day,month,year     
       for(int i=0; i<=6;i++){
           if(i==3)
               i++;
           digitalWrite(cs, LOW);
           SPI.transfer(i+0x00);
           unsigned int n = SPI.transfer(0x00);       
           digitalWrite(cs, HIGH);
           int a=n & B00001111;   
           if(i==2){ 
               int b=(n & B00110000)>>4; //24 hour mode
               if(b==B00000010)
                   b=20;       
               else if(b==B00000001)
                   b=10;
               TimeDate=a+b;
           }
           else if(i==4){
               int b=(n & B00110000)>>4;
               TimeDate=a+b*10;
           }
           else if(i==5){
               int b=(n & B00010000)>>4;
               TimeDate=a+b*10;
           }
           else if(i==6){
               int b=(n & B11110000)>>4;
               TimeDate=a+b*10;
           }
           else{ 
               int b=(n & B01110000)>>4;
               TimeDate=a+b*10;
               }
       }
       temp.concat(TimeDate[4]);
       temp.concat("/") ;
       temp.concat(TimeDate[5]);
       temp.concat("/") ;
       temp.concat(TimeDate[6]);
       temp.concat("     ") ;
       temp.concat(TimeDate[2]);
       temp.concat(":") ;
       temp.concat(TimeDate[1]);
       temp.concat(":") ;
       temp.concat(TimeDate[0]);
     return(temp);
}


Das ist mein bisheriger Code ^^


Go Up