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
Uhrzeiten vergleichen
12.12.2014, 19:58
Beitrag #1
Uhrzeiten vergleichen
Hallo,

ich habe eine "analoge" Uhr mit 60 RGB-LEDs gebastelt, basierend auf einem fertigen Sketch, leicht modifiziert...
http://netaddict.de/blinkenlights:blinkenclock

Aktuell hole ich mir die Zeit von einem RTC-Modul, es soll aber bald durch ein DCF77 ersetzt werden.

Die Uhr läuft problemlos.

Nun möchte ich das ganze durch eine Weckfunktion ergänzen, habe schon versucht diese Vorlage einzubauen- http://www.pjrc.com/teensy/td_libs_TimeAlarms.html

aber leider bekomme ich die Alarme nicht wie es sein sollte- wenn ich die Alarmfunktion einzeln verwende funktioniert es.

Für mich stellt sich bei der Problematik generell, wie ich Zeiten mit einander vergleichen kann...

die Stunden bekomme ich via "hour", die minuten via "minute" vom RTC... aber wie müßte ich die Alarmzeiten vorgeben um diese mit den aktuellen Zeiten vergleichen zu können.

Letztenendlich muss ich ja sagen
"Vergleiche die Alarmzeit mit der aktuellen Zeit"
"ist die aktuelle Zeit = als die Alarmzeit & aktuelle Zeit < Alarmzeit + 1min ; dann starte Aktion"
"ansonsten mache nichts"

Wer hat eine Idee wie ich diese sketche funktionierend verknüpfe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 23:38
Beitrag #2
RE: Uhrzeiten vergleichen
Hallo,
nun das mit der Uhrzeit ist oft erörtertes Thema, von der Softwareuhr über RTC und NTP Server sowie DCF77 ist alles schon erörtert worden.

Nur mal so als Hinweis, die NTP Server liefern eine Epoch Zeit in der Form ab indem man in einen 32Bit Integer Wert zurückbekommt der die Sekunden seit dem 1.1.1900 um 0:00:00 Uhr angibt.
Eng verwandt dazu gibt es die Linux Zeit wo ab dem 1.1.1970 läuft...auch in Sekunden.

Die Epoch Zeit wird irgendwann in den nächsten 20 Jahren oder so überlaufen...wie das dann weitergeht ist glaube ich noch offen...
Das mal so als Hintergrund....
Wenn du Zeiten vergleichen willst dann könntest ja die aktuelle Uhrzeit aus der RTC usw. in einen 32Bit int Wert umwandeln und der läßt sich dann ja easy vergleichen.
Allerdings mußt dann bei der Eingabe der Weckzeit eben zwischen Variable und Anzeige eine Umrechnung machen was aber auch nicht wirklich schwer ist.

Hoffe mal dir hilft dieser Denkanstoß weiter.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 08:08
Beitrag #3
RE: Uhrzeiten vergleichen
Bei der Alarmfunktion setze ich ja konkret die Werte für die Alarmzeit und rufe eine Funktion auf... das Umrechnen macht ja die libarie... aber an welcher Stelle im zusammengeführten sketch vergleiche iich die aktuelle Zeit mit der Alarmzeit?

Warum sollten eventuelle Empfangsstörungen auf der Sketch Einfluss hsben??? Das ist doch ein Hardwarethema.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 09:28
Beitrag #4
RE: Uhrzeiten vergleichen
(12.12.2014 23:47)Zorg schrieb:  Blush an der DCF77- Variante haben sich schon einige "die Finger gebrochen" - Empfangsstörungen, etc. - Blush

japp, da hast du Recht. Darum schaltet mein DCF Wecker solange er synchronisiert das gemultiplexte LED Display ab. Ein anderer Weg ist es die Antenne etwas weiter weg von der Kontrollerplatine anzubringen.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 10:04
Beitrag #5
RE: Uhrzeiten vergleichen
naja, da ich ja eine analoge Uhr gebaut habe mit 60 LEDs statt einem LCD- Display sollte das Problem hier nicht auftreten....

In einem Dummy mit 12 LEDs läuft das DCF77 ohne Probleme...

Ich habe die einzelnen Funktionen erstmal einzeln programmiert und in Dummys hochgeladen, die auch nur hardwareseitig für diese eine Funktion ausgerüstet sind...

nun geht es um das zusammenführen.

Ich habe jetzt bei voidsetup eine Alarmzeit definiert, die bei der entsprechenden Uhrzeit eine Funktion aufruft...

