Eine frage zu Jurs Sonnenauf und Untergangs Code...

Hallo allerseits,

ich habe versucht den von Jurs umgeschriebenen Code weiter zu verwenden.
Damit möchte ich auf einem Nokia 5110 Display die Zeit für den Sonnenauf und Untergang anzeigen.

hier ist der orginal Code: Sonnen Auf- und Untergang mit dem Arduino berechnen - #11 by jurs - Deutsch - Arduino Forum

Ich habe zunächst versucht den Code in mein Progamm einzupflegen .. das hat nicht funktioniert.
Darauf hin habe ich versucht den Code so umzustellen das ich Ihn in mein Programm einpflegen kann..

auch dies sorgte für Fehler:

Sonnenauf_Untergang_neu:22: error: 'JD' does not name a type
Sonnenauf_Untergang_neu.ino: In function 'void serial_out()':
Sonnenauf_Untergang_neu:93: error: 'AufgangStunden' was not declared in this scope
Sonnenauf_Untergang_neu:95: error: 'AufgangMinuten' was not declared in this scope
Sonnenauf_Untergang_neu:96: error: 'AufgangMinuten' was not declared in this scope
Sonnenauf_Untergang_neu:99: error: 'UntergangStunden' was not declared in this scope
Sonnenauf_Untergang_neu:101: error: 'UntergangMinuten' was not declared in this scope
Sonnenauf_Untergang_neu:102: error: 'UntergangMinuten' was not declared in this scope
'JD' does not name a type

Könnte mir bitte jemand erklären warum der Code nicht funktioniert, ich möchte daraus lernen.
Bin Newcomer auf arduino !

Und der original Code gibt ds Ergebniss via Terminal aus ..
muss ich da noch die Werte noch konvertieren oder wie kann ich diese direkt auf einem Nokia 5110
Display darstellen? Ich verwende diese librarys:

//*********************************************************************************************************************************************************************************************************
// Grafik Library für 5110 Display

#include <Adafruit_GFX.h>                                                                     // Adafruit GFX Library
#include <Adafruit_PCD8544.h>                                                                 // Nokia 5110 LCD-Display (84x48 Bildpunkte) Library

ich habe es mal mit dieser subroutine versucht aber das lässt der compiler nicht zu:

//*********************************************************************************************************************************************************************************************************
// Sonnenaufgangszeit


void sunsetting_sunrise() {

  display.setCursor(0, 0);                                                     // Position (x,y)
  display.setTextSize(1);                                                      // Textgröße 1
  display.setTextColor(BLACK);                                                 // Display Farbe schwrz
  display.write(15);                                                           // ein Sonnen Symbol für Aufgang ausgeben
  display.setCursor(9, 0);                                                     // Position (x,y)

  if (AufgangStunden < 10)                                                     // Wenn die Minuten kleiner 10 sind
  {
    display.print(0);                                                          // eine 0 Dezimal vorranstellen
  }

  display.print(AufgangStunden, DEC);                                          // Dann die Minuten Dezimal ausgeben

  display.print(":");                                                          // Einen Doppelpunkt aufs Display

  if (AufgangMinuten < 10)                                                     // Wenn die Minuten kleiner 10 sind
  {
    display.print(0);                                                          // eine 0 Dezimal vorranstellen
  }
  display.print(AufgangMinuten, DEC);                                          // Dann die Minuten Dezimal ausgeben



  //*********************************************************************************************************************************************************************************************************
  // Sonnen Untergangszeit


  display.setCursor(43, 0);                                                    // Position (x,y)
  display.setTextSize(1);                                                      // Textgröße 1
  display.setTextColor(BLACK);                                                 // Display Farbe schwrz
  display.write(2);                                                            // ein Mond Symbol für Untergang ausgeben
  display.setCursor(53, 0);                                                    // Position (x,y)

  if (UntergangStunden < 10)                                                   // Wenn die Minuten kleiner 10 sind
  {
    display.print(0);                                                          // eine 0 Dezimal vorranstellen
  }
  display.print(UntergangStunden, DEC);                                        // Dann die Minuten Dezimal ausgeben

  display.print(":");                                                          // Einen Doppelpunkt aufs Display

  if (UntergangMinuten < 10)                                                   // Wenn die Minuten kleiner 10 sind
  {
    display.print(0);                                                          // eine 0 Dezimal vorranstellen
  }
  display.print(UntergangMinuten, DEC);                                        // Dann die Minuten Dezimal ausgeben
  display.println();
}

Grüße, Stefan

