Mondaufgang halbwegs berechnen/schätzen

Hallo zusammen,

ich suche nach einem Ansatz den Mondaufgang halbwegs für den aktuellen Tag zu berechnen. Ich bin so langsam am Verzweifeln, weil das doch scheinbar gar nicht so einfach ist. Aber evtl. steh ich ja einfach nur völlig aufm Schlauch.

Ich hab schon versucht den Mondaufgang anhand der durchschnittlichen Verschiebung von täglich 48min zu berechnen, aber je weiter ich den Bekannten Aufgang ich die Vergangenheit schiebe umso unrealistischer wird das Ergebnis. Für einen Monat hauts bis auf ne Stunde ungefähr hin.
Aber bei der Auswahl des Tages mit bekanntem Aufgang fängts ja schon an, welchen nimmt man da am besten? Die tägliche Verschiebung schwankt ja doch schon recht stark.
Ich weiß auch nich ob sich der ganze Aufwand wirklich lohnt, aber ich hatte halt den Ehrgeiz das hin zu bekommen.

Ein Tipp mit ein paar passenden Codefetzen oder ein anderweitiger Denkansatz wär schon schön. Für JavaScript hab ich da was gefunden, aber mein C ist nich so gut als dass ich das hätte portieren können.

Hab auch immer wieder Verweise auf ein Astronomie Buch gefunden, aber son Aufwand wollt ich dann auch nich betreiben. Mir würde ein funktionierendes Codestück reichen, was da so alles berechnet wird muss ich nich verstehen, wenn das Ergebnis halbwegs hin haut. Für die einzelnen Mondphasen hab ich schon was gefunden das gut funktioniert, da wärs schön wenn’s mit dem Auf- und Untergang auch noch klappt.

Schon mal recht herzlichen Dank fürs Zuhören, bin für jeden Ansatz dankbar.

Im Thema Mond berechnen wurde schon mal darüber nachgedacht und Andreas ist hier noch aktiv.

http://lexikon.astronomie.info/java/sunmoon/
gibs ein C Beispielprogramm.
Grüße Uwe

:slight_smile: Vielen Dank für die schnellen Antworten. Die beiden Seiten hab ich auch schon mal überflogen, aber erstmal als zu kompliziert getagged. Dann solls halt so sein und ich werf noch mal nen Blick mehr rein 8)

Hallo nochmal,
wie schon befürchtet übersteigt die Anpassung an nen Arduino genauer gesagt nen Wemos ESP8266 meine Möglichkeiten. Zu Anfang war ich ja noch ganz optimistisch, aber mittlerweile weiß auch Mutter Google nix mehr mit den vielfältigen Fehlermeldungen anzufangen.

Archiving built core (caching) in: C:\Users\PC\AppData\Local\Temp\arduino_cache_502123\core\core_esp8266_esp8266_d1_mini_CpuFrequency_80,UploadSpeed_921600,FlashSize_4M3M_d89bca84340d13f1426874f568481e0b.a
sketch\sunmonn_test.ino.cpp.o:(.text.startup._GLOBAL__sub_I_setup+0x4): undefined reference to std::ios_base::Init::Init()' sketch\sunmonn_test.ino.cpp.o: In function __static_initialization_and_destruction_0':

Der Mondaufgang bleibt erst mal ein Mysterium.

Hallo,

ich weiß ich bin lästig, aber ich habs hin bekommen. Der C Code von Stephan Schweig http://lexikon.astronomie.info/java/sunmoon/ lässt sich jetzt fehlerfrei, in ein ESP8266 Projekt inkludiert, kompilieren. Aber nu stellt sich die Frage wie benutzt man ihn? :-\ Kennt den hier evtl. jemand ?

Wo soll ich anfangen? Hat den schon mal jemand hier benutzt? Ich bräuchte mal nen Tip für nen nächsten Schritt/Einstieg.

Sorry wenn meine Fragen so unpräziese sind, aber ich bin ja wie gesagt nich so der C Experte, aber hartnäckig und bereit was dazu zu lernen.

Und Danke schon mal für Eure Mühe.

