u8glib I2C 0.96" OLED variablen darstellen

Hallo,
ich möchte mein Arduino per bluetooth mit meinen Handy verbinden und von Handy aus z.B. Wörter "rüberschicken" und diese dann auf meinem Display darstellen. Wenn ich mit u8g.print(variablenname); versuche, den Wert der Variable auf meinem Display darzustellen, ist der Bildschirm einfach schwarz.
Ich habe es schon mit char's und mit int's probiert. Hat beides nicht funktioniert. Der Empfang durch das Bluetooth module funktioniert und die Empfangenen Daten, werden auch in der Variable gespeichert.

Hier der code:

#include <SoftwareSerial.h>

#include "U8glib.h"

SoftwareSerial BT(10, 11);

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK

int a;
int angle;
const int potPin = A1;
const int buttonPin = 2;
int switchState;
int isButtonPressed1;
int isButtonPressed2;
int isButtonPressed3;

const uint8_t rook_bitmap[] PROGMEM = {};

const uint8_t Notizen[] PROGMEM = {};

const uint8_t Nachrichten[] PROGMEM = {};
void drawtext1(){
  u8g.firstPage();  
  do {  
  u8g.setFont(u8g_font_unifont);
  u8g.print(a);
} while( u8g.nextPage() );
}

void drawtext2(){
  u8g.firstPage();  
  do {  
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr(-1, 20, "Direkter Einstieg");
  u8g.drawStr(-1, 30, "ins geschehen");
} while( u8g.nextPage() );
}

void drawtext3(){
  u8g.firstPage();  
  do {  
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr(-1, 40, "Auschnitt ausm");
  u8g.drawStr(-1, 50, "Alltag");
} while( u8g.nextPage() );
}


void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.drawBitmapP( -2, 0 , 16, 128, rook_bitmap);
}

void draw2(void) {
  u8g.drawBitmapP(0, 0, 16, 128, Notizen);
  
}

void draw3(void) {
  u8g.drawBitmapP(0, 0, 16, 128, Nachrichten);
  
}

void drawStartUp() {
  u8g.firstPage();
  do {
    draw();
    
  } while( u8g.nextPage() );
}

void drawNextPage() {
  u8g.firstPage();
  do {
    draw2();
    
  } while( u8g.nextPage() );
}

void drawThirdPage() {
  u8g.firstPage();
  do {
    draw3();
    
  } while( u8g.nextPage() );
}

void setup(void) {
pinMode(13, OUTPUT);
BT.begin(9600);
BT.println("Hello from Arduino");
Serial.begin(9600);
}

void loop(void) {
  Serial.print("a1="); //die ganzen Serial.print commands, sind nur zur Überprüfung da.
  Serial.print(a);
  if (BT.available())
  { 
    a=(BT.read());
    Serial.print("a=");
    Serial.print(a);
    if (a=='a') {
      digitalWrite(13, HIGH);
    }
    if (a=='2')
    {
      digitalWrite(13, LOW);
    }
  
}
  
  Serial.println("a2=");
  Serial.println(a);
  
  angle = analogRead(potPin);
switchState = digitalRead(buttonPin);

if (angle < 286) {
  isButtonPressed3 = false; 
  isButtonPressed2 = false; 
  if (switchState == HIGH || isButtonPressed1 == true) {
    delay(10);
    isButtonPressed1 = true;
    
u8g.firstPage();  
  do {
     u8g.print(a); /*hier soll nun a ausgegeben werden, sobald der Knopf gedrückt ist. Mit drawStr                                            funktioniert die Ausgabe am Display. */
} while( u8g.nextPage() ); 

}
  else{
  drawStartUp();
  } 
}
if (angle > 286 && angle < 573) {
  isButtonPressed1 = false;
  if (switchState == HIGH || isButtonPressed2 == true) {
    delay(10);
    isButtonPressed2 = true;
    drawtext2();
  }
  else{
  drawNextPage();
  } 
}
else if (angle > 573) {
  isButtonPressed2 = false;
  if (switchState == HIGH || isButtonPressed3 == true) {
    delay(10);
    isButtonPressed3 = true;
    drawtext3();
  }
  else{
  drawThirdPage();
  } 
}  
  
}

Warum machst du das nicht über

u8g.drawStr(Spalte, Zeile, Variable);

