PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Raspberry Pi3 und zwei OLED Displays?



hirnfrei
13.08.2018, 20:23
Mahlzeit!

Aus gegebenem Anlass habe ich gerade alle Projekte auf Eis gelegt und spendiere meinem Auto einen Bordcomputer, den ich über den OBD-II Anschluss mit Daten versorgen will. Soweit soll das aber im Moment nicht das Problem sein.

Hintergrund ist die Temperatur von meinem Auto. Der Knecht, ein Peugeot 106 S2, verfügt lediglich über eine Kontrolleuchte, dass der Motor zu heiss ist. Ist die aber an, dann ist das Kind quasi schon im Brunnen. Bei den hohen Temperaturen in letzter Zeit kam es nun vor, dass diese dumme, kleine, unnütze Leuchte anging. Da ich einen BT-OBD-II Dongle eingebaut habe, konnte ich dann schnell über das Handy die Temperatur erfragen. Schlappe 117′C. Ein bisschen warm. Grund für den ganzen Aufstand war der Thermostat. Gut, Problem ist behoben, doch bessere Kontrollmöglichkeiten habe ich nicht. Abgesehen davon, dass ich die ganze Zeit mein Handy an habe und mir die Temperatur anzeigen lassen. Recht umständlich.

Da ich noch einen Raspberry Pi3 hier rumfliegen habe und der seit dem Einzug vom Pi3b eigentlich nur noch vollstaubt, will ich ihn nun ins Auto verpflanzen, damit er mit die Temperatur anzeigt. Doch ein Pi3 nur für die Temperatur wäre ja Perlen vor die Säue. Ich würde ja einen Arduino nehmen, doch habe ich kein BT-Modul mehr hier liegen, welches mit dem OBD-II kommunizieren kann.

Nun kriegt man über den OBD-II ja jede Menge Daten. Wenn da schon ein Raspi werkelt, will ich davon auch was benutzen. Meine Idee war es nun, zwei OLED-Displays einzubauen. Die fliegen auch hier rum und warten auf Einsatz, doch da China sich offensichtlich im Versenden meiner bestellten Ware unglaublich viel Zeit lässt, stauben auch die nur zu. Ein Display will ich für relevante Fahrzeugdaten hernehmen, wie eben die Temperatur. Das zweite soll zum Spielen da sein. Aktueller Verbrauch, durchschnitts Verbrauch und so ein Zeugs eben.

Jetzt habe ich mir die GPIOs vom Raspi angeschaut und der hat ja ebenfalls nur 1x SDA und SCL. Nun bin ich mir nicht ganz sicher. Heisst das nun, ich kann nur ein Display daran betreiben?

HaWe
14.08.2018, 11:08
der Raspi hat 2 i2c Ports, i2c-1 (normal) und i2c-0 (nicht empfohlen wegen HAT_Reservierung, aber dennoch vorhanden und nutzbar)

33572

Ansonsten gehen auch 2 verschiedene OLEDs mit versch. dev addr (z.B. SH1106 und SSD1306) oder ein i2C Portmultiplexer (z.B. PCA9548A / TCA9548A )

mit einem Schalter oder Buttons oder auch einer Zeitsteuerung plus einer entspr. Abfrage im Programm kann man aber auch zwischen verschiedenen Display-Layouts auf 1 OLED wahlweise hin- und her schalten.

hirnfrei
14.08.2018, 11:32
Portmultiplexer klingt doch mal gut! Danke für den Hinweis HaWe.

Im Moment habe ich so im Kopf, noch einen Nano dazu zubauen. Der bootet ja um Längen schneller als der Raspi und könnte den Bootvorgang dabei im Auge behalten und eine entsprechende Meldung auf dem zweiten Display anzeigen. mit UART verbunden kann ich die Daten vom Raspi ja problemlos zu dem Nano schieben.

Klebwax
14.08.2018, 21:44
... Meine Idee war es nun, zwei OLED-Displays einzubauen. ...

Wenn man den Typ des Displays oder des eingebauten Controllers wüsste, könnte man im Datenblatt nachlesen, ob sich für das Display unterschiedliche I2C Adressen einstellen lassen, also 2 am gleichen Bus betrieben werden können.

MfG Klebwax