Aber nu stellt sich die Frage wie benutzt man ihn?

  1. Man wählt die C++ Library aus ( hast du ja schon gemacht, da sie sogar kompiliert.

  2. Man guckt sich die include Datei an (sunmoon.h)
    Da sind mehrere Konstruktoren, vermutlich ist der wo du deine Geographischen Koordinaten angeben kannst, sinnvoll.
    Da sind jede Mege Methoden im public Abschnitt, die kannst du mit deinem SunMoon Objekt aufrufen.

  3. Ins Arduino - Format gequetscht:

#include "SunMoon.h"

double lat = 50.0;
double lon = 9.0;
struct tm time = ...; // Die aktuelle Zeit
double deltaT = 65.0 ; // k.A.

SunMoon here = SunMoon(lat, lon, &time, deltaT); // here definiert jetzt deine Beobachtungspos und Zeit.

void setup() {
  Serial.begin(9600);
  TimeSpan moonRise = here.GetMoonRise();
  Serial.print (moonRise.GetHour());Serial.print(":");Serial.println (moonRise.GetMinute());
}
  1. Das vergleichst du mit dem was die Webseite ausgibt, und fummelst evtl. noch an der ZeitZone, führende Nullen bei der Zeit-Ausgabe, usw.

Wie gesagt, ich hab keine Ahnung...

michael_x Für "keine Ahnung" schreibst Du viel :wink: :wink: :wink:

Muß man nicht irgendwo auch das Datum angeben?

Grüße Uwe

uwefed:
Muß man nicht irgendwo auch das Datum angeben?

Könnte möglicherweise die Struktur time dazu taugen?

Hallo, die CPP Variante hab ich erst mal bei Seite gelegt und in meiner Verzweiflung es noch mal mit der in C probiert. Nur noch mal als Info. Hier bin ich mit der C Version aus dem Paket im Klich.

Jo und das mit den Strukturen peil ich nich. Ich komm ja eher aus der Web-Ecke und bin zu doof für struct tm mit und ohne * oder & :sob: Zeitstempel mal als time(0) mal als now(). Ich häng an diesem blöden Datum und peils einfach nich.

  time_t jetzt =now();
  struct tm* heute;
  struct tm *localtime(const time_t *jetzt);
  Serial.println(String(heute->tm_sec));

lässt sich kompilieren, gibt aber das hier aus :-\

Exception (28):
epc1=0x40201c81 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3ffef850 end: 3ffefa30 offset: 01a0

stack>>>
3ffef9f0: 3fffdad0 00000000 3ffee9dc 40201c7f
3ffefa00: feefeffe feefeffe feefeffe feefeffe
3ffefa10: feefeffe feefeffe 3ffee9f8 402022a0
3ffefa20: feefeffe feefeffe 3ffeea10 40100114
<<<stack<<<
0⸮a⸮a⸮)⸮B!V⸮⸮F

So,

  time_t jetzt =now();
  struct tm heute;
  Serial.println(String(heute.tm_sec));

komm ich auch zu ner Ausgabe, aber da is ja nix drin, der Serial Monitor hat dazu nur "-17829890
" zu sagen.

Wie bekomm ich also ein gefülltes struct tm das ich dann an sunmoon() übergeben kann? Is ja bestimmt ganz einfach, aber ich versteh die Fehlermeldungen nich. Mir fehlen zu viele Grundlagen und die Erfahrung beim C Debuggen. Mit Websprachen ist das alles viel einfacher.

Das Projekt welches um den Mond erweitert werden soll, läuft auf nem ES8266 und braucht die TimeLib.h mit der bekomm ich ja den Zeitstempel per now(), und die sunmoon.h nutzt wie solls anders sein time.h. Wie bekommt man die beiden nu zusammen? Einfach beide einbinden klappt schon mal, aber hat das evtl. anderweitige Spätfolgen?

jetzt und heute sind zwei unterschiedliche Variable. Und heute wird nie gesetzt.

Wenn ich in die time.h Referenz schaue, sehe ich die Funktion time, die das aktuelle Datum zurückliefern soll. Wenn dein dingens (ESP8266) diese denn hat (keine Ahnung).

probier mal:

 time_t rawtime;  // Anzahl Sekunden seit 1970
  struct tm * timeinfo;

  time (&rawtime);  //  füllt rawtime
  timeinfo = localtime (&rawtime); // füllt eine struct tm und liefert einen Zeiger darauf
  Serial.println(asctime(timeinfo));

Sonst kann man eine struct tm auch von Hand setzen...
Oder man kriegt die Sekunden seit 1970 sonstwie raus (heute um 12:00 sind es 1521547200 :wink: )

