Geht das auch einfacher?

Gast #4472648
hi leute,

ich habe eine frage ich bin gerade dabei mit eine kleine wetterstation 
mit dem 0.96" 128x32 oled display mit dem sdd1306 controller aufzubauen. 
ich sitzte gerade an der aufteilung des display und habe da ne frage ob 
es einfacher geht die einzelnen sachen zu positionieren.
1
  display.clearDisplay();
2
  display.setTextSize(1);
3
  display.setTextColor(WHITE);
4
  display.setCursor(3,0);
5
    display.println("14:58 Uhr 16.02.2016");
6
    
7
  display.setCursor(0,8);
8
    display.println("Aussen:"); 
9
  display.setCursor(41,8);
10
    display.println(a);
11
  display.setCursor(59,6);
12
    display.write(grad);
13
  display.setCursor(64,8);
14
    display.println("C"); 
15

16
  display.setCursor(0,16);
17
    display.println("Innen:");
18
  display.setCursor(41,16);
19
    display.println(i);
20
  display.setCursor(59,14);
21
    display.write(grad);
22
  display.setCursor(64,16);
23
    display.println("C"); 
24

25
  display.setCursor(0,24);
26
    display.println("Feuchtigkeit:");
27
  display.setCursor(79,24);
28
    display.println(l);
29
  display.setCursor(92,24);
30
    display.println("%");

mfg
Gast
Kannst du nicht jede Zeile in ein String packen und dann auf einmal 
ausgeben?
1
char tmp[20];
2
snprintf( tmp, "Aussen: %d Grad", grad );
3
display.setCursor(0,8);
4
display.println(tmp);
@ Peter II (Gast)

>Kannst du nicht jede Zeile in ein String packen und dann auf einmal
>ausgeben?

Dazu müsste man die hohe Schule der C-Formatstrings beherrschen. Das 
kommt erst ein paar Semester nach Arduino ;-)
Moderator Persönliche Seite
1
#include <stdarg.h>
2
#include <stdio.h>
3

4
void display_output(int x, int y, const char *fmt, ...)
5
{
6
  va_list ap;
7
  char buf[80];
8

9
  va_start(ap, fmt);
10
  int n = vsnprintf(buf, sizeof buf, fmt, ap);
11
  va_end(ap);
12

13
  if (n < 0) return;
14

15
  display.setCursor(x, y);
16
  display.println(buf);
17
}
18

19
...
20
  display_output(0, 8, "Außen:         %d°", a);
Mit Arduino hast du doch C++, oder? Mach dir ne Klasse, die ähnlich wie 
ostream funktioniert, aber das Zeugs auf das Display rausschiebt und 
spezielle Behandlung für linefeed hat. Die Formatstrings haben den 
Nachteil, das sie Speicherverwaltung o.ä. und vor allem viel Platz 
brauchen.
@Sven S. (boldie)

>Mit Arduino hast du doch C++, oder?

Ja, aber . . .

>Mach dir ne Klasse, die ähnlich wie
>ostream funktioniert, aber das Zeugs auf das Display rausschiebt und

Wieviel Arduino-User haben auch nur ANSATZWEISE Ahnung von C++ und wie 
man dort ein Klasse erstellt?

>spezielle Behandlung für linefeed hat. Die Formatstrings haben den
>Nachteil, das sie Speicherverwaltung o.ä. und vor allem viel Platz
>brauchen.

Ach herje, und was macht alle Welt mit Boards wie Arduino mega mit 256kB 
Flash?
Was ist wohl aufwändiger? Ein paar Formatstrings in den Flash packen 
oder eine eigene Klasse programmieren?
Gast
wow, hätte nicht gedacht das dass ne kleine diskusion auslöst.

habe eig mehr an sowas gedacht ob es dafür ne möglichkeit gibt
1
   display.println("Aussen:"a,grad"C");
phil schrieb:
> Geht das auch einfacher?