das funktioniert bei mir prima.

Ja, aber bei mir nur wenn ich einen Text im script vordefiniere. Wenn ich bei Variable meine Variable rein schreibe, kommt die Fehlermeldung: "call of overloaded 'drawStr(int, int, char&)' is ambigous".

itsPauV:
Ja, aber bei mir nur wenn ich einen Text im script vordefiniere. Wenn ich bei Variable meine Variable rein schreibe, kommt die Fehlermeldung: "call of overloaded 'drawStr(int, int, char&)' is ambigous".

Ok, dann musst du aus int einen Strin machen.
Oder ein char, das kann ich aktuell nicht nachsehen.

Ich habe eben nachgesehen. Ich habe die int in ein char Array gewandelt.

itsPauV:
Ja, aber bei mir nur wenn ich einen Text im script vordefiniere. Wenn ich bei Variable meine Variable rein schreibe, kommt die Fehlermeldung: "call of overloaded 'drawStr(int, int, char&)' is ambigous".

Mit so einem Fehler habe ich auch schonmal eine Stunde geflucht. Irgendwas ist mehrdeutig, soviel ist klar :slight_smile:

Die Funktion drawStr() will eine Referenz auf ein char. Hast Du die Variable vielleicht als int8-irgendwas deklariert?

HTH

Gregor

gregorss:
Mit so einem Fehler habe ich auch schonmal eine Stunde geflucht. Irgendwas ist mehrdeutig, soviel ist klar :slight_smile:

Die Funktion drawStr() will eine Referenz auf ein char. Hast Du die Variable vielleicht als int8-irgendwas deklariert?

HTH

Gregor

Genau, die Variable "a" ist ein int.

http://www.cplusplus.com/reference/cstdlib/itoa/ (itoa = integer to ascii)

void printInt(int x, int y, int value)
{
  char buffer[10];
  u8g.drawStr(x, y, itoa(value, buffer, 10));
}

Serenifly:
... itoa ....

Ist AFAIK nicht standardkonform, was vielleicht wurscht sein kann.

Gruß

Gregor

Es ist doch völlig egal, dass es nicht ANSI C ist. In der AVR libc gibt es die Funktion:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#gaa571de9e773dde59b0550a5ca4bd2f00

Serenifly:
Es ist doch völlig egal, dass es nicht ANSI C ist ...

Sag ich ja.

Gruß

Gregor

Hi, danke für die Antworten, ich werde es mal ausprobieren.

Ich hab jetzt mal mit einer/m normalen char ausprobiert, damit geht es nicht. Mit dem char array, hat es funktioniert, aber da weiß ich nicht, wie ich ein komplettes wort da hinzufügen kann. Außerdem müsste es ja automatisch hinzugefügt werden. Mit der Version von Gregor ist irgendwie nichts passiert, als ich auf den Knopf gedrückt habe. Generell passiert dabvei einfach gar nix.

itsPauV:
... Mit der Version von Gregor ist irgendwie nichts passiert, als ich auf den Knopf gedrückt habe. ...

Ich nehme an, dass Du jemand anderes meinst. Oder?

Könntest Du die aktuelle Version Deines Codes nochmal posten?

Gruß

Gregor

itsPauV:
Ich hab jetzt mal mit einer/m normalen char ausprobiert, damit geht es nicht. Mit dem char array, hat es funktioniert, aber da weiß ich nicht, wie ich ein komplettes wort da hinzufügen kann. Außerdem müsste es ja automatisch hinzugefügt werden. Mit der Version von Gregor ist irgendwie nichts passiert, als ich auf den Knopf gedrückt habe. Generell passiert dabvei einfach gar nix.

Dann solltest du dich einfach mal mit den Grundlagen dieser Thematik beschäftigen.
Mann kann nicht einfach nur Copy und Paste machen und es läuft.
Auch wenn wir alle helfen können, solltest du wissen wie so etwas geht.

Und der Link, den Serenifly im Post #7 geliefert hat, ist für dieses Thema ideal.
Arbeite da einige Beispiele durch und du wirst sehen, es funktioniert.

Es gibt in C eine Menge Standard Funktionen um Zahlen in char Arrays zu wandeln und char Arrays in Zahlen.