Mein Problem ist einfach nur zu identifizieren an welcher Stelle ich diese Funktion einführen muss, damit diese auch aufgerufen wird... Im Moment klappt es nicht- ich bekomme aber zumindest auch keine Fehlermeldung....

anbei der Sketch- er ist noch in Arbeit, darum ist da noch relativ viel Müll dabei... Aber er läuft was die Uhr an sich angeht.[/php]

Code:
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <Time.h>  
#include <DS1307RTC.h>
#include <TimeAlarms.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include "printf.h"

int sensorPin = A0;  
int sensorValue = 0;

// define something
#define LED_PIN 8 // LED strip pin
#define BUTTON_PIN 6 // push button pin number
#define ALARM_TIME_MET

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, LED_PIN, NEO_GRB + NEO_KHZ800);

// default mode is clock mode
uint8_t mode = 0;

// alert mode is per default green
uint8_t alert = 0;

// submode
uint8_t submode = 1;

// clock option show five minute dots
uint8_t coptionfivemin = 1;

// clock option invert colors
boolean coptioninvert = 1;

// clock option fade seconds
boolean coptionfade = 1;

// multiprupose counter
int counter = 1;

// alert counter
int alertcounter = 1;

// redraw flag
boolean redraw = 0;

// time cache
unsigned long currenttime = 0;
unsigned long lasttime = 0;
unsigned long alerttime = 0;
int Alarmhours = 0;
int Alarmmins = 0;
// last second
uint8_t lastsecond = 0;

// strip color (ambient)
uint32_t color_ambient;

// initialize everything
void setup() {
  Serial.begin(9600);
  setSyncProvider(RTC.get);
  setSyncInterval(1);
  // create the alarms
  Alarm.alarmRepeat(7,19,0,MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(19,20,0,EveningAlarm);  // 5:45pm every day
  Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm);  // 8:30:30 every Saturday
  
  Alarm.timerRepeat(15, Repeats);            // timer for every 15 seconds    
  Alarm.timerOnce(10, OnceOnly);             // called once after 10 seconds  
  strip.begin();
  strip.show();
  lasttime = millis();
  currenttime = millis();
  alerttime = millis();
  lastsecond = second();
  color_ambient = strip.Color(0, 180, 255);
  pinMode(A1, INPUT);
  pinMode(BUTTON_PIN, INPUT);
  digitalWrite(BUTTON_PIN, HIGH);
  uint8_t alarmHours = 0, alarmMinutes = 0;  // Holds the current alarm time
  uint8_t tmpHours;
  boolean alarm = false;  // Holds the current state of the alarm
  delay(20);

}

// main loop
void loop(){  
  // timing
  currenttime = millis();
  sensorValue = analogRead(sensorPin);

  // apply the calibration to the sensor reading
  sensorValue = map(sensorValue, 0, 700, 0, 255);

  // in case the sensor value is outside the range seen during calibration
  sensorValue = constrain(sensorValue, 0, 255);
  // functions to be called when an alarm triggers:

  // check for button
  if(digitalRead(BUTTON_PIN) == LOW) {
    mode++;
    if (mode>4) {
      mode = 0;  
    }
    delay(250);
}
  // if enough serial data available, process it
  if(Serial.available()) {
    serialMessage();
  }
  
  // select mode and show blinken pixelz!
  // show clock
  if (mode==0) {
    if(currenttime - lasttime > 45) {
      clockMode();
      redraw = 1;
      lasttime = currenttime;
    }
  }

  // demo mode - show rgb cycle
  else if (mode==1) {
    if(currenttime - lasttime > 50) {
      
        // reset counter
      if (counter >= 256) {
        counter = 0;
      }
    
      for(uint16_t i=0; i< strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + counter) & 255));
      }
      redraw = 1;
      counter++;
      lasttime = currenttime;
    }
  }

  // single color mode
  else if (mode==2) {
    if(currenttime - lasttime > 5) {
      lightPixels(strip.Color(155, 155, 155));
      redraw = 1;
      lasttime = currenttime;
    }
  }
  
  else if (mode==3) {
    if(currenttime - lasttime > 5) {
      lightPixels(strip.Color(55, 155, 155));
      redraw = 1;
      lasttime = currenttime;
    }
  }
  else if (mode==4) {
    if(currenttime - lasttime > 5) {
       {lightPixels(strip.Color(155, 55, 55));
      redraw = 1;
      lasttime = currenttime;
    }
  }
  }
  
  // alert - overrides everything
  if (alert && (currenttime - alerttime > 20)) {
    if (alertcounter > 59) {
      alertcounter = 0;  
    }
    alertcounter++;
    redraw = 1;
    alerttime = millis();
  }
  if (alert==1) {
    drawCycle(alertcounter, strip.Color(25, 20, 0));
  }
  if (alert==2) {
    drawCycle(alertcounter, strip.Color(25, 0, 0));
  }
    
  // redraw if needed
  if(redraw) {
    strip.show();
    redraw = 0;
  }
}