Sonnenauf_Untergang_neu.ino (4.73 KB)

Ich hab selbst auch schon einen Sketch der das macht- allerdings nicht so schön wie bei jurs mit der Dämmerung- wobei ich im Moment grad drüber setze aus jurs Code das in meinen zu übertragen... wenn du noch ein paar tage Geduld hast sehe ich da auch etwas klarer und kann helfen.

@MaHa76: Natürlich warte ich. Ich freue mich schon darauf zu sehen / lernen wie das Problem gelöst wird.

Bis dahin

Grüße, Stefan

Hallo,
eigentlich bin ich hier nur rein, weil es etwas mit "Astro" ist…
und auch, weil jemand über "PN" mit dem selben Thema kam...

Der Sketch aus Deinem Link funktioniert 100%tig und ist sehr genau.
Du solltest als erstes mal Deine genaue Position in Länge und Breite angeben.
Dann kannst Du mit dem Internet vergleichen.

Dann solltest Du Dir den GANZEN Beitrag durchlesen, sonst wird das nichts.

Und wenn ich DAS-

"Sonnenauf_Untergang_neu:93: error: 'AufgangStunden' was not declared in this scope"

lese, dann solltest Du Dich einmal sehr intensiv mit der Arduino-IDE und deren
Beispiele beschäftigen.

Sei mir nicht böse, aber Du suchst eine Hilfe für Faule. Du hast kein
Interesse daran etwas selber zu lernen.
Setze Dich hin und paucke ArduinoBasic´s!! Dann läuft das Ding auch.
Gruß und Spaß
Andreas

@SkobyMobil: Hallo Andreas.

Ich bin Dir nicht böse. Gewiss nicht. Ich hatte nur vor 6 Jahren mit 38 einen Schlaganfall den ich nur knapp überlebt habe. Seit dem ist bei mir die Welt nicht mehr so wie sie mal war. Ich brauche daher leider etwas länger um zu begreifen. Ich habe damals in 68000er Assembler Programmiert, in 6502, Z80, 8080, 8085.. Davon ist kaum noch was übrig geblieben. Ich lebe das ist die Hauptsache.
Ich gebe Dir recht - es wirkt so als bin ich faul aber das ist nicht so.. glaub mir bitte.
Ich arbeite nunmehr seit einem Jahr an einem Programm bei dem ich die Rolladen automatisieren möchte.
Damals, vor dem Schlag war das die Sache von wenigen Tagen vieleicht Wochen .. die Zeiten ändern sich.
Ich bin niemandem böse. Habe meinen Frieden mit mir selbst gemacht.

Einen schönen Abend noch :slight_smile:

Beste Grüße , Stefan

stevie72:
die Zeiten ändern sich.

Frage: Wenn Du schon nur noch so eingeschränkt konzentrationsfähig bist, warum suchst Du Dir dann für Dein Projekt ein so vergleichsweise kompliziert zu programmierendes Punktmatrix-Display aus?

Warum tut es dann nicht ein viel einfacher zu programmierendes 1602 Text-Display?

@Jurs:

Deine Frage ist richtig und wichtig aber ich habe mir etwas dabei gedacht.

Dieses Display habe ich mir ausgesucht weil es in einer Unterputzdose mit Schaltern eingebaut werden wird.
Das wird meine Rolladensteueerung. Die sieht wenn sie fertig ist so ähnlich aus wie die von Busch Jäger.
Busch-Jäger Art.Nr.: 6455 - Timer Bedienelement
Nur die Version die ich baue kann mehr.

Was ich schon funktionierend habe:

DS3231 Uhrenmodul - funktioniert
DCF 77 - Funktioniert und sync. die DS3231 -> Nie wieder setzten - das mach DCF 77 !
Display 5110 - Funktioniert und sieht klasse aus
Tasten - funktionieren
BH 1750 Lichtsensor für Sonnenschutz / Dämmerrung - funktioniert
Die Sonnenauf und Untergangsfunktion werde ich in Kombination mit dem BH 1750 verwenden. Nur rauf und runter fahren der Rolladen wenn es auch Hell genug bzw. Dämmerung ist.
Sowie Anwesenheitssimulatiion!

Was ich noch machen muss..

Menübaum funktionert aber muss noch aangepast werden.
Scheduler für Rolladen Zeiten : Mo DI MI DO FR SA SO
Reedkontakt abfragen - Aussperrschutz für Terrassentür
Windsensor - vieleicht ...

Das ist mein Ziel- egal wie lange es dauert.

Gute Nacht Euch Allen!

