Forum: Mikrocontroller und Digitale Elektronik Geht das auch einfacher?


von phil (Gast)


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

: Verschoben durch Moderator
von Mitlesa (Gast)


Lesenswert?

Mit dem Arduino-Software-Mist wird es wohl (annähernd) dabei bleiben.

Warum auch nicht, solange es nicht den Speicher deines Controllers 
sprengt.

von Schleby N. (schleby)


Lesenswert?


von phil (Gast)


Lesenswert?

hi mitlesa,

wie meinst du das genau? der speicher sollte kein problem in erste line 
sein

von Peter II (Gast)


Lesenswert?

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);

von Falk B. (falk)


Lesenswert?

@ 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 ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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);

: Bearbeitet durch Moderator
von Sven S. (boldie)


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.

von Falk B. (falk)


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?

von phil (Gast)


Lesenswert?

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");

von phil (Gast)


Lesenswert?

wobei a die varibale für die temperatur ist und grad das "°" zeichen ist

von Mitlesa (Gast)


Lesenswert?

phil schrieb:
> habe eig mehr an sowas gedacht

Jörg hat es dir doch quasi schon vorgebetet:

Jörg W. schrieb:
> void display_output(int x, int y, const char *fmt, ...)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> display_output(0, 8, "Außen:         %d°", a);

Besser:

  display_output(0, 8, "Außen:        %2d°", a);

Gerade, wenn die Temperatur unter 10° sinkt, wirken zwei Gradzeichen 
hässlich ;-)

: Bearbeitet durch Moderator
von Mitlesa (Gast)


Lesenswert?

Frank M. schrieb:
> Gerade, wenn die Temperatur unter 10° sinkt, wirken zwei Gradzeichen
> hässlich ;-)

Scharf beobachtet! Wie oft bin ich drauf reingefallen .....

von Michael B. (laberkopp)


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.

von Ziegenpeter (Gast)


Lesenswert?

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.

von Mitlesa (Gast)


Lesenswert?

Michael B. schrieb:
> void writeAT(char x char y, char*text)
> { display.setCursor(x,y); Display.println(text); }

Mitlesa schrieb:
> Mit dem Arduino-Software-Mist wird es wohl annähernd dabei bleiben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von phil (Gast)


Lesenswert?

i und a ist die tmp variabel grad habe ich also als write genommen da 
ich so einfache den hex ascii code verwenden kann

von Michael U. (amiga)


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

: Bearbeitet durch User
von U. C. (Gast)


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...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

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

von Falk B. (falk)


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.

von Ziegenpeter (Gast)


Lesenswert?

Frank M. schrieb:
> Das Flackern würde mich aber ziemlich stören.

Das stimmt, mache auch lieber alles rechtsbündig (also mit "%2d" @phil).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.