// clock mode
String get_day_of_week(uint8_t dow){
  
  String dows="  ";
  switch(dow){
   case 0: dows="So"; break;
   case 1: dows="Mo"; break;
   case 2: dows="Di"; break;
   case 3: dows="Mi"; break;
   case 4: dows="Do"; break;
   case 5: dows="Fr"; break;
   case 6: dows="Sa"; break;
  }
  
  return dows;
}
void MorningAlarm(){
  Serial.println("Alarm: - turn lights off");    
}

void EveningAlarm(){
  Serial.println("Alarm: - turn lights on");          
}

void WeeklyAlarm(){
  Serial.println("Alarm: - its Monday Morning");      
}

void ExplicitAlarm(){
  Serial.println("Alarm: - this triggers only at the given date and time");      
}

void Repeats(){
  Serial.println("15 second timer");        
}

void OnceOnly(){
  Serial.println("This timer only triggers once");  
}

void clockMode() {
  
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year());
  Serial.print(" - ");
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.println();
  
  // Wochentag anzeigen
  switch(weekday()) {
  case 1:
    Serial.println("Sonntag");
    //mySerial.print(" Sonntag  ");
    break;
  case 2:
    Serial.println("Montag");
    //mySerial.print("  Montag  ");
    break;
  case 3:
    Serial.println("Dienstag");
    //mySerial.print(" Dienstag ");
    break;
  case 4:
    Serial.println("Mittwoch");
    //mySerial.print(" Mittwoch ");
    break;
  case 5:
    Serial.println("Donnerstag");
    //mySerial.print("Donnerstag");
    break;
  case 6:
    Serial.println("Freitag");
    //mySerial.print(" Freitag  ");
    break;
  case 7:
    Serial.println("Samstag");
    //mySerial.print(" Samstag  ");
    break;
  }
   time_t t = now();
  uint8_t analoghour = hour(t);
  uint8_t currentsecond = second(t);
  
  if (analoghour > 12) {
    analoghour=(analoghour-12);
  }
  analoghour = analoghour*5+(minute(t)/12);

  lightPixels(strip.Color((256 - sensorValue)/50, (260 - sensorValue)/50, (275 - sensorValue)/50));
  
  if (coptionfivemin) {
    for (uint8_t i=0; i<60; i += 5) {
      strip.setPixelColor(i,strip.Color((270 - sensorValue)/10, (280 - sensorValue)/10, (255 - sensorValue)/15));
    }
  }
  
  strip.setPixelColor(pixelCheck(analoghour-1),strip.Color((255 - sensorValue)/5, (260 - sensorValue)/10, 1));
  strip.setPixelColor(pixelCheck(analoghour),strip.Color((260 - sensorValue), (260 - sensorValue)/2, 0));
  strip.setPixelColor(pixelCheck(analoghour+1),strip.Color((255 - sensorValue)/5, (260 - sensorValue)/10, 1));
  
  strip.setPixelColor(minute(t),strip.Color((257 - sensorValue), (261 - sensorValue)/4, (265 - sensorValue)/15));
  
  if (coptionfade) {
    // reset counter
    if(counter>25) {
      counter = 0;
    }
    else if (lastsecond != currentsecond) {
      lastsecond = second();
      counter = 0;  
    }
    strip.setPixelColor(pixelCheck(second(t)+1),strip.Color(counter*10, counter*10, 0));  
    strip.setPixelColor(second(t),strip.Color(255-(counter*10), 255-(counter*10), 0));
    counter++;
  }
  else {
    strip.setPixelColor(second(t),strip.Color((270 - sensorValue)/5, (257 - sensorValue)/5, 0));
  }
}

// cycle mode
void drawCycle(int i, uint32_t c)
{
  for(uint8_t ii=5; ii>0; ii--) {
    strip.setPixelColor(pixelCheck(i-ii),c);
  }
}

