Go Down

Topic: Anfänger, neu im Forum  (Read 4916 times) previous topic - next topic

Alfaone79

Nun wird mir angezeigt das der Arbeitsspeicher zu wenig ist,
bedeutet das _F_ das der Speicher des UNO und nicht des Displays genutzt wird?

agmue

Nun wird mir angezeigt das der Arbeitsspeicher zu wenig ist,
bedeutet das _F_ das der Speicher des UNO und nicht des Displays genutzt wird?
Der Inhalt des Displays wird erst im UNO-Speicher zusammengesetzt und dann an das Display übertragen. "_F_" steht für full, dafür reicht der UNO-Speicher offensichtlich nicht.

Daher hat Oli zwei weitere Möglichkeiten mit Teilseiten im UNO-Speicher vorgesehen, gekennzeichnet mit "_1_" und "_2_". Die Teilseiten müssen mehrfach übertragen werden, daher benötigst Du die do/while Variante.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Alfaone79

Ah, ok verstehe.
Gibt es irgendwo ein verständliches do/While tutorial? Ich habe keine Ahnung wie ich das anwenden kann

combie

Der Verstand, und die Fähigkeit ihn zu gebrauchen, sind zweierlei Fähigkeiten.

agmue

#64
Oct 20, 2018, 03:12 pm Last Edit: Oct 20, 2018, 03:14 pm by agmue
Gibt es irgendwo ein verständliches do/While tutorial? Ich habe keine Ahnung wie ich das anwenden kann
Oli Kraus hat eine Menge geschrieben (u8g2), ob es für Dich verständlich ist, mußt Du selbst herausfinden.

Bei den Beispielen findest Du ein Verzeichnis full_buffer und page_buffer, nun kennst Du den Unterschied. Do/while findest Du bei page_buffer.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

Das Sparen von Speicher erkaufst Du mit x-facher Laufzeit.
Bei meinem aktuellem Sketch (Grafik-Display 128x64, U8GLIB_ST7920_128X64_4X) werden zwei Seiten übertragen (4x steht für 4-fachen Speicherverbrauch - der Sketch meckert auch schon) - das Gleiche mit 1X braucht davon nur 1/4tel an SPeicher, muß dafür aber 4 Mal die Daten häppchenweise ans Display schicken.
Der Sketch läuft in loop() wie folgt ab: (die Instanz des Display heißt hier 'u8g'
Code: [Select]

    u8g.firstPage();  //schalte auf erste Seite
    do {
      draw();  //in dieser Funktion wird die GANZE SEITE neu gezeichnet
      //Wiederhole Das solange, wie noch Seiten (Bereiche auf dem Display) verfügbar sind
      //(spart Speicher, da so nur ein x-tel der Seite im Speicher liegen muß
    } while ( u8g.nextPage() );


In der Funktion draw() wird das ganz Display gezeichnet.
Je nach gewählter Seite (firstPage() bzw. nextPage(), wobei Das so lange 'gut geht', wie Happen nötig sind um das Display voll zu bekommen) wird aber nur ein Teil des gesamten Aufbau von der Lib 'übernommen' - eben nur ein Teil-Bild.
Bei 4 Bereichen würden so
1. nur die oberen 25%
2. nur die '2.te Zeile, also 25%...50%'
3. nur die '3.te Zeile, also 50%...75%'
4. nur die unteren 25%
des Bildschirminhalt übernommen - deshalb muß man für die ganzen Pages das komplette Display neu zeichnen - was halt die x-fache Zeit kostet.

Hoffe, ich konnte Das halbwegs verständlich erklären.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Alfaone79

Hallo, danke für dies ausführliche Erklärung,
habe den Sketch nun so verändert
Code: [Select]
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>

RTC_DS1307 RTC;

U8G2_SSD1327_EA_W128128_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, HW I2C with pin remapping

void setup () {
 
  //Serial.begin (115200);
  Wire.begin();
  u8g2.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.firstPage();
  do {
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,10);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
  }
   while 
  (u8g2.nextPage());
  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2,43);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);
   }

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}


Das Datum wird nun fast vollständig angezeigt, die Uhrzeit nur zum Teil, wen ich sie in den Bereich des Datums bringe.
Irgendwo ist immernoch der Wurm drin

postmaster-ino

#67
Oct 21, 2018, 08:36 pm Last Edit: Oct 21, 2018, 08:38 pm by postmaster-ino
Hi

Pack Mal das
Code: [Select]
}
  while (u8g2.nextPage()); //Zeile ~36)

an das Ende von loop() - diese Page-Schleife schickt das Bild, Welches Du IN DIESER SCHLEIFE zeichnest, an das Display.
Die Änderungen außerhalb der do-while-Schleife werden nur noch die letzte page betreffen (gehe davon aus, daß die Inhalte, Die in dem Bildbereich gezeichnet werden, direkt übertragen werden - müsste man Mal austesten).

Ersetze Deine loop() Mal hier durch:
Code: [Select]
void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
    u8g2.setCursor(24, 10);
    if (now.day() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.day(), DEC);
    u8g2.print('.');
    if (now.month() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.month(), DEC);
    u8g2.print('.');
    u8g2.print(now.year(), DEC);
//hier stand das while
    u8g2.setFont(u8g2_font_helvR24_tn);
    u8g2.setCursor(2, 43);
    if (now.hour() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.hour(), DEC);
    u8g2.print(':');
    if (now.minute() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.minute(), DEC);
    u8g2.print(':');
    if (now.second() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.second(), DEC);
  } while (u8g2.nextPage());
  //u8g2.sendBuffer();          // transfer internal memory to the display - denke unnötig, da mit Pages gearbeitet wird
  delay (1000);
}


MfG

PS: Die RTC1307 ist eher ungenau, für nicht viel Mehr bekommst Du eine DS3231 - Die ist temperatur-kompensiert und soll nur wenige Sekunden IM JAHR falsch gehen.
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Alfaone79

Juhu, es klappt
Könnte ich die ds3132 einfach durch die dementsprechende Library einbinden?

Wie würde es nun laufen wenn ich noch eine Temperatur mit dem dht11 hinzu füge? Käme der Code dann auch vor das while?

postmaster-ino

Hi

Da die Lib keine I²C-Adresse der RTC haben will, wird Sie wohl nur die 1307 bedienen können.
Somit wirst Du wohl eine andere Lib einbinden müssen.

Zumindest einen DHT22 (der 'große Bruder' des DHT11) lässt sich per Lib recht einfach einbinden.
Wert-Abfrage in der loop(), das Ergebnis dann wieder IN der While-Schleife auf das Display schreiben.

Die ersten Tests mit dem neuen Sensor sollten IMMER ein Beispiel aus der Library sein, damit man sich sicher sein kann, daß Es wirklich an einem Selbst liegt, weshalb der Kram nicht funktioniert.
Auch für die DS3231 ist Das kein falscher Weg - wenn das Beispiel funktioniert, kannst Du Das in Deinen Sketch einbauen.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Alfaone79

Vielen Dank für deine Hilfe,
Werde es morgen mal ausprobieren.
Ich werde berichten.....

Alfaone79

Guten Abend zusammen,
Die DS3231 funktioniert nun auch.

Habe auch versucht den DHT11 mit einzubauen. Leider wird er auf dem Display nicht dargestellt.
Ich habe den Code vor „nextpage" eingefügt.

Go Up