Stefan

So sieht mein Projekt aus ..

Grüße Stefan

Hallo stevie72,
Ich habe den Sketch mit C&P eben bei mir in die IDE geladen, der läuft
fehlerfrei durch!
Es ist also überhaupt kein Problem, einen anderen Sketch damit zu erweitern…

Der Code bei Dir wird wohl nicht funktionieren, weil Du in einer bestimmten
Funktion Variablen nicht deklariert hast

Die Funktion befindet sich innerhalb der Klammern...
{
AufgangStunden
}

Deine Variable ist "AufgangStunden".

Wenn Du Deiner Funktion nicht sagst, was "AufgangStunden" ist- oder macht, dann läuft das nicht.

Du könntest z.B. in Deinem Sketch

int AufgangStunden;

void setup()    
{
blah, blah..-
}
void loop()
{
display.print(AufgangStunden); 
}

die Variable so deklarieren.
Das serielle Zeug´s tauscht Du in Display-Ausgabe um.
Wo ist das Problem?!

Gruß und Spaß
Andreas

Hallo zusammen,

Ich finde den Fehler einfach nicht.. vielleicht schaut Ihr mal drüber und findet den Fehler.
ich vermute über "calculate" wird wohl nichts übergeben.. Deshalb zeigt das Display auch nur den
Wert 0.

int AufgangStunden;
int AufgangMinuten;
int UntergangStunden;
int UntergangMinuten;

Grüße, Stefan

Sonnenauf_Untergang_LCD_Nokia_5110.ino (9.06 KB)

Hallo,
"int AufgangStunden"

das ist ein Beispiel gewesen, wie man Variablen deklarieren könnte!

Wenn "AufgangStunden" im Sketch NICHT- als "int" deklariert ist, dann läuft das
nicht. "AufgangStunden" könnte auch vom Typ "float" sein.

Auf Deinem Display-jpg wird doch schon eine Menge dargestellt, d.h. Du hast
Sketche die laufen.
An denen kannst Du erkennen (lernen- das willst Du ja) wie es geht!
Gruß und Spaß
Andreas

P.S.
Ich habe den originalen Sketch mal auf den Arduino geladen und meine
Koordinaten eingegeben, der läuft. Er gibt Sonnenauf- und Untergang über die
serielle aus.

P.P.S.
Als ich diesen Beitrag eröffnet (Feb 16, 2014, 07:57 pm) hatte, hatte ich vom
Arduino fast keine Ahnung.
Das was dieser Sketch jetzt leistet (alle Dämmerungen, Auf-Untergang, WOZ und
wahrer Mittag u.a.) habe ich mir selbst beigebracht.
DAS VERLANGE ICH AUCH VON ANDEREN, daher mein Gemeuter im Forum.
Das was Du willst, ist Basic´s! Also mach mal…

Und jetzt bin ich raus hier.

@SkobyMobil:

Grüß Dich,

Der original Sketch läuft auch bei mir - nur wie siehts mit dem Sketch aus den ich in meinem letzten Posting
angehängt habe.. Sonnenauf_Untergang_LCD_Nokia_5110.ino

der läuft auch gibt aber nur die Werte 00:00 00:00 zurück. Ich habe den original Sketch
dort verwendet. Ich habe ein Problem mit der Übergabe von Werten aus subroutinen.
In meinem Fall: in der subroutine calculate wird das ergebniss berechnet. Dieses wird aber nicht übergeben
sondern nur der Wert der von z.b. int AufgangStunden; => 0
Ich brauche doch 8 Byte um die Auf und Untergangswerte darzustellen stimmts? Aufgang 00 00 Unterg. 00 00
Beim besten Willen - ich sehe nicht wo der Fehler liegt..

Wenn Du mehrere Werte ins Hauptprogramm holen willst, dann lege ein Array oder ein Struct an (je nach den Daten) und gib einen Zeiger darauf in die Funktion. Dann ändert die Funktion die Daten im Hauptprogramm.

Beschreibe mal kurz die Daten, dann können wir da was basteln.

Gruß Tommy

Hallo Tommy56,

ich habe in Posting #9 meinen Code hochgeladen.
Ich habe folgendes vor: Jurs hat einen Code geschrieben der die Sonnenauf und Untergangswerte
berechnet und liefert - Genial !! Der Funktioniert !

für

  • AufgangStunden;
  • AufgangMinuten;
  • UntergangStunden;
  • UntergangMinuten;

