Forum: Compiler & IDEs rtc 1302 tage vergleichen (arduino)


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Wie kann ich den rtc1302 Chip abfragen und vergleichen welcher wochentag 
heute ist besser gesagt eine if abfrage so schreiben das zb Montag / 
monday wert 1 zu trifft und Dienstag halt wert 2.

ich habe es jetzt zumindest so weit gebracht das ich es zwar Kompilieren 
kann es aber nicht ausgeführt wird.
Habe es unter andern so versucht mit #include <DS1302.h> und :

 if (rtc.getDOWStr(FORMAT_SHORT) == MONDAY)
    {
      mache was nur am montag ();
    }

Und / oder

 if (rtc.getDOWStr(FORMAT_SHORT) == 1) //(1 = Montag)
    {
     mache was ();
    }

so wie

if (rtc.getDOWStr() == MONDAY)
    {
      mache was ();
    }

Auch versucht habe ichs mit

 if (rtc.getDOWStr() == 1) //(1 = Montag)
    {
     mache was ();
    }
und noch andern was mir grade nicht ein fehlt.

Als Fehlermeldung bekomme ich, das ich nur ganze ganze vergleichen kann 
und es versucht wird monday in ein marko umzuwandeln.

So richtig fündig wurde ich auch mit google nicht.
Wie ich zeit abfrage das weiß ich schon länger nur Wochentage 
vergleichen wollten nicht klappen.

Vielen lieben danke für eure/deine Hilfe und ein schönes neues Jahr.

von Codix (Gast)


Lesenswert?

Hallo David. Die Funktion liefert einen String zurück und keinen Wert. 
Du musst den String zuerst einem Char Array zuweisen und dann 
vergleichen (strcmp) oder direkt den Aufruf in strcmp als Parameter 
angeben.
Ich würde die erste Variante wählen, einen Hash erzeugen und mit einem 
switch auswerten. strcmp braucht zuviel Zeit. Ein BCC zu erzeugen sollte 
auch ausreichend sein. Habe dies nicht verifiziert, bin mit meinem BLU 
Handy unterwegs.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich würde mir die Sourcen dieser "Library" ansehen und die hier 
offensichtlich benötigte Funktion "getDOW" nachrüsten, die den Wochentag 
als numerischen Wert (mit den schon oben im nicht funktionierenden 
Programmbeispiel verwendeten Konstanten wie MONDAY) zurückgibt.

Und das ist simpel. Aus
1
char *DS1302::getDOWStr(uint8_t format)
2
{
3
  char *output= "xxxxxxxxx";
4
  Time t;
5
  t=getTime();
6
  switch (t.dow)
7
  {
8
    case MONDAY:
9
      output="Monday";
10
      break;
11
    case TUESDAY:
12
      output="Tuesday";
13
      break;
14
    case WEDNESDAY:
15
      output="Wednesday";
16
      break;
17
    case THURSDAY:
18
      output="Thursday";
19
      break;
20
    case FRIDAY:
21
      output="Friday";
22
      break;
23
    case SATURDAY:
24
      output="Saturday";
25
      break;
26
    case SUNDAY:
27
      output="Sunday";
28
      break;
29
  }     
30
  if (format==FORMAT_SHORT)
31
    output[3]=0;
32
  return output;
33
}

kann man wirklich sehr, sehr schnell das hier machen:
1
int DS1302::getDOW()
2
{
3
  Time t;
4
  t=getTime();
5
  return t.dow;
6
}

: Bearbeitet durch User
von DAVID B. (bastler-david)


Lesenswert?

Super vielen dank euch beiden. (gesundes neues)

Das einfügen und anpassen an Code war schnell gemacht.
Leider hat sich in:

int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}
Noch ein Fehler versteckt  (exit status 1  qualified-id in declaration 
before '(' token)  Es muss also in

int DS1302::getDOW()

Noch ein ( eingebaut werden aber wo ?
Vielen dank

von tictactoe (Gast)


Lesenswert?

DAVID -. schrieb:
Das hier:
1
int DS1302::getDOW()
2
{
3
  Time t;
4
  t=getTime();
5
  return t.dow;
6
}
kannst du nur schreiben, wenn du auch die Kontrolle über die Klasse 
DS1302 hast. Hast du aber nicht (die kommt ja aus #include <DS1302.h>). 
Es bleibt dir nur übrig, eine freie Funktion zu schreiben:
1
static int getDOW(DS1302& clock)  // besser: const DS1302& clock
2
{
3
  return clock.getTime().dow;
4
}
Setzt voraus, das getTime() public ist. Wäre aber eine ausgesprochen 
dumme Klasse, wenn es das nicht wäre.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich bin natürlich davon ausgegangen, daß der Prototyp der neuen Funktion 
getDOW zur Klassendeklaration in der *.h hinzugefügt wird, und daß die 
Implementierung der Funktion ebenso in der zugehörigen *.cpp-Datei 
erfolgt.

Meine Formulierung

> Ich würde mir die Sourcen dieser "Library" ansehen und die hier
> offensichtlich benötigte Funktion "getDOW" nachrüsten

sollte da eigentlich klar genug gewesen sein.

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Ehm tut mir leid so ganz folgen könnte ich dir nicht.
Habe gedacht das int DS1302::getDOW() in den code mit soll?

Ok noch mal für mich ich soll also:

int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}

in die  DS1302.cpp oder in die DS1302.H einbinden ?

und die if ist dann

if (rtc.getDOWStr(FORMAT_SHORT) == MONDAY)
    {
      mache was nur am montag ();
    }
oder nur noch
if (rtc.getDOW) == 1)
    {
      mache was nur am montag ();
    }
