Geht das auch einfacher?

Gast #4472648
Lesenswert?

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
Moderator Persönliche Seite #4472686
Lesenswert?

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);
#4472688
Lesenswert?

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.
#4472710
Lesenswert?

@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?
#4472762
Lesenswert?

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.
Moderator Persönliche Seite #4472774
Lesenswert?

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.
#4472778
Lesenswert?

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 #4472791
Lesenswert?

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...
#4472865
Lesenswert?

@  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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren