// NanoR3 with array of two independent I2C OLED
// https://forum.arduino.cc/t/nanor3-with-array-of-two-independent-i2c-oled/1417621
#include <avr/wdt.h> // Include the AVR Watchdog Timer library
#include <U8g2lib.h>
// https://github.com/olikraus/u8g2 // library
// https://github.com/olikraus/u8g2/wiki/u8g2reference // reference
// https://github.com/olikraus/u8g2/wiki/fntlistall // fonts
enum: uint8_t {LANDSCAPE1, PORTRAIT1, LANDSCAPE2, PORTRAIT2};
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display[] = { // creates an array of U8G2 objects
U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0), // first OLED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0) // second OLED
};
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C display[] = { // creates an array of U8G2 objects
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C(U8G2_R0, SCL, SDA, U8X8_PIN_NONE), // first OLED
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C(U8G2_R0, SCL, SDA, U8X8_PIN_NONE) // second OLED
// };
void setup() {
// Enable the Watchdog Timer with a 1-second timeout
wdt_enable(WDTO_1S); // Options: WDTO_15MS, WDTO_30MS, WDTO_60MS, WDTO_120MS, WDTO_250MS, WDTO_500MS, WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S
configOled(0, 0x7A, u8g2_font_squeezed_b7_tr); // address 0x7A is 0x3C in u8g2
configOled(1, 0x78, u8g2_font_t0_14b_mf); // address 0x78 is 0x3D in u8g2
displayOled(0, 0, 3, LANDSCAPE1, "DISPLAY"); // normal rotation, anchor point at lower-left, character is 7 bits tall
displayOled(1, 0, 0, PORTRAIT1, "Display"); // rotated clockwise, anchor point is lower-left of character
}
void loop() {
// Reset the Watchdog Timer to prevent system reset
wdt_reset();
// --- Your main code here ---
// nothing else of interest here
}
void configOled(int number, int address, const uint8_t* font) {
display[number].setI2CAddress(address);
display[number].begin();
display[number].setFont(font);
display[number].setDrawColor(1); // white
display[number].clearDisplay();
display[number].clearBuffer();
display[number].sendBuffer(); // transfer internal memory to the display
}
void displayOled(int number, int x, int y, int dir, const char* text) {
display[number].setFontDirection(dir);
// display[number].setDisplayRotation(U8G2_R1); // only works with #defines
display[number].setCursor(x, y);
display[number].print(text);
display[number].print(' ');
display[number].print(number);
display[number].sendBuffer();
display[number].clearBuffer(); // must clear buffer to clear next display
}