Saturday, April 6, 2019

ESP32 + OLED Module

It's a ESP32 module with integrated OLED.



It pre-load with a demo program. In first power-up, the OLED show a all ON screen and a welcome message alternatively.



Make the OLED work:

First of all, I install both ESP32 and ESP8266 on Arduino IDE.

The first thing I want to do is make the OLED work. But it's only limit info from the seller, only mention that it's WEMOS LoLin32, without any about the OLED. So I have to search, guess and try.

After searched in some Chinese website, I guess that the OLED driver for this module should be SSD1306, with I2C interface. and the I2C pin should be 5 and 4 for ESP32.

Then I have to identify the I2C address. I found a i2c_scanner example from Arduino Playground. Have to modify the code Wire.begin() to Wire.begin(5,4) for ESP32.

The full code is here:
// Copy from Arduino Playground - i2c_scanner
// https://playground.arduino.cc/Main/I2cScanner/
// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin(5,4);  //Modifed for ESP32

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Remember to select board of "WEMOS LoLin32" before download.

The I2C address is 0x3C.

Then I tried to find any library suitable in Arduino IDE, and found "ESP8266 and ESP32 Oled Driver for SSD1306 by Daniel Eichhorn, Fabrice Weinberg".

Luckily it work as expect.

Tried to load the example of SSD1306SimpleDemo, simple modify the code
SSD1306Wire  display(0x3c, D3, D5);

to
SSD1306Wire  display(0x3c, 5, 4);

to make it work for this module.



This video show how to:




A minimum exercise to display simple text.

/*
 * A ESP32/OLED exercise to display simple text
 * Board:
 * esp32 by Espressif Systems version 1.0.4
 * OLED library:
 * ESP8266 and ESP32 Oled Driver for SSD1306 displays version 4.1.0
 */

#include <Wire.h>               // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h"        // legacy: #include "SSD1306.h"
#include "images.h"


// Initialize the OLED display using Arduino Wire:
SSD1306Wire  display(0x3c, 5, 4);

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();


  // Initialising the UI will init the display too.
  display.init();

  display.flipScreenVertically();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);

}

void loop() {

  display.clear();
  display.drawString(0, 0, "ESP32/OLED");
  display.drawString(0, 15, "exercise:");
  display.drawString(0, 30, "To display");
  display.drawString(0, 45, "simple text");

  display.display();

  delay(100);
}



No comments:

Post a Comment