Möchte nur verstehen wie man sowas richtig macht.
Vielen lieben dank ihr 3.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Implementierung der Funktion gehört in die *.cpp-Datei, aber in der 
Klassendeklaration in der *.h-Datei musst Du noch einen 
Funktionsprototypen einfügen, damit klar ist, daß die Funktion überhaupt 
eine Memberfunktion der Klasse ist.

Das sieht dann so aus:
1
...
2
...
3
4
  char  *getDateStr(uint8_t slformat=FORMAT_LONG, uint8_t eformat=FORMAT_LITTLEENDIAN, char divider='.');
5
  char  *getDOWStr(uint8_t format=FORMAT_LONG);
6
  char  *getMonthStr(uint8_t format=FORMAT_LONG);
7
  
8
  // diese Zeile hier ist neu
9
  int getDOW();
10
...
11
...


Aufgerufen wird die Funktion dann so:
1
if (rtc.getDOW() == MONDAY)
2
{
3
mache was nur am montag ();
4
}

Wie wäre es, wenn Du nach all der Zeit mal ein Buch über die 
Grundlagen der von Dir genutzten Programmiersprache durchlesen würdest?

von PittyJ (Gast)


Lesenswert?

Zumindest sollte man den Unterschied von Strings (char *) und Zahlen 
(integer) kennen. Und dafür hilft ein gutes Lehrbuch.
Nur Copy und Paste hilft leider nicht.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Basicbeispiel

Print Mid$("MoDiMiDofrSaSo",2*DOW+1,2)

Lässt sich sicher auch in C in einem Einzeiler machen.
Wenn unterschiedliche Stringlänge nötig dann Stringarray.
Das geht vorwärts wie rückwärts.

Sorry bin grad im Basicmode(schüttel), habe tagelang mit dem TFTMaximite 
eine Notrufzentrale mit DTMFübertagung simuliert, wo das Thema auch 
dabei war.

Namaste

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Winfried J. schrieb:
> Lässt sich sicher auch in C in einem Einzeiler machen.

Der Threadstarter möchte nur wissen, welcher Wochentag gerade ist, dazu 
ist überhaupt keine Stringverarbeitung erforderlich. Nur hat aus welchen 
Gründen auch immer die tolle von ihm verwendete "Library" nur eine 
Funktion angeboten, die den Namen des Wochentags als String liefert, 
aber nicht den Wochentag als numerische Konstante (obwohl es eine 
korrespondierende Funktion zum setzen des Wochentags mit numerischer 
Konstante gibt).

Daher bietet es sich an, die fehlende 
"liefere-den-Wochentag-als-numerische-Konstante"-Funktion nachzurüsten, 
und die ist gerade mal ein Dreizeiler, wie sich gezeigt hat.

Stringverarbeitung kommt da gar keine vor; wozu auch?

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

oh das habe ich mit nem 3 Zeiler direkt per I2C direkt in die RTC hinen 
und wieder heraus gepolkt, weil die Systemuhr da einen kompletten Bogen 
drum machte auch im sourcecode des Interpreters. Ich habe extra 
nachgeschaut ob DOW ausgelesen wird. dafür musste ich sogar noch HW 
ändern weil die RTC eine extra I2C bus hat und ich nicht schon wieder 
Die MMBasic.firmware umschreiben wollte, nur da ran zu kommen.

Namaste

von DAVID B. (bastler-david)


Lesenswert?

Ich bedanke mich noch mal bei euch das einlesen in Bücher und co ist 
durch aus im Hintergrund aber ich muss halt doch fragen weil ich auch 
vieles was ich lese nicht wirklich verstehe daher hier und da mal fragen 
die für euch klar sind für mich aber unverständlich sind.

ok wie dem auch sei.
ich habe so wie ich das verstanden habe ich 2 dateien geändert und das 
Kompilieren ergab schon mal was diesen teil an geht keine Fehler mehr.

obs geht wird sich morgen zeigen / bin zufaul die rtc auszubauen und um 
zuprogrammieren nur für diesen test da warte ich lieber bis morgen.

Ein anderes Problem was mir von Anfang an auf gefallen ist bei der rtc 
Library gibt es Zeilen wo werte als t gespeichert zb ( t=getTime();) 
werden so weit so gut.

ABER Ist es schlimm wenn mehrere librarys werte als t speichern dann im 
Programm code aber in andere buchstaben oder zahlen um gespeichert 
werden ? oder wäre es besser jeder Library extra buchstaben/zahlen 
zugeben?