int -> char Array geht mit itoa(). Dazu legt man einen Puffer an. Dann übergibt man den Puffer, die Zahl und die Basis (hier 10). Die Funktion liefert dann wieder den Puffer.
printInt() hat als Parameter die Koordinaten und die Zahl die gewandelt werden soll.

Da gibt es noch andere Funktionen. z.B. ltoa() für long. Für int und long gibt es noch unsigned Versionen, wenn man den ganzen Werte-Bereich braucht. Oder für float dtostrf() (die Funktion ist AVR spezifisch)

Serenifly:
Es gibt in C eine Menge Standard Funktionen um Zahlen in char Arrays zu wandeln und char Arrays in Zahlen.

Ausgerechnet „Standard“ würde ich einen Teil dieser Funktionen nicht nennen. Auch nicht, wenn sie in einem bestimmten Kontext „standardmäßig“ verwendet werden. Portabilität ist zwar nicht allzu oft gefragt, aber für Leute wie mich, die mal einen Arduino, mal einen RPi und mal einen Null-Acht-Fünfzehn-PC programmieren, ist das durchaus wichtig. Eine selbst programmierte Klasse zum Erstellen von Pixelbildern habe ich bislang auf allen Plattformen nutzen können.

Gruß

Gregor

itsPauV:
Ich hab jetzt mal mit einer/m normalen char ausprobiert, damit geht es nicht. Mit dem char array, hat es funktioniert, aber da weiß ich nicht, wie ich ein komplettes wort da hinzufügen kann. Außerdem müsste es ja automatisch hinzugefügt werden. Mit der Version von Gregor ist irgendwie nichts passiert, als ich auf den Knopf gedrückt habe. Generell passiert dabvei einfach gar nix.

Also ich kann damit nichts anfangen.

u8g.drawStr(int, int, char*) braucht natürlich ein char array als 3. Paramter, oder ein char* ,
was du unter "einer/m normalen char" verstehst, kannst du evtl. an einem kleinen Beispiel-Code zeigen ...

Sereniflys printInt Beispiel sollte gehen, oder?

Was meinst du mit "ein komplettes Wort hinzufügen"?

Wenn du in einem Rutsch Text und Zahl ausgeben willst:

int x=10; 
int y=10;
int a = 123;
char buffer[20];
sprintf(buffer, "Wert = %5d", a);  // füllt buffer mit "Wert =   123" (die Zahl mit 5 Stellen)
u8g.drawStr(x, y,buffer);

@gregor: avr-gcc ist der Compiler und Arduino liefert noch ein paar zusätzliche Funktionen, basta.
Egal was du als Standard akzeptierst :wink:
Unter portabel verstehe ich, dass man evtl. einen sketch für den UNO (328p) auch für den MEGA (2560) compilieren kann.

Die char Array -> Zahl Funktionen sind ANSI C. Die für die andere Richtung nicht. Das stimmt. Sie werden aber trotzdem von vielen Compilern unterstützt.

Die u8g Library enthält übrigens auch ein paar Funktionen dafür. Die halten sich aber an das gleiche Format wie itoa(), utoa() und co.
Sowas gehört einfach zu den absoluten Grundlagen. Mir ist es ein Rätsel wie man sich mit Dingen wie Grafik LCDs beschäftigen kann ohne sowas mal gemacht zu haben. Die Arduino Software nimmt einem vieles ab, aber das heißt nicht dass man darum herum kommt die Grundlagen der Programmiersprache zu lernen. Und dazu gehören nunmal die Datentypen.

Wenn man auf verschiedenen Plattformen arbeitet, hilft es übrigens schon mal überall gcc zu verwenden. Dann hat man eine gemeinsame Basis.

michael_x:
@gregor: avr-gcc ist der Compiler und Arduino liefert noch ein paar zusätzliche Funktionen, basta.
Egal was du als Standard akzeptierst :wink:
Unter portabel verstehe ich, dass man evtl. einen sketch für den UNO (328p) auch für den MEGA (2560) compilieren kann.

Ich habe das mit dem Standard nur erwähnt, weil es wichtig sein kann. Ob es für jemanden wichtig ist, muss derjenige selbst entscheiden.

Die erwähnte Klasse zur Erstellung von Pixelgrafiken konnte ich auf einem RPi nur compilieren, weil sie standardkonform programmiert ist und nicht von fremden Bibliotheken abhängig ist.

Gruß

Gregor