Hallo, ohne TimeLib.h bekomm ich Thu Jan 01 00:00:00 1970 als ausgabe und mit TimeLib.h gibbet wieder verstörende Fehlermeldungen >:(

sunmonn_test:29: error: 'time' was not declared in this scope
time (&rawtime); // füllt rawtime
^
sunmonn_test:30: error: 'localtime' was not declared in this scope
timeinfo = localtime (&rawtime); // füllt eine struct tm und liefert einen Zeiger darauf
^
sunmonn_test:31: error: 'asctime' was not declared in this scope
Serial.println(asctime(timeinfo));
^
exit status 1
'time' was not declared in this scope

Auf den ersten Blick siehts ganz vielversprechend. Danke :slight_smile: Muss jetzt erst mal meim Hauptberuf nachgehen.

Ohne TimeLib.h bekomm ich Thu Jan 01 00:00:00 1970 als ausgabe

Super!

mit TimeLib.h gibbet ... Fehlermeldungen

Nicht "mit TimeLib.h" sondern "ohne time.h"

Wenn vorher z.B. asctime nicht angemeckert wurde, dann hast du es wohl erfolgreich versteckt.

Ob bzw. wie die TimeLib nun irgendwie eine "unixtime" liefert also die Anzahl Sekunden seit 1970), die du dann an deine time_t Variable gibst, findest du sicher raus :wink:

TroyPan:
Hallo,

ich weiß ich bin lästig, aber ich habs hin bekommen. Der C Code von Stephan Schweig http://lexikon.astronomie.info/java/sunmoon/ lässt sich jetzt fehlerfrei, in ein ESP8266 Projekt inkludiert, kompilieren. Aber nu stellt sich die Frage wie benutzt man ihn? :-\ Kennt den hier evtl. jemand ?
...

Was hattest du geändert damit es fehlerfrei compiliert?

@peter_de
Ich hab jede menge Fehlermeldungen bekommen, aber das lag an der falschen lib für die Zeit. Was dann zu weiteren Fehlern führte, ... Ich wollte zu schnell zu weit. Für einen fehlerfreien Durchlauf hat es gereicht #include <memory.h> auszukommentieren. Die memory.h die ich gefunden hab hat nur weitere für mich unverständliche Fehler verursacht und nach // lief es ohne Fehler durch. Nu is die Frage verursacht das evtl. andere Spätfolgen?

Jetzt könnte man ja nu meinen, alles prima! Aber irgendwie doch nich.