// show a progress bar - assuming that the input-value is based on 100%
void progressBar(int i) {
  map(i, 0, 100, 0, 59);
  lightPixels(strip.Color(0, 0, 0));
  for (uint8_t ii=0; ii<i; ii++) {
    strip.setPixelColor(ii,strip.Color(5, 0, 5));
  }
}

// light all pixels with given values
void lightPixels(uint32_t c) {
  for (uint8_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i,c);
  }
}

// set the correct pixels
int pixelCheck(int i) {
  if (i>59) {
    i = i - 60;
  }
  if (i<0) {
    i = i +60;
  }
  return i;
}

void serialMessage() {
  if(Serial.available()){
    char sw = Serial.read();
    switch (sw) {

      // set time
    case 'T':
      {
        delay(50);
        time_t pctime = 0;
        while(Serial.available() >=  10 ){      
          for(int i=0; i < 10; i++){  
            char c = Serial.read();    
            Serial.print("x");      
            if( c >= '0' && c <= '9'){  
              pctime = (10 * pctime) + (c - '0');    
            }
          }  
        }
        setTime(pctime);
        RTC.set(pctime);
        Serial.println("OK - Time set");
        break;
      }

      //demo mode (shows rgb cycle)
    case 'D':
      {
        mode = 1;
        Serial.println("OK - Demo mode.");
        break;
      }

      //clock mode (shows time)
    case 'C':
      {
        mode = 0;
        Serial.println("OK - Clock mode.");
        break;
      }

      //music mode (clock shows bouncing colors)
    case 'M':
      {
        mode = 2;
        Serial.println("OK - single collor mode");
        break;
      }

      //ambient mode (clock shows defined color)
    case 'L':
      {
        mode = 3;
        Serial.println("OK - Ambient light mode. Chill!");
        break;
      }

      //alert mode - green alert (clock flashes orange)
    case 'G':
      {
        alert = 0;
        Serial.println("OK - Green Alert.");
        break;
      }

      //alert mode - orange alert (clock flashes orange)
    case 'O':
      {
        alert = 1;
        Serial.println("OK - Orange Alert.");
        break;
      }

      //alert mode - red alert (clock flashes red)
    case 'R':
      {
        alert = 2;
        Serial.println("OK - Red Alert - Shields up! Arm the phasers!");
        break;
      }
      
       //clock option five minute dots
    case '5':
      {
        if (coptionfivemin) {
          coptionfivemin = 0;  
        }
        else {
          coptionfivemin = 1;  
        }
        Serial.println("OK - Tongled clock five minute dots.");
        break;
      }
      
       //clock option fade seconds
    case 'F':
      {
        if (coptionfade) {
          coptionfade = 0;  
        }
        else {
          coptionfade = 1;  
        }
        Serial.println("OK - Tongled clock fade mode.");
        break;
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 10:14
Beitrag #6
RE: Uhrzeiten vergleichen
Hi,
soweit ich das verstehe musst Du gar keine Uhrzeiten vergleichen, wenn Du TimeAlarm verwendest. Mit dem setSyncProvider hast Du dem Ding ja schon mitgeteilt, dass Du den RTC-Chip verwendest. Damit müsste ja der Alarm funktionieren...
Wenn das nicht funktioniert, dann mach Dir mal einen einfacheren Sketch, der einen Alarm erzeugt.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 10:32 (Dieser Beitrag wurde zuletzt bearbeitet: 13.12.2014 10:38 von MaHa1976.)
Beitrag #7
RE: Uhrzeiten vergleichen
wenn ich die Alarmfunktion allein laufen lasse funktioniert es...

als Kontrolle nutze ich diesen alle 15sec wiederkehrenden Alarm... der wird mir an der Konsole nicht angezeigt- die aktuelle Uhrzeit mit Datum schon...

Ich habe auch schon versucht die Alarmfunktion an einer anderen Stelle hinzu zu fügen- da bekomme ich jedoch Fehlermeldungen...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 10:48
Beitrag #8
RE: Uhrzeiten vergleichen
Hi,
kannst Du vielleicht mal den Sketch einstellen, der funktioniert?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Strings erstellen und vergleichen BennIY 4 387 22.06.2016 10:37
Letzter Beitrag: SkobyMobil
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 505 29.03.2016 16:45
Letzter Beitrag: MartinK
  Messwerte Zwischenspeichern und Vergleichen Wampo 1 875 09.06.2014 13:06
Letzter Beitrag: Thorsten Pferdekämper

Gehe zu:


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