hirnfrei
14.08.2018, 21:58
https://www.diymore.cc/products/diymore-1-3-inch-oled-lcd-display-module-4pin-iic-i2c-interface-ssh1106-128-64-128-64-for-arduino-raspberry-pi-3-3v-5v

Das hier wäre der Knecht. Leider gibt es auf der Seite kein Datenblatt, oder ich bin zu doof es zu finden.

Klebwax
14.08.2018, 23:01
Das hier wäre der Knecht. Leider gibt es auf der Seite kein Datenblatt, oder ich bin zu doof es zu finden.

Das ist doch schon mal was. Da springt einem doch SSH1106 ins Auge. Und dann ist der Weg zum Datenblatt (https://www.elecrow.com/download/SH1106%20datasheet.pdf) nicht mehr weit. Und da findet man, daß das unterste Bit der I2C Adresse über den Pin A0 eingestellt werden kann. Somit können 2 Displays mit einem SSH1106 Controller an einem I2C Bus betrieben werden. Ob dieser Pin auf deinem Modul nach draußen geführt wird oder ob man dazu einen Widerstand/Jumper auf dem Modul umlöten muß hab ich jetzt nicht untersucht.

MfG Klebwax

HaWe
15.08.2018, 07:26
auf der Rückseite ist irgendeine Brücke gelötet und mit 0x78 - - - 0x7A beschriftet... das könnte etwas sein zum addr switchen.
Welche Adresse hat er jetzt momentan?

https://cdn.shopify.com/s/files/1/0122/7558/0986/products/030514BA_1_3_739_1024x1024.jpg?v=1531218776

hirnfrei
15.08.2018, 09:34
Auf meinen Displays ist es immer auf 0x78 gelötet. Wenn ich das also richtig verstanden habe, muss ich die Lötbrücke entfernen und auf 0x7A stellen. Dann muss ich also nur noch schauen, wo ich das im Programm ändern muss.

Richtig soweit?

HaWe
15.08.2018, 10:27
Auf meinen Displays ist es immer auf 0x78 gelötet. Wenn ich das also richtig verstanden habe, muss ich die Lötbrücke entfernen und auf 0x7A stellen. Dann muss ich also nur noch schauen, wo ich das im Programm ändern muss.

Richtig soweit?
ich VERMUTE: ja!
Es gibt Libs, wo du mehrere OLED-Objekte mit verschiedenen spezifischen Adressen instanziieren kannst, und dann spricht nichts dagegen.
Das geht für Arduinos naturgemäß etwas einfacher als bei Raspis, da es viel mehr Auswahl gibt.

hirnfrei
15.08.2018, 10:35
Schon einmal besten Dank!

Ich werde zuerst mal ein Display mit dem Raspi ansteuern. Dann sollte ich die nötige Erfahrung haben um zu wissen, was ich da alles brauche und dann sollte auch die Adresse zu finden sein, nehme ich doch mal stark an. Zur Not nehme ich mir eine Lib und stricke sie um. Sollte ja nicht ganz so schwierig sein, hoffe ich zumindest.

HaWe
15.08.2018, 10:55
C++ ?

dann probier mal die hier:

Displays
OLED 128x64 SSD1306, SH1106





I2C Bus speed: STANDARD + FAST-I2C (100-400kHz, getestet)
aktuelle Treiber-Version:
http://hallard.me/adafruit-oled-display-driver-for-pi/
https://github.com/hallard/ArduiPi_OLED
https://github.com/jonesman/ArduiPi_OLED // neue i2c Treiber ohne sudo



Anwendungsbeispiel:
https://raspilab.blog/2015/03/31/meine-smartwatch-mit-i2c-ein-oled-display-ansteuern/

Zur Verwendung mit Geany: zusätzlicher build-Parameter

-lArduiPi_OLED // lowercase "-L"


7 verschiedene OLED Typen werden unterstützt:
0 Adafruit SPI 128x32 SSD1306
1 Adafruit SPI 128x64 SSD1306
2 Adafruit I2C 128x32 SSD1306
3 Adafruit I2C 128x64 SSD1306
4 Seeed I2C 128x64 SSD1308
5 Seeed I2C 96x96 SSD1327
6 NoName I2C 128x64 SH1106

Den richtigen OLED Type muss man ausprobieren, bei mir funktioniert Type 6, d.h. also für den Konsole-Aufruf des Bespielprogramms in examples:

sudo ./oled_demo --verbose --oled 6


vereinfachter Start der demo mit festem I2C oled Type 6, ohne Command Line Parameter :


//----------------------------------------------------------------------
int main(int argc, char **argv)
{
int i;

// Oled supported display in ArduiPi_SSD1306.h

// I2C change parameters to fit to your LCD
if ( !display.init(OLED_I2C_RESET, 6) )
exit(EXIT_FAILURE);

display.begin();

// init done

//.... Code!

display.close();

}

//----------------------------------------------------------------------



einfacher Testcode, testweise zusammen mit wiringPi :



//----------------------------------------------------------------------/*
*
*
* OLED Display
* plus wringPi millis + delay
*
* http://hallard.me/adafruit-oled-display-driver-for-pi/
* https://github.com/hallard/ArduiPi_OLED
*
* ver 0001
*
*/


#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <linux/I2C-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdbool.h>
#include <string.h>
#include <termio.h>

#include <wiringPi.h>
#include <wiringPiI2C.h>

#include <ArduiPi_OLED_lib.h>
#include <Adafruit_GFX.h>
#include <ArduiPi_OLED.h>


#define byte uint8_t


// Instantiate the OLED display
ArduiPi_OLED oledtft;


void oled_cls() {
oledtft.clearDisplay();
oledtft.display();
}


void oled_printxy(int x, int y, char * str) {
oledtft.setCursor(x,y);
oledtft.print(str);
oledtft.display();
}




// mimic conio.h kbhit
bool kbhit(void)
{
struct termios original;
tcgetattr(STDIN_FILENO, &original);

struct termios term;
memcpy(&term, &original, sizeof(term));
term.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &term);

int characters_buffered = 0;
ioctl(STDIN_FILENO, FIONREAD, &characters_buffered);
tcsetattr(STDIN_FILENO, TCSANOW, &original);
bool pressed = (characters_buffered != 0);

return pressed;
}