#include <Arduino.h>
#include <sunmoon.h>
#include <Time.h>
void setup() {
  Serial.begin(19200);
  double lat = 50.0;
  double lon = 9.0;
  double deltaT = 65.0 ;           // k.A.
  time_t rawtime;                    // Anzahl Sekunden seit 1970
  struct tm * timeinfo;             // Die aktuelle Zeit
  time (&rawtime);                  // füllt rawtime
  timeinfo = localtime (&rawtime);  // füllt eine struct tm und liefert einen Zeiger darauf
  struct SUN_MOON * ausgabe;        // Ausgabestruktur
  // sun_moon(double latitude, double longitude, struct tm* datetime, double deltaT, int zone, struct SUN_MOON* output)
  int sunmonninfos = sun_moon(lat, lon, timeinfo, deltaT, 1, ausgabe);

Koordienaten, Zeit, deltaT, ... alles da, aber der Aufruf von sun_moon() mit all dem Zubehör provoziert den Compiler wieder nur dazu:

Archiving built core (caching) in: C:\Users\Boje\AppData\Local\Temp\arduino_cache_530127\core\core_esp8266_esp8266_d1_mini_CpuFrequency_80,UploadSpeed_921600,FlashSize_4M3M_d89bca84340d13f1426874f568481e0b.a
sketch\sunmonn_test.ino.cpp.o:(.text.setup+0x18): undefined reference to sun_moon(double, double, tm*, double, int, SUN_MOON*)' sketch\sunmonn_test.ino.cpp.o: In function setup':
C:\Users\Boje\Documents\Arduino\sunmonn_test/sunmonn_test.ino:15: undefined reference to `sun_moon(double, double, tm*, double, int, SUN_MOON*)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board WeMos D1 R2 & mini.

Nu is die sunmoon.h auch wirklich eingebunden und die Ausgabestruktur "ausgabe" kann ich ja auch erstllen. Und sun_moon() ruft ja wenn ichs richtig versteh in der sunmoon.c alle anderen Funktionen auf und füllt die struct "ausgabe" die ich im Aufruf als outpu übergeben hab mit den Ergebnissen.

Ohne int sunmonninfos = sun_moon(lat, lon, timeinfo, deltaT, 1, ausgabe); gibt es keine Fehlermeldung.

Was hab ich denn noch übersehen oder sind das die Folgeschäden der auskommentierten memory.h?

Sorry wenn ich immer wieder doofe Fragen stelle, falls ihr mir überdrüssig werdet, sagt es frei raus.
Ansonsten vielen Danks fürs weiter bringen.

Fehler gefunden ???, sunmoon.c muss also auch includiert werden. Nu läuft der compiler läuft durch, aber ich hab den Verdacht die memory.h ist nich ganz unwichtig. Alle Versuche Elemente der struct "ausgabe" auf den Seriellen Monitor zu bringen zeigen nur:

Exception (28):
epc1=0x4020597d epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000200 depc=0x00000000
ctx: cont
sp: 3ffefc70 end: 3ffefe80 offset: 01a0

Trotdem danke fürs Zuhören, euch meine Schwierigkeiten zu schreiben scheint schon weiter zu helfen.

Hallo, immer wenns ein klein wenig vorwärts geht kommen nur wieder neue Fragen. Für die Auswertung der Exceptions() hab ich ein Arduino Tool gefunden, und das scheint auch der Meinung zu sein, dass hier was gelesen werden soll was nicht gelesen werden kann. Wenn ich es richtig interpretiere.

"Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads"

Also noch mal mit memory.h beschäftigen. Wenn ich nu mit includierter memory.h kompiliere, gibts wieder Mecker.

In file included from C:\Users\Boje\Documents\Arduino\libraries\sunmoon\sunmoon.c:7:0:
C\Users\Boje\Documents\Arduino\libraries\memory/memory.h:91:1: error: unknown type name 'class'
class PointerList{
^
C:\Users\Boje\Documents\Arduino\libraries\memory/memory.h:91:18: error: expected '=', ',', ';', 'asm' or 'attribute' before '{' token
class PointerList{
^

Hier gibts doch ein Problem, weil zum einen C und zum Anderen C++ eingebunden wird, oder lieg ich da falsch. Wie umschifft man nun diese Klippe wenn man nich selber alles neu Bauen kann und eben nur memory.h mit *.cpp und sunmoon.h mit *.c zusammen verwenden will.
Zumal ja die memory.h von der sunmoon.c includiert wird.

Zumal ja die memory.h von der sunmoon.c includiert wird.

Da stimmt was nicht. class kann nicht in einer .c Datei verwendet werden. Eventuell läuft da eine #ifdef Entscheidung falsch.

C und C++ sind eben verschiedene Sprachen.
Ob es daher ein guter Trick ist, deine .c Datei einfach in eine .cpp Datei umzubenennen?
Der avr-gcc schaut sie dann jedenfalls mit anderen Augen an :wink:

Verzweifelt :disappointed_relieved:

In meinem Fall hab ich eine Aquariumsteuerung für meinen Geschmack recht erfolgreich gepimpt. Diesen Gedanken weiter gesponnen passt natürlich Sonne, Mond und deren Auf-/Untergang wunderbar dazu.
Also ran, ein paar Grundlagen lernen und passenden Code suchen.

Umbenennen wollt ich ja gar nix. Im lauf der ganzen Fummelei hab ich dann irgendwann gemerkt, dass es scheinbar nich so einfach ist C-Code in ein C++ Projekt zu includieren.
Mit dem C Code in einem Testsketch sah die Sache für mich zu Anfang erfolgversprechender aus. Deshalb hab ich mit dem angefangen zu basteln. Aber das scheint mir jetzt erheblich anders. Ich hab nu bestimmt 30 Stunden an der diesem eigentlich ja fertigen Mondcode gesessen und bin kein Schritt weiter.
Mich verwirrt auch noch immer das Zeitproblem, ich versteh einfach nicht warum es nötig ist so unterschidlich mit Zeit umzugehen. Und ist Unixzeit aus now() nun time_t oder long?

Die Variante in C++ wär warscheinlich die bessere gewesen, aber mit den Fehlermeldungen kann/konnt ich viel weniger anfangen.
Eigentlich kann das doch gar nich so schwer sein den Code so anzupassen, dass man ihn von einem bestehenden Projet aus aufrufen kann. grundsätzlich funktionieren sollte er ja. Also was zum Teufel ist das Problem. Das was die Arduino IDE ausspuckt hilft mir nur sehr bedingt weiter.

Ich find auch fast überhapt keinen Beispielcode der auch funktioniert. Da kannste auf nix wirklich aufbauen und musst immer wieder probieren, probieren, ... Das verbrennt sooo unnötig Zeit.

Hut ab vor euch Profis hier, und noch mal Danke für eure Hilfe.

Schade eigentlich. Wär eine echte bereicherung gewesen.

Um C Code in C++ auszuführen gibt es "extern C"

Und ist Unixzeit aus now() nun time_t oder long?

time_t ist ein Alias für unsigned long