Eben jene 4 Werte möchte ich in mein Hauptprogramm übernehmen und Anzeigen auf einem Nokia 5110
Display. Stattdessen zeigt das Display nur 00:00 00:00

Was ich nicht verstehe ist wenn ich die Serielle Ausgabe vor das Return setze dann werden mir die Werte sofort angezeigt (via Terminal).

Ich schaffe es nicht die Daten aus dem Programmteil calculate heraus zu bekommen ins Hauptprogramm..
Das ist das Problem.

müssen die Daten nun mit dem Return übergeben werden oder in der Funktion? Beides habe ich versucht..
Es klappt einfach nicht.. Am liebsten währe es mir wenn ich Hilfe bekomme um das Problem selbst zu lösen.

Grüße Stefan

stevie72:
müssen die Daten nun mit dem Return übergeben werden oder in der Funktion?

Eine "Funktion mit Rückgabewert" kann als Rückgabewert mit return immer nur EINEN EINZIGEN Wert zurückliefern.

Also Du könntest eine calculate()-Funktion schreiben, die per return entweder die Sonnenaufgangszeit oder die Sonnenuntergangszeit zurückliefert.
Aber mit zwei oder mehr Rückgabewerten muß es anders als über einen Funktions-Rückgabewert gelöst werden.

In Frage kommen:

  • globale Variablen, die innerhalb der Funktion verändert werden.

  • eine Funktion mit Call-By-Reference-Parametern, die innerhalb der Funktion so verändert werden können, dass der Aufrufer die Veränderungen "sehen" kann, nachdem die Unterfunktion beendet ist.

Ich glaube, ich muss Dir das Beispielprogramm mal auf ein Programm "mit Berechnungsfunktion" umschreiben, dass bicht nur einfach die Zeit von Sonnenaufgang und Sonnenuntergang berechnet und auf Serial ausgibt, sondern ass auch bereits darauf vorbereitet ist, dass die Anzeige/Ausgabe auf andere Art als über Serial.print erfolgt, z.B. auf einem LCD.

Vielleicht bekommst Du das Umschreiben eines anderen Beispielprogramms, das die Berechnungsfunktion komplett in einem Funktionsaufruf gekapselt hat, auf Dein Nokia5110-Display dann leichter hin?
Mal schauen, wann ich (vielleicht) Zeit dafür finde.

Jurs - Vielen Dank - ich weis Dein Angebot sehr sehr zu schätzen!
Dein letztes Posting hat mich schon etwas weiter gebracht. Danke dafür.

Ich habe Heute Abend gelesen - globale Variablen, die innerhalb der Funktion verändert werden und
über Funktion mit Call-By-Reference-Parametern.

Eine lokale Variable wird nur innerhalb einer Funktion oder Scheife definiert. Sie ist nur
sichtbar und nutzbar innerhalb der Funktion in der sie deklariert wurde.

Ergo habe ich lokale Variablen. Wenn ich diese zu Globalen Variablen - also im gesammten Progamm
sichtbaren Variablen umschreibe dann habe ich doch was ich brauche.

Hier muss ich dann die Adresse holen unter der die Variable abgelegt ist und deren Inhalt auslesen ->
und speichern in einer neuen Variable.. stimmts?

Jetzt suche ich mal weiter - auch nach Beispielen die ich evtl. Umschreiben kann.

Update:

Ich habe das Programm von Jurs ENDLICH am laufen in meinem Programm.

zunächst habe ich Global definiert

int AufgangStunden;
int AufgangMinuten;
int UntergangStunden;
int UntergangMinuten;

und in der calculate(){ } folgende Änderrungen vorgenommen.

jeweils von

int AufgangMinuten = int(60.0*(Aufgang - (int)Aufgang)+0.5);
int AufgangStunden = (int)Aufgang;

int weglassen. Stattdessen:

AufgangMinuten = int(60.0 * (Aufgang - (int)Aufgang) + 0.5);
AufgangStunden = (int)Aufgang;

und von

int UntergangMinuten = int(60.0*(Untergang - (int)Untergang)+0.5);
int UntergangStunden = (int)Untergang;

int weglassen. Stattdessen:

UntergangMinuten = int(60.0 * (Untergang - (int)Untergang) + 0.5);
UntergangStunden = (int)Untergang;

Jetzt funktioniert das Programm. Und ich kann via loop() { } zusätzliche Aktionen ausführen.

display_clear();
calculate();
display_sunset_sundown();
digitalClockDisplay();
uhrzeit();

Vielen vielen Dank vorallem an Jurs und an SkobyMobil sowie an alle anderen beteiligten!