Display on SSD1306/SSD1315 OLED with Uno R4 WiFi & Nano 33 BLE using U8g2 library

This video show displaying on 0.96 inch 128x64 SSD1306/SSD1315 OLED with NoLogo Uno R4 WiFi & Nologo Nano 33 BLE nRF52840 using U8g2 library.


Library:

Install U8g2 Library in Arduino IDE's Library Manager.

Connection:


	Connection between SSD1306/SSD1315 OLED and Uno R4 WiFi/Nano 33 BLE
	notice: Uno R4 WiFi operate on 5V
		Nano 33 BLE operate on 3.3V
		The operating voltage of my OLED board is 3.3~5V
		* Check operating voltage of your own OLED board!
			
	OLED	Uno R4 WiFi	Nano 33 BL
	------------------------------
	GND	GND		GND
	VCC	+5V		+3V3
	SCL	D19/SCL		A5/P0.02
	SDA	D18/SDA		A4/P0.31
	

Arduino Code:

i2c_scanner.ino, scan connected I2C devices and print its I2C address.
#include <Wire.h>

void setup()
{
  Wire.begin();

  delay(1000);
  Serial.begin(115200);
  while (!Serial);
  delay(1000);

  Serial.println("\nI2C Scanner");
  delay(2000);
}


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
}

nologo_oled.ino
/*  
  Exercise run on Nologo Nano 33 BLE/UNO R4 WiFi,
  to display on I2C OLED (SSD1306)
  using U8g2 library (https://github.com/olikraus/u8g2).
*/

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

String board = "unknown board";

void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(1);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}

void u8g2_box_frame(uint8_t a) {
  u8g2.drawStr( 0, 0, "drawBox");
  u8g2.drawBox(5,10,20,10);
  u8g2.drawBox(10+a,15,30,7);
  u8g2.drawStr( 0, 30, "drawFrame");
  u8g2.drawFrame(5,10+30,20,10);
  u8g2.drawFrame(10+a,15+30,30,7);
}

void setup() {
  delay(1000);
  Serial.begin(115200);
  delay(1000);

  Serial.println("- Start - ");
  u8g2.begin();
  u8g2_prepare();

  /*
    This exercise target to run on Nologo Nano 33 BLE/UNO R4 WiFi
    - in Nano 33 BLE, board name defined in BOARD_NAME
    - in UNO R4 WiFi, board name defined in USB_NAME

  */

  #ifdef BOARD_NAME
    board = BOARD_NAME;
    Serial.println("BOARD_NAME: " + String(BOARD_NAME));
  #endif
  #ifdef USB_NAME
    board = USB_NAME;
    Serial.println("USB_NAME: " + String(USB_NAME));
  #endif

  Serial.println("board: " + board);

  int width = u8g2.getWidth();
  int height = u8g2.getHeight();
  Serial.println("getWidth(): " + String(u8g2.getWidth()));
  Serial.println("getHeight(): " + String(u8g2.getHeight()));
  Serial.println("getDisplayWidth(): " + String(u8g2.getDisplayWidth()));
  Serial.println("getDisplayHeight(): " + String(u8g2.getDisplayHeight()));

  u8g2.clearBuffer();
  u8g2.drawFrame(0, 0, width, height);
  u8g2.setCursor(5, 5);
  u8g2.print(board);
  u8g2.sendBuffer();

  delay(1000);
  String strSize = String(width) + " x " + String(height);
  u8g2.setCursor(5, 15);
  u8g2.print(strSize);
  u8g2.sendBuffer();

  delay(3000);
  u8g2.clearBuffer();
  u8g2.sendBuffer();
  for(int y=0; y<5; y++){
    for(int x=0; x<width; x++){
      u8g2.drawPixel(x, y);
      u8g2.sendBuffer();
    }
  }
  for(int y=5; y<30; y++){
    for(int x=0; x<width; x++){
      u8g2.drawPixel(x, y);
    }
    u8g2.sendBuffer();
  }
  for(int y=30; y<height; y++){
    for(int x=0; x<width; x++){
      u8g2.drawPixel(x, y);
    }
  }
  u8g2.sendBuffer();
  
  delay(1000);
  u8g2.clearBuffer();
  u8g2.sendBuffer();
  for(int y=0; y<height; y++){
    for(int x=0; x<width; x++){
      u8g2.drawPixel(x, y);
    }
  }
  u8g2.sendBuffer();

}

void loop() {
  
}


nologo_Serial_Terminal.ino
/*
 * In this exercise, the OLED act as a terminal (U8X8LOG).
 * Read from Serial and display on I2C SSD1306 OLED (128x64),
 * using U8g2 library.
 * Tested on Nologo Nano 33 BLE/Uno R4 WiFi.
*/

#include <Arduino.h>
#include <U8x8lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

// U8x8 Contructor
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); 	      

// setup the terminal (U8X8LOG) and connect to u8g2 for automatic refresh of the display
// The size (width * height) depends on the display 

#define U8LOG_WIDTH 16
#define U8LOG_HEIGHT 8
uint8_t u8log_buffer[U8LOG_WIDTH*U8LOG_HEIGHT];
U8X8LOG u8x8log;

void setup(void)
{
  Serial.begin(115200);
  u8x8.begin();
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  
  u8x8log.begin(u8x8, U8LOG_WIDTH, U8LOG_HEIGHT, u8log_buffer);
  u8x8log.setRedrawMode(1);		// 0: Update screen with newline, 1: Update screen for every char  

  u8x8log.println("Read from Serial and display on I2C SSD1306 OLED using U8g2 library.");

  Serial.println("\nEnter something and Send");
}


void loop(void) {

  while (Serial.available() > 0) {
    String term_in = Serial.readString();
    Serial.print(term_in);
    u8x8log.print(term_in);
  }
  
  delay(100);
}

related:
Display on SSD1306/SSD1315 OLED with Uno R4 WiFi & Nano 33 BLE using Adafruit SSD1306 library


Comments

Popular posts from this blog

MicroPython/ESP32-C3 + 1.8" 128x160 TFT ST7735 SPI, using boochow/MicroPython-ST7735 library.

CameraWebServe: ESP32-S3 (arduino-esp32) + OV5640 camera module