Danke ihr habt mir bis jetzt schon sehr geholfen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DAVID -. schrieb:
> Ein anderes Problem was mir von Anfang an auf gefallen ist

... Du solltest in Deinem Buch mal den Abschnitt über die Gültigkeit 
und Sichtbarkeit von Variablen durchlesen, und den Unterschied 
zwischen lokalen und globalen Variablen herausarbeiten.

Das ist elementares Grundlagenwissen.

von DAVID B. (bastler-david)


Lesenswert?

hallo
Kurze Rückmeldung es scheint Woll zu funktionieren.
nach dem bearbeiten der library.
Vielen dank

PS
und für leute die vor dem selben problem stehen hänge ich die geänderten 
daten mal an (Wochen tage wurden ins deutsche geändert)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DAVID -. schrieb:
> Wochen tage wurden ins deutsche geändert

Die solltest Du Dir nochmal genauer ansehen, da musst Du etwas *mehr 
Sorgfalt* an den Tag legen als Du es bei Deiner eher ... ausbaufähigen 
Rechtschreibung sonst tust.

-> "Sontag"

-> "Maez"

und dann doch englische Namen für Mai, Juli, Oktober und Dezember?

Auch das mit dem Formatieren von Quelltext solltest Du noch etwas üben:
1
...
2
  if (format==FORMAT_SHORT)
3
    output[3]=0;
4
  return output;
5
} int DS1302::getDOW() {  Time t;   t=getTime();  return t.dow;
6
}

Das ist ... grindig.

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Ok da rufus entweder noch keine zeit hatte oder mein Löschwunsch 
abgeschlagen hat.
Hier noch mal der hinweiß es ist wie rufus schon sagte ist das oben eine 
fehlerhafte Datei BITTE NICHT LADEN.

Hier die richtigen.

Und der code dazu:

if (rtc.getDOW() == 1) //(1 = Montag)
    {
      Tut was an diesen tag
    }

    if (rtc.getDOW() == 2) // = Dienstag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 3) // = Mittwoch)
    {
      Tut was an diesen tag
    }

    if (rtc.getDOW() == 4) // = Donnerstag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 5) // = Freitag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 6) // = Samstag)
    {
      Tut was an diesen tag

    }

    if (rtc.getDOW() == 7) // = Sonntag)
    {
      Tut was an diesen tag
    }

Es müssen zahlen seinen int speichert ja keine Buchstaben ganz vergessen 
:-)

von tictactoe (Gast)


Lesenswert?

So eine Kaskade löst man typischerweise mit einem switch:
1
switch (rtc.getDOW()) {
2
case 1:
3
   // tu was am Montag
4
   break;
5
case 2:
6
   ...
7
}
Als netter Seiteneffekt wird getDOW() nur einmal aufgerufen. Die 
Funktion könnte ja was vollkommen Nicht-Triviales machen, wie z.B. den 
DS1302 auslesen, das will man normalerweise nicht zu oft tun.

von DAVID B. (bastler-david)


Lesenswert?

ok um das Thema abzuschließen es muss doch mit tagen abgefragt werden 
zahlen werden nicht vergleichen ?

also:

if (rtc.getDOW() == friday)
    {
     Tut was an diesen tag
    }

naja es scheint zu laufen ob zufall oder nicht wird sich zeigen müssen.
DANKE euch allen.

von Joachim B. (jar)


Lesenswert?

Rufus Τ. F. schrieb:
> Nur hat aus welchen
> Gründen auch immer die tolle von ihm verwendete "Library" nur eine
> Funktion angeboten, die den Namen des Wochentags als String liefert,
> aber nicht den Wochentag als numerische Konstante

wobei man sagen muss, die Zeiten ändern sich, damals (tm) in der CT war 
der Sonntag noch 0, heute eben 7
PS die <SPACE> am Ende hatte ich beigefügt um immer die gleiche 
Textlänge zu erhalten
1
char *strWochentagname( uint8_t TagNummer )
2
{ switch (TagNummer)
3
  { case 1:
4
      return"Montag    ";
5
    case 2:
6
      return"Dienstag  ";
7
    case 3:
8
      return"Mittwoch  ";
9
    case 4:
10
      return"Donnerstag";
11
    case 5:
12
      return"Freitag   ";
13
    case 6:
14
      return"Samstag   ";
15
    case 7: //  RTC
16
      //case 0: //  C'T
17
      return"Sonntag   ";
18
    default: 
19
      return"ERROR     ";
20
  } // switch (TagNummer)
21
} // char *strWochentagname( uint8_t TagNummer )

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DAVID -. schrieb:
> Es müssen zahlen seinen

Wozu mag das hier in der *.h-Datei drinstehen?
1
#define MONDAY    1
2
#define TUESDAY    2
3
#define WEDNESDAY  3
4
#define THURSDAY  4
5
#define FRIDAY    5
6
#define SATURDAY  6
7
#define SUNDAY    7

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.