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.
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.
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_tformat)
2
{
3
char*output="xxxxxxxxx";
4
Timet;
5
t=getTime();
6
switch(t.dow)
7
{
8
caseMONDAY:
9
output="Monday";
10
break;
11
caseTUESDAY:
12
output="Tuesday";
13
break;
14
caseWEDNESDAY:
15
output="Wednesday";
16
break;
17
caseTHURSDAY:
18
output="Thursday";
19
break;
20
caseFRIDAY:
21
output="Friday";
22
break;
23
caseSATURDAY:
24
output="Saturday";
25
break;
26
caseSUNDAY:
27
output="Sunday";
28
break;
29
}
30
if(format==FORMAT_SHORT)
31
output[3]=0;
32
returnoutput;
33
}
kann man wirklich sehr, sehr schnell das hier machen:
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
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:
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.
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.
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:
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.
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
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?
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
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.
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.
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)
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;
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
:-)
So eine Kaskade löst man typischerweise mit einem switch:
1
switch(rtc.getDOW()){
2
case1:
3
// tu was am Montag
4
break;
5
case2:
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.
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.
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