Schreibe dir eine Funktion, die einen String an bestimmter Stelle 
ausgibt
1
void writeAT(char x char y, char*text) 
2
{ display.setCursor(x,y); Display.println(text); }
3

4

5
display.clearDisplay();
6
display.setTextSize(1);
7
display.setTextColor(WHITE);
8

9
writeAt(3,0,"14:58 Uhr 16.02.2016");
10
writeAt(0,8,"Aussen:");
11
writeAt(41,8,a);
12
writeAt(59,6,grad);
13
writeAt(64,8,"C");
14
  
15
wrietAt(0,16,"Innen:");
16
writeAt(41,16,i);
17
writeAt(59,14,grad);
18
writeAt(64,16,"C");
19

20
writeAt(0,24,"Feuchtigkeit:");
21
writeAt(79,24,l);
22
writeAt(92,24,"%");

Warum du jetzt für grad write verwendest und für i und a printLm, ist 
unklar, hat wohl was mit den Datentypen zu tun die du NATÜRLICH nicht 
genannt hast. Wenn man grad als Zeichen im Zeichensatz definiert kann 
man °C als ein String schreiben, das spart Aufrufe.
Gast
Frank M. schrieb:
> display_output(0, 8, "Außen:        %2d°", a);
>
> Gerade, wenn die Temperatur unter 10° sinkt, wirken zwei Gradzeichen
> hässlich ;-)

Wenn ich es richtig sehe, macht er ja jedes mal display.clearDisplay();
Sollte also keine Zeichen stehen bleiben.
Moderator Persönliche Seite
Michael B. schrieb:
> Schreibe dir eine Funktion, die einen String an bestimmter Stelle
> ausgibt

Hilft nicht, er hat ja auch numerische Argumente.

> Wenn man grad als Zeichen im Zeichensatz definiert kann man °C als ein
> String schreiben, das spart Aufrufe.

Wenn der Host UTF-8 als Zeichensatz benutzt und das Display ISO8859-1,
kann man das eben nicht direkt schreiben.

Ansonsten kann man immer noch strings verketten:
1
#define grad "\xb0"
2

3
...
4
   (... "Temperatur ist %02d " grad "C" ...)

Das kostet auch keinen zusätzlichen Aufruf.
Hallo,

Falk B. schrieb:
> @ Peter II (Gast)
>
>>Kannst du nicht jede Zeile in ein String packen und dann auf einmal
>>ausgeben?
>
> Dazu müsste man die hohe Schule der C-Formatstrings beherrschen. Das
> kommt erst ein paar Semester nach Arduino ;-)

naja, der ganze Kram inclusive der Stringklasse usw. ist in den etwas 
verstreuten Arduino- und Bibliotheks-Beschreibungen schon problemlos 
nachzulesen.

Allerdings sind die nicht im "Fritzing"-Format und auch nicht auf 
YouTube zu finden.

Insofern pflichte ich Dir bei.

Gruß aus Berlin
Michael
Gast
Falk B. schrieb:
> Wieviel Arduino-User haben auch nur ANSATZWEISE Ahnung von C++ und wie
> man dort ein Klasse erstellt?
Anwesend!(also mindestens schon mal einer)

Falk B. schrieb:
> Dazu müsste man die hohe Schule der C-Formatstrings beherrschen. Das
> kommt erst ein paar Semester nach Arduino
Warum war das bei mir anders herum?
Komisch!

Mitlesa schrieb:
> Mit dem Arduino-Software-Mist ....
Och....
Ein Hoch auf die (Vor)Urteile...
@  Frank M. (ukw) Benutzerseite

>> Wenn ich es richtig sehe, macht er ja jedes mal display.clearDisplay();

>Das Flackern würde mich aber ziemlich stören.

Das wird der OP schon noch lernen, daß man meist nicht das gesamte 
Disply löscht sondern nur überschreibt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.