//================================================== =======================



int main() {

int check;
char sbuf[100];
uint32_t msec, millisav;

// wiringPi
setenv("WIRINGPI_GPIOMEM", "1", 1); // no sudo for gpios required
check = wiringPiSetup(); // init by wiringPi pin numbering
if( check == -1 ) return 1;

// Oled supported display in ArduiPi_SSD1306.h
// change parameters to fit to your LCD
if ( !oledtft.init(OLED_I2C_RESET, 6) )
exit(EXIT_FAILURE);

oledtft.begin();

// init done

oled_cls();

// test

oledtft.setTextSize(1);
oledtft.setTextColor(WHITE);
oledtft.setTextSize(1);
oledtft.setCursor(0, 0); oledtft.print(" 0 Hello, world!\n");
oledtft.setCursor(0, 8); oledtft.print(" 8 I2C OLED");
oledtft.setCursor(0,16); oledtft.print("16 128x64 addr 0x3c"); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!!!!
oledtft.setCursor(0,24); oledtft.print("24 8x21 char size=1");
oledtft.setCursor(0,32); oledtft.print("32 ");
oledtft.setCursor(0,40); oledtft.print("40 ");
oledtft.setCursor(0,48); oledtft.print("48 456789112345678921");
oledtft.setCursor(0,56); oledtft.print("56 ");
oledtft.display();
sleep(1);
oled_cls();


millisav=millis();
while(1) {
msec = millis() - millisav;

sprintf(sbuf, " millisec = %ld \n", msec);
printf(sbuf);
oledtft.setTextColor(WHITE, BLACK);
oled_printxy( 0,16, sbuf);

if (kbhit())
{
int c = getchar();
if(c==27) break;
}
delay(500);
}

oled_cls();
oledtft.close();

return (0);
}


//----------------------------------------------------------------------



du kannst ja C++, wschl kriegst du das auch dann mit 2 versch. Instanzen hin... 8)

hirnfrei
15.08.2018, 11:00
Das ist ja grossartig HaWe! Werde ich auf jeden Fall testen und Meldung machen! Vielen Dank dafür!

HaWe
15.08.2018, 11:06
immer gern!
das mit der std addr 0x3c ist vorgegeben, das wirst du ändern müssen!
Ich kenne auch dein SSH1106 nicht, nur SH1106 und SSD1306.
Dennoch viel Erfolg, und ich bin gespannt! 8)