Bee Observer mit SSD1306 OLED-Display

Ich würde gerne auf dem BOB-HAT-V5 ein OLED-Display benutzen, um Messwerte, Aktivitäten, Configurationen usw. anzuzeigen, da WLAN nicht immer auf Anhieb funktioniert und man dann nicht sieht, was los ist. Als ich den FiPy mit der Arduino-IDE programmiert habe, hat es sehr gut funktioniert. Doch mit MicroPython tauchen Probleme auf.
Im Internet habe ich folgendes Projekt gefunden:

Software: MicroPython-on-ESP32-master.zip (11,0 KB)

Es ist aber für einen ESP8266 mit uPiCraft code editor programmiert. Dieser MicroPython-Dialekt ist leider nicht ganz kompatibel zu dem von PyCom.
So konnte ich den I2C-Bus mit dem BME280 in Betrieb nehmen.

Original uPiCraft

i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)                                # ESP32 DevKit
bme = bme280.BME280(i2c=i2c,address=addrBME280)

auf FiPy funktioniert

i2c = I2C(0, I2C.MASTER, pins=('P9', 'P10'))                                         # FiPy
bme = bme280.BME280(i2c=i2c,address=addrBME280)

Aber beim SSD1306 OLED gibt es noch Probleme. In der Library ssd1306.py werden Methoden aufgerufen, die es bei PyCom nicht gibt.

  def write_data(self, buf):
    self.temp[0] = self.addr << 1
    self.temp[1] = 0x40 # Co=0, D/C#=1
    global currentBoard
    if currentBoard=="esp8266" or currentBoard=="esp32":
      self.i2c.start()
      self.i2c.write(self.temp)
      self.i2c.write(buf)
      self.i2c.stop()

Ich wollte i2c.start(), i2c.write(self.temp) und i2c.stop() durch i2c.writeto(self.addr, self.temp) ersetzen, aber das hat nicht richtig funktionert.

Kann mir jemand helfen?

2 Likes

Hi Didi,

diese beiden Beiträge aus dem Pycom Forum könnten Dir weiterhelfen. Melde Dich gern, falls es auch nach ernsthaftem Zureden nicht klappen sollte.

Viele Grüße,
Andreas.


1 Like

Vielen Dank!
Der 2. Tipp war die Lösung: Geändert wurden die Methoden in ssd1306.py.

  def write_data(self, buf):
    #self.temp[0] = self.addr << 1
    #self.temp[1] = 0x40 # Co=0, D/C#=1
    global currentBoard
    if currentBoard=="esp8266" or currentBoard=="esp32":
      #self.i2c.start()
      #self.i2c.write(self.temp)
      #self.i2c.write(buf)
      #self.i2c.stop()
      self.i2c.writeto(self.addr, bytearray([0x40]) + buf)  # buf = self.buffer

und

 def show(self):
    for page in range(8):
        self.write_cmd(0xb0 | page)
        self.write_cmd(0x02)    # Start addr low column
        self.write_cmd(0x10)    # Start addr high column
        mv = memoryview(self.buffer)
        self.write_data(mv[128*page: 128 + 128*page])
3 Likes

Bei der Entwicklung und beim Testen des Bee Observers ist es sehr praktisch, wenn man sofort die aktuellen Messwerte sieht und nicht erst auf die Anzeige auf dem PC oder im Internet warten muss. Darum habe ich auf dem BOB-HAT-V5 ein OLED-Display vorgesehen, um Messwerte, Aktivitäten, Konfigurationen usw. anzuzeigen, da das WLAN nicht immer auf Anhieb funktioniert.

Ich habe ein 128 x 64 Pixel 1,3 Zoll OLED I2C Display vorgesehen. Das 128 x 64 Pixel 0,96 Zoll OLED I2C Display ist zwar softwarekompatibel, hat aber vertauschte Anschlüsse ( Vorsicht VDD und GND vertauscht.).
Die Software ist hier: BOB-BME280-OLED.zip (12,4 KB)

Die Testprogramme können einzeln mit Klick auf ‘Run’ ausgeführt werden. Der Name erklärt die Funktion.
Zum Testen ist die Platine BOB-HAT-V5 nicht unbedingt nötig, es funktioniert auch das PyCom-Expansionboard mit einem Breadboard und 4 Steckkabeln.


Anschlüsse :
schwarz: GND -> GND
rot: 3V3 -> VDD
grün: P9 -> SDA
blau: P10 -> SCL

1 Like

Das sieht gut aus.
Warum hast Du ein Pixeldisplay genommen? War das einfacher zu implementieren?
Wäre eine andere Library mit dem HD44780 denkbar?
VG

Was ist denn ein “Pixeldisplay”? bzw. was wäre ein Nicht-Pixeldisplay?

Ein Pixeldisplay ist ein Display das die Pixel in der Library einzeln ansteuert, hier 128 x 64 Bildpunkte.

Ein Textdisplay wie das mit der Instrienorm HD44780 hat z.B. 4 Zeilen a 20 Zeichen… und kann direkt mit normalen Zeichen beschickt werden …

ah, Grafik- vs. Textdisplay! Danke für die Erklärung!

Ich habe ein OLED-Grafikdisplay genommen, weil sie klein und preiswert sind. Ich kann 8 Zeilen zu 16 Zeichen darstellen und benötige 2 Datenleitungen.
Früher hatte ich HD44780-Textdisplays. Auch mit nur 2 * 16 Zeichen sind sie viel grösser und für mich veraltet.

2 Likes

Nun ja, genau die Größe ist unter anderem neben dem Resourcenverbrauch ein Pluspunkt für die HD44780 … und das gibt es ebenfalls mit I2C …

Habe die HD44780 viel und gerne verwendet, mit dem backlight braucht das Ding allerdings viel Strom und 16x2 ist mit 6 Temperatursensoren und Gewicht und den Werten eines BME schon recht klein. Aber jeder wie er / sie will! Das ist ja das coole an einem open source-Projekt!

Ich habe Teile von GitHub - Hiverize/FiPy erweitert und zeige die Messwerte auf dem OLED-Display an. Das ist sehr praktisch, wenn man den PC nicht anschliessen möchte oder das WLAN nicht will.

Die Software ist hier: BOB-Messen.zip (15,6 KB)

Das Projekt enthält nur das Messen mit BME280, DS18B20 und HX711 und Anzeige SSD1306, kein WLAN und keine Zeit.

  • Die Messwerte werden auf 1 Stelle nach Komma begrenzt,
  • einzelne Ausreisser bei DS18B20 und HX711 werden übersprungen.
  • mit SW1 wird Tara und SW2 Scale neu gesetzt.
  • SW3 korrigiert DS18B20-Temperaturen auf BME280-Wert
2 Likes

Hi Didi,

Schön, dass es damit geklappt hat.

oder man gar kein WLAN hat, oder aber

Wir haben das von Dir erschlossene Feature nun ins aktuelle Backlog aufgenommen, damit es uns nicht verlorengeht:

Vielen Dank für Deine Arbeiten!

Herzliche Grüße,
Andreas.

Hi @didilamken

Ich würde sagen, dass bei Hiverize/FiPy die ssd1306.py fehlt im repository.

Setzt man den OLED wert auf True, fehlt die entsprechende Class.

Spricht was dagegen die Datei immer mitzuliefern?

Ich habe keine Schreibrechte auf Github. Meine getesteten Programme / Libraries findet Ihr hier:

@didilamken
Ich auch nicht direkt, aber ich schau mir das mal bei Gelegenheit an und erstelle einen Pull Request.

Gruß