mirror of https://github.com/arendst/Tasmota.git
SSH1106 driver replaced with uDisplay (#21183)
This commit is contained in:
parent
6492596a10
commit
a006e5fc53
|
@ -249,7 +249,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||||
| USE_DISPLAY | - | - / - | - | - | - | x |
|
| USE_DISPLAY | - | - / - | - | - | - | x |
|
||||||
| USE_DISPLAY_LCD | - | - / - | - | - | - | x |
|
| USE_DISPLAY_LCD | - | - / - | - | - | - | x |
|
||||||
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
|
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
|
||||||
| USE_DISPLAY_SH1106 | - | - / - | - | - | - | x |
|
|
||||||
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
|
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
|
||||||
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
|
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
|
||||||
| USE_DISPLAY_SSD1351 | - | - / - | - | - | - | x |
|
| USE_DISPLAY_SSD1351 | - | - / - | - | - | - | x |
|
||||||
|
@ -278,6 +277,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||||
| USE_DINGTIAN_RELAY | | / - | | | | |
|
| USE_DINGTIAN_RELAY | | / - | | | | |
|
||||||
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
|
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
|
||||||
|
|
||||||
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`, `USE_DISPLAY_SSD1306`
|
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`, `USE_DISPLAY_SSD1306`, `USE_DISPLAY_SH1106`
|
||||||
|
|
||||||
- USE_MQTT_TLS is enabled by default in every ESP32 variants
|
- USE_MQTT_TLS is enabled by default in every ESP32 variants
|
||||||
|
|
|
@ -27,6 +27,9 @@ All notable changes to this project will be documented in this file.
|
||||||
### Removed
|
### Removed
|
||||||
- Unused `#define MQTT_DATA_STRING` support
|
- Unused `#define MQTT_DATA_STRING` support
|
||||||
- ILI9341 driver replaced with uDisplay (#21169)
|
- ILI9341 driver replaced with uDisplay (#21169)
|
||||||
|
- SSD1306 driver replaced with uDisplay (#21176)
|
||||||
|
- SSD1331 driver replaced with uDisplay (#21177)
|
||||||
|
- SSH1106 driver replaced with uDisplay
|
||||||
|
|
||||||
## [13.4.0.3] 20240402
|
## [13.4.0.3] 20240402
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -13,9 +13,9 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||||
2 | USE_PCF8574 | xdrv_28 | PCF8574 | 0x20 - 0x26 | | 8-bit I/O expander (address range overridable)
|
2 | USE_PCF8574 | xdrv_28 | PCF8574 | 0x20 - 0x26 | | 8-bit I/O expander (address range overridable)
|
||||||
2 | USE_PCF8574 | xdrv_28 | PCF8574A | 0x39 - 0x3F | | 8-bit I/O expander (address range overridable)
|
2 | USE_PCF8574 | xdrv_28 | PCF8574A | 0x39 - 0x3F | | 8-bit I/O expander (address range overridable)
|
||||||
3 | USE_DISPLAY_LCD | xdsp_01 | | 0x27, 0x3F | | LCD display
|
3 | USE_DISPLAY_LCD | xdsp_01 | | 0x27, 0x3F | | LCD display
|
||||||
4 | - REMOVED | | | | | USE_DISPLAY_SSD1306 - REMOVED
|
4 | REMOVED | | | | | USE_DISPLAY_SSD1306 - REMOVED
|
||||||
5 | USE_DISPLAY_MATRIX | xdsp_03 | HT16K33 | 0x70 - 0x77 | | 8x8 led matrix
|
5 | USE_DISPLAY_MATRIX | xdsp_03 | HT16K33 | 0x70 - 0x77 | | 8x8 led matrix
|
||||||
6 | USE_DISPLAY_SH1106 | xdsp_07 | SH1106 | 0x3C - 0x3D | | Oled display
|
6 | REMOVED | | SH1106 | 0x3C - 0x3D | | USE_DISPLAY_SH1106 - REMOVED
|
||||||
7 | USE_ADE7953 | xnrg_07 | ADE7953 | 0x38 | | Energy monitor
|
7 | USE_ADE7953 | xnrg_07 | ADE7953 | 0x38 | | Energy monitor
|
||||||
8 | USE_SHT | xsns_07 | SHT1X | Any | | Temperature and Humidity sensor
|
8 | USE_SHT | xsns_07 | SHT1X | Any | | Temperature and Humidity sensor
|
||||||
9 | USE_HTU | xsns_08 | HTU21 | 0x40 | Yes | Temperature and Humidity sensor
|
9 | USE_HTU | xsns_08 | HTU21 | 0x40 | Yes | Temperature and Humidity sensor
|
||||||
|
|
|
@ -1,303 +0,0 @@
|
||||||
/*********************************************************************
|
|
||||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
|
||||||
|
|
||||||
Pick one up today in the adafruit shop!
|
|
||||||
------> http://www.adafruit.com/category/63_98
|
|
||||||
|
|
||||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
|
||||||
interface
|
|
||||||
|
|
||||||
Adafruit invests time and resources providing this open source code,
|
|
||||||
please support Adafruit and open-source hardware by purchasing
|
|
||||||
products from Adafruit!
|
|
||||||
|
|
||||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
|
||||||
BSD license, check license.txt for more information
|
|
||||||
All text above, and the splash screen below must be included in any redistribution
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
I change the adafruit SSD1306 to SH1106
|
|
||||||
|
|
||||||
SH1106 driver similar to SSD1306 so, just change the display() method.
|
|
||||||
|
|
||||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
|
||||||
|
|
||||||
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
//#include <avr/pgmspace.h>
|
|
||||||
#ifndef __SAM3X8E__
|
|
||||||
// #include <util/delay.h>
|
|
||||||
#endif
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <Wire.h>
|
|
||||||
//#include <../../sonoff/settings.h>
|
|
||||||
|
|
||||||
#include "Adafruit_SH1106.h"
|
|
||||||
#define DISPLAY_INIT_MODE 0
|
|
||||||
|
|
||||||
// the memory buffer for the LCD
|
|
||||||
|
|
||||||
uint8_t *dbuff;
|
|
||||||
|
|
||||||
Adafruit_SH1106::Adafruit_SH1106(int16_t width, int16_t height) :
|
|
||||||
Renderer(width,height) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::DisplayOnff(int8_t on) {
|
|
||||||
if (on) {
|
|
||||||
SH1106_command(SH1106_DISPLAYON);
|
|
||||||
} else {
|
|
||||||
SH1106_command(SH1106_DISPLAYOFF);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::Updateframe() {
|
|
||||||
display();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) {
|
|
||||||
// ignore update mode
|
|
||||||
//if (p==DISPLAY_INIT_MODE) {
|
|
||||||
// allocate screen buffer
|
|
||||||
setRotation(rot);
|
|
||||||
invertDisplay(false);
|
|
||||||
setTextWrap(false); // Allow text to run off edges
|
|
||||||
cp437(true);
|
|
||||||
setTextFont(font);
|
|
||||||
setTextSize(size);
|
|
||||||
setTextColor(WHITE, BLACK);
|
|
||||||
setCursor(0,0);
|
|
||||||
//fillScreen(BLACK);
|
|
||||||
fillScreen(BLACK);
|
|
||||||
Updateframe();
|
|
||||||
|
|
||||||
disp_bpp = -1;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::Begin(int16_t p1,int16_t p2,int16_t p3) {
|
|
||||||
begin(p1,p2,p3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
boolean Adafruit_SH1106::begin(uint8_t vccstate, uint8_t i2caddr, bool reset) {
|
|
||||||
_vccstate = vccstate;
|
|
||||||
_i2caddr = i2caddr;
|
|
||||||
|
|
||||||
framebuffer = (uint8_t *)malloc(WIDTH * ((HEIGHT + 7) / 8));
|
|
||||||
if (!framebuffer) return false;
|
|
||||||
|
|
||||||
// I2C Init
|
|
||||||
Wire.begin();
|
|
||||||
|
|
||||||
#if defined SH1106_128_32
|
|
||||||
// Init sequence for 128x32 OLED module
|
|
||||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
|
||||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
|
||||||
SH1106_command(0x80); // the suggested ratio 0x80
|
|
||||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
|
||||||
SH1106_command(0x1F);
|
|
||||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
|
||||||
SH1106_command(0x0); // no offset
|
|
||||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
|
||||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x10); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0x14); }
|
|
||||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
|
||||||
SH1106_command(0x00); // 0x0 act like ks0108
|
|
||||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
|
||||||
SH1106_command(SH1106_COMSCANDEC);
|
|
||||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
|
||||||
SH1106_command(0x02);
|
|
||||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
|
||||||
SH1106_command(0x8F);
|
|
||||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x22); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0xF1); }
|
|
||||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
|
||||||
SH1106_command(0x40);
|
|
||||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
|
||||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined SH1106_128_64
|
|
||||||
// Init sequence for 128x64 OLED module
|
|
||||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
|
||||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
|
||||||
SH1106_command(0x80); // the suggested ratio 0x80
|
|
||||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
|
||||||
SH1106_command(0x3F);
|
|
||||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
|
||||||
SH1106_command(0x00); // no offset
|
|
||||||
|
|
||||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0 0x40
|
|
||||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x10); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0x14); }
|
|
||||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
|
||||||
SH1106_command(0x00); // 0x0 act like ks0108
|
|
||||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
|
||||||
SH1106_command(SH1106_COMSCANDEC);
|
|
||||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
|
||||||
SH1106_command(0x12);
|
|
||||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x9F); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0xCF); }
|
|
||||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x22); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0xF1); }
|
|
||||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
|
||||||
SH1106_command(0x40);
|
|
||||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
|
||||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined SH1106_96_16
|
|
||||||
// Init sequence for 96x16 OLED module
|
|
||||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
|
||||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
|
||||||
SH1106_command(0x80); // the suggested ratio 0x80
|
|
||||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
|
||||||
SH1106_command(0x0F);
|
|
||||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
|
||||||
SH1106_command(0x00); // no offset
|
|
||||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
|
||||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x10); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0x14); }
|
|
||||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
|
||||||
SH1106_command(0x00); // 0x0 act like ks0108
|
|
||||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
|
||||||
SH1106_command(SH1106_COMSCANDEC);
|
|
||||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
|
||||||
SH1106_command(0x2); //ada x12
|
|
||||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x10); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0xAF); }
|
|
||||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
|
||||||
if (vccstate == SH1106_EXTERNALVCC)
|
|
||||||
{ SH1106_command(0x22); }
|
|
||||||
else
|
|
||||||
{ SH1106_command(0xF1); }
|
|
||||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
|
||||||
SH1106_command(0x40);
|
|
||||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
|
||||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SH1106_command(SH1106_DISPLAYON);//--turn on oled panel
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Adafruit_SH1106::invertDisplay(uint8_t i) {
|
|
||||||
if (i) {
|
|
||||||
SH1106_command(SH1106_INVERTDISPLAY);
|
|
||||||
} else {
|
|
||||||
SH1106_command(SH1106_NORMALDISPLAY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::SH1106_command(uint8_t c) {
|
|
||||||
|
|
||||||
// I2C
|
|
||||||
uint8_t control = 0x00; // Co = 0, D/C = 0
|
|
||||||
Wire.beginTransmission(_i2caddr);
|
|
||||||
WIRE_WRITE(control);
|
|
||||||
WIRE_WRITE(c);
|
|
||||||
Wire.endTransmission();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dim the display
|
|
||||||
// dim = true: display is dimmed
|
|
||||||
// dim = false: display is normal
|
|
||||||
void Adafruit_SH1106::dim(uint8_t dim) {
|
|
||||||
uint8_t contrast;
|
|
||||||
|
|
||||||
if (dim) {
|
|
||||||
contrast = 0; // Dimmed display
|
|
||||||
} else {
|
|
||||||
if (_vccstate == SH1106_EXTERNALVCC) {
|
|
||||||
contrast = 0x9F;
|
|
||||||
} else {
|
|
||||||
contrast = 0xCF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// the range of contrast to too small to be really useful
|
|
||||||
// it is useful to dim the display
|
|
||||||
SH1106_command(SH1106_SETCONTRAST);
|
|
||||||
SH1106_command(contrast);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::SH1106_data(uint8_t c) {
|
|
||||||
// I2C
|
|
||||||
uint8_t control = 0x40; // Co = 0, D/C = 1
|
|
||||||
Wire.beginTransmission(_i2caddr);
|
|
||||||
WIRE_WRITE(control);
|
|
||||||
WIRE_WRITE(c);
|
|
||||||
Wire.endTransmission();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Adafruit_SH1106::display(void) {
|
|
||||||
SH1106_command(SH1106_SETLOWCOLUMN | 0x0); // low col = 0
|
|
||||||
SH1106_command(SH1106_SETHIGHCOLUMN | 0x0); // hi col = 0
|
|
||||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
|
||||||
// I2C
|
|
||||||
//height >>= 3;
|
|
||||||
//width >>= 3;
|
|
||||||
byte height=64;
|
|
||||||
byte width=132;
|
|
||||||
byte m_row = 0;
|
|
||||||
byte m_col = 2;
|
|
||||||
|
|
||||||
|
|
||||||
height >>= 3;
|
|
||||||
width >>= 3;
|
|
||||||
//Serial.println(width);
|
|
||||||
|
|
||||||
int p = 0;
|
|
||||||
|
|
||||||
byte i, j, k =0;
|
|
||||||
|
|
||||||
for ( i = 0; i < height; i++) {
|
|
||||||
|
|
||||||
// send a bunch of data in one xmission
|
|
||||||
SH1106_command(0xB0 + i + m_row);//set page address
|
|
||||||
SH1106_command(m_col & 0xf);//set lower column address
|
|
||||||
SH1106_command(0x10 | (m_col >> 4));//set higher column address
|
|
||||||
|
|
||||||
for( j = 0; j < 8; j++){
|
|
||||||
Wire.beginTransmission(_i2caddr);
|
|
||||||
Wire.write(0x40);
|
|
||||||
for ( k = 0; k < width; k++, p++) {
|
|
||||||
Wire.write(framebuffer[p]);
|
|
||||||
}
|
|
||||||
Wire.endTransmission();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear everything
|
|
||||||
void Adafruit_SH1106::clearDisplay(void) {
|
|
||||||
memset(framebuffer, 0, (SH1106_LCDWIDTH*SH1106_LCDHEIGHT/8));
|
|
||||||
}
|
|
|
@ -1,154 +0,0 @@
|
||||||
/*********************************************************************
|
|
||||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
|
||||||
|
|
||||||
Pick one up today in the adafruit shop!
|
|
||||||
------> http://www.adafruit.com/category/63_98
|
|
||||||
|
|
||||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
|
||||||
interface
|
|
||||||
|
|
||||||
Adafruit invests time and resources providing this open source code,
|
|
||||||
please support Adafruit and open-source hardware by purchasing
|
|
||||||
products from Adafruit!
|
|
||||||
|
|
||||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
|
||||||
BSD license, check license.txt for more information
|
|
||||||
All text above, and the splash screen must be included in any redistribution
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
I change the adafruit SSD1306 to SH1106
|
|
||||||
|
|
||||||
SH1106 driver similar to SSD1306 so, just change the display() method.
|
|
||||||
|
|
||||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
|
||||||
|
|
||||||
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
#if ARDUINO >= 100
|
|
||||||
#include "Arduino.h"
|
|
||||||
#define WIRE_WRITE Wire.write
|
|
||||||
#else
|
|
||||||
#include "WProgram.h"
|
|
||||||
#define WIRE_WRITE Wire.send
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <renderer.h>
|
|
||||||
|
|
||||||
#define BLACK 0
|
|
||||||
#define WHITE 1
|
|
||||||
#define INVERSE 2
|
|
||||||
|
|
||||||
#define SH1106_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
|
|
||||||
// Address for 128x32 is 0x3C
|
|
||||||
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
|
|
||||||
|
|
||||||
/*=========================================================================
|
|
||||||
SH1106 Displays
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
The driver is used in multiple displays (128x64, 128x32, etc.).
|
|
||||||
Select the appropriate display below to create an appropriately
|
|
||||||
sized framebuffer, etc.
|
|
||||||
|
|
||||||
SH1106_128_64 128x64 pixel display
|
|
||||||
|
|
||||||
SH1106_128_32 128x32 pixel display
|
|
||||||
|
|
||||||
SH1106_96_16
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------*/
|
|
||||||
#define SH1106_128_64
|
|
||||||
// #define SH1106_128_32
|
|
||||||
// #define SH1106_96_16
|
|
||||||
/*=========================================================================*/
|
|
||||||
|
|
||||||
#if defined SH1106_128_64 && defined SH1106_128_32
|
|
||||||
#error "Only one SH1106 display can be specified at once in SH1106.h"
|
|
||||||
#endif
|
|
||||||
#if !defined SH1106_128_64 && !defined SH1106_128_32 && !defined SH1106_96_16
|
|
||||||
#error "At least one SH1106 display must be specified in SH1106.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined SH1106_128_64
|
|
||||||
#define SH1106_LCDWIDTH 128
|
|
||||||
#define SH1106_LCDHEIGHT 64
|
|
||||||
#endif
|
|
||||||
#if defined SH1106_128_32
|
|
||||||
#define SH1106_LCDWIDTH 128
|
|
||||||
#define SH1106_LCDHEIGHT 32
|
|
||||||
#endif
|
|
||||||
#if defined SH1106_96_16
|
|
||||||
#define SH1106_LCDWIDTH 96
|
|
||||||
#define SH1106_LCDHEIGHT 16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SH1106_SETCONTRAST 0x81
|
|
||||||
#define SH1106_DISPLAYALLON_RESUME 0xA4
|
|
||||||
#define SH1106_DISPLAYALLON 0xA5
|
|
||||||
#define SH1106_NORMALDISPLAY 0xA6
|
|
||||||
#define SH1106_INVERTDISPLAY 0xA7
|
|
||||||
#define SH1106_DISPLAYOFF 0xAE
|
|
||||||
#define SH1106_DISPLAYON 0xAF
|
|
||||||
|
|
||||||
#define SH1106_SETDISPLAYOFFSET 0xD3
|
|
||||||
#define SH1106_SETCOMPINS 0xDA
|
|
||||||
|
|
||||||
#define SH1106_SETVCOMDETECT 0xDB
|
|
||||||
|
|
||||||
#define SH1106_SETDISPLAYCLOCKDIV 0xD5
|
|
||||||
#define SH1106_SETPRECHARGE 0xD9
|
|
||||||
|
|
||||||
#define SH1106_SETMULTIPLEX 0xA8
|
|
||||||
|
|
||||||
#define SH1106_SETLOWCOLUMN 0x00
|
|
||||||
#define SH1106_SETHIGHCOLUMN 0x10
|
|
||||||
|
|
||||||
#define SH1106_SETSTARTLINE 0x40
|
|
||||||
|
|
||||||
#define SH1106_MEMORYMODE 0x20
|
|
||||||
#define SH1106_COLUMNADDR 0x21
|
|
||||||
#define SH1106_PAGEADDR 0x22
|
|
||||||
|
|
||||||
#define SH1106_COMSCANINC 0xC0
|
|
||||||
#define SH1106_COMSCANDEC 0xC8
|
|
||||||
|
|
||||||
#define SH1106_SEGREMAP 0xA0
|
|
||||||
|
|
||||||
#define SH1106_CHARGEPUMP 0x8D
|
|
||||||
|
|
||||||
#define SH1106_EXTERNALVCC 0x1
|
|
||||||
#define SH1106_SWITCHCAPVCC 0x2
|
|
||||||
|
|
||||||
// Scrolling #defines
|
|
||||||
#define SH1106_ACTIVATE_SCROLL 0x2F
|
|
||||||
#define SH1106_DEACTIVATE_SCROLL 0x2E
|
|
||||||
#define SH1106_SET_VERTICAL_SCROLL_AREA 0xA3
|
|
||||||
#define SH1106_RIGHT_HORIZONTAL_SCROLL 0x26
|
|
||||||
#define SH1106_LEFT_HORIZONTAL_SCROLL 0x27
|
|
||||||
#define SH1106_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
|
|
||||||
#define SH1106_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
|
|
||||||
|
|
||||||
class Adafruit_SH1106 : public Renderer {
|
|
||||||
public:
|
|
||||||
Adafruit_SH1106(int16_t width, int16_t height);
|
|
||||||
|
|
||||||
boolean begin(uint8_t switchvcc = SH1106_SWITCHCAPVCC, uint8_t i2caddr = SH1106_I2C_ADDRESS, bool reset=true);
|
|
||||||
void SH1106_command(uint8_t c);
|
|
||||||
void SH1106_data(uint8_t c);
|
|
||||||
|
|
||||||
void clearDisplay(void);
|
|
||||||
void invertDisplay(uint8_t i);
|
|
||||||
void display();
|
|
||||||
|
|
||||||
|
|
||||||
void DisplayOnff(int8_t on);
|
|
||||||
void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font);
|
|
||||||
void Begin(int16_t p1,int16_t p2,int16_t p3);
|
|
||||||
void Updateframe();
|
|
||||||
void dim(uint8_t contrast);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int8_t _i2caddr, _vccstate, rst;
|
|
||||||
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
Software License Agreement (BSD License)
|
|
||||||
|
|
||||||
Copyright (c) 2012, Adafruit Industries
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. Neither the name of the copyright holders nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1,16 +0,0 @@
|
||||||
Adafruit_SH1106
|
|
||||||
===============
|
|
||||||
|
|
||||||
Adafruit graphic library for SH1106 driver lcds.
|
|
||||||
|
|
||||||
some small oled lcd use SH1106 driver.
|
|
||||||
|
|
||||||
I change the adafruit SSD1306 to SH1106
|
|
||||||
|
|
||||||
SH1106 driver similar to SSD1306. thus, just change the display() method.
|
|
||||||
|
|
||||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
|
||||||
|
|
||||||
|
|
||||||
Adafruit-GFX-Library
|
|
||||||
https://github.com/adafruit/Adafruit-GFX-Library
|
|
|
@ -1,363 +0,0 @@
|
||||||
/*********************************************************************
|
|
||||||
This is an example for our Monochrome OLEDs based on SSD1306 drivers
|
|
||||||
|
|
||||||
Pick one up today in the adafruit shop!
|
|
||||||
------> http://www.adafruit.com/category/63_98
|
|
||||||
|
|
||||||
This example is for a 128x64 size display using I2C to communicate
|
|
||||||
3 pins are required to interface (2 I2C and one reset)
|
|
||||||
|
|
||||||
Adafruit invests time and resources providing this open source code,
|
|
||||||
please support Adafruit and open-source hardware by purchasing
|
|
||||||
products from Adafruit!
|
|
||||||
|
|
||||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
|
||||||
BSD license, check license.txt for more information
|
|
||||||
All text above, and the splash screen must be included in any redistribution
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
I change the adafruit SSD1306 to SH1106
|
|
||||||
|
|
||||||
SH1106 driver don't provide several functions such as scroll commands.
|
|
||||||
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
#include <SPI.h>
|
|
||||||
#include <Wire.h>
|
|
||||||
#include <Adafruit_GFX.h>
|
|
||||||
#include <Adafruit_SH1106.h>
|
|
||||||
|
|
||||||
#define OLED_RESET 4
|
|
||||||
Adafruit_SH1106 display(OLED_RESET);
|
|
||||||
|
|
||||||
#define NUMFLAKES 10
|
|
||||||
#define XPOS 0
|
|
||||||
#define YPOS 1
|
|
||||||
#define DELTAY 2
|
|
||||||
|
|
||||||
|
|
||||||
#define LOGO16_GLCD_HEIGHT 16
|
|
||||||
#define LOGO16_GLCD_WIDTH 16
|
|
||||||
static const unsigned char PROGMEM logo16_glcd_bmp[] =
|
|
||||||
{ B00000000, B11000000,
|
|
||||||
B00000001, B11000000,
|
|
||||||
B00000001, B11000000,
|
|
||||||
B00000011, B11100000,
|
|
||||||
B11110011, B11100000,
|
|
||||||
B11111110, B11111000,
|
|
||||||
B01111110, B11111111,
|
|
||||||
B00110011, B10011111,
|
|
||||||
B00011111, B11111100,
|
|
||||||
B00001101, B01110000,
|
|
||||||
B00011011, B10100000,
|
|
||||||
B00111111, B11100000,
|
|
||||||
B00111111, B11110000,
|
|
||||||
B01111100, B11110000,
|
|
||||||
B01110000, B01110000,
|
|
||||||
B00000000, B00110000 };
|
|
||||||
|
|
||||||
#if (SH1106_LCDHEIGHT != 64)
|
|
||||||
#error("Height incorrect, please fix Adafruit_SH1106.h!");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
|
|
||||||
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
|
|
||||||
display.begin(SH1106_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
|
|
||||||
// init done
|
|
||||||
|
|
||||||
// Show image buffer on the display hardware.
|
|
||||||
// Since the buffer is intialized with an Adafruit splashscreen
|
|
||||||
// internally, this will display the splashscreen.
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
|
|
||||||
// Clear the buffer.
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw a single pixel
|
|
||||||
display.drawPixel(10, 10, WHITE);
|
|
||||||
// Show the display buffer on the hardware.
|
|
||||||
// NOTE: You _must_ call display after making any drawing commands
|
|
||||||
// to make them visible on the display hardware!
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw many lines
|
|
||||||
testdrawline();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw rectangles
|
|
||||||
testdrawrect();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw multiple rectangles
|
|
||||||
testfillrect();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw mulitple circles
|
|
||||||
testdrawcircle();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw a white circle, 10 pixel radius
|
|
||||||
display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testdrawroundrect();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testfillroundrect();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testdrawtriangle();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testfilltriangle();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw the first ~12 characters in the font
|
|
||||||
testdrawchar();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw scrolling text
|
|
||||||
/* testscrolltext();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();*/
|
|
||||||
|
|
||||||
// text display tests
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(0,0);
|
|
||||||
display.println("Hello, world!");
|
|
||||||
display.setTextColor(BLACK, WHITE); // 'inverted' text
|
|
||||||
display.println(3.141592);
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.print("0x"); display.println(0xDEADBEEF, HEX);
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
|
|
||||||
// miniature bitmap display
|
|
||||||
display.clearDisplay();
|
|
||||||
display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
|
||||||
display.display();
|
|
||||||
|
|
||||||
// invert the display
|
|
||||||
display.invertDisplay(true);
|
|
||||||
delay(1000);
|
|
||||||
display.invertDisplay(false);
|
|
||||||
delay(1000);
|
|
||||||
|
|
||||||
// draw a bitmap icon and 'animate' movement
|
|
||||||
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
|
|
||||||
uint8_t icons[NUMFLAKES][3];
|
|
||||||
|
|
||||||
// initialize
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
icons[f][XPOS] = random(display.width());
|
|
||||||
icons[f][YPOS] = 0;
|
|
||||||
icons[f][DELTAY] = random(5) + 1;
|
|
||||||
|
|
||||||
Serial.print("x: ");
|
|
||||||
Serial.print(icons[f][XPOS], DEC);
|
|
||||||
Serial.print(" y: ");
|
|
||||||
Serial.print(icons[f][YPOS], DEC);
|
|
||||||
Serial.print(" dy: ");
|
|
||||||
Serial.println(icons[f][DELTAY], DEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
// draw each icon
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
|
|
||||||
}
|
|
||||||
display.display();
|
|
||||||
delay(200);
|
|
||||||
|
|
||||||
// then erase it + move it
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
|
|
||||||
// move it
|
|
||||||
icons[f][YPOS] += icons[f][DELTAY];
|
|
||||||
// if its gone, reinit
|
|
||||||
if (icons[f][YPOS] > display.height()) {
|
|
||||||
icons[f][XPOS] = random(display.width());
|
|
||||||
icons[f][YPOS] = 0;
|
|
||||||
icons[f][DELTAY] = random(5) + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void testdrawchar(void) {
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(0,0);
|
|
||||||
|
|
||||||
for (uint8_t i=0; i < 168; i++) {
|
|
||||||
if (i == '\n') continue;
|
|
||||||
display.write(i);
|
|
||||||
if ((i > 0) && (i % 21 == 0))
|
|
||||||
display.println();
|
|
||||||
}
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawcircle(void) {
|
|
||||||
for (int16_t i=0; i<display.height(); i+=2) {
|
|
||||||
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfillrect(void) {
|
|
||||||
uint8_t color = 1;
|
|
||||||
for (int16_t i=0; i<display.height()/2; i+=3) {
|
|
||||||
// alternate colors
|
|
||||||
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
|
|
||||||
display.display();
|
|
||||||
color++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawtriangle(void) {
|
|
||||||
for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
|
|
||||||
display.drawTriangle(display.width()/2, display.height()/2-i,
|
|
||||||
display.width()/2-i, display.height()/2+i,
|
|
||||||
display.width()/2+i, display.height()/2+i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfilltriangle(void) {
|
|
||||||
uint8_t color = WHITE;
|
|
||||||
for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
|
|
||||||
display.fillTriangle(display.width()/2, display.height()/2-i,
|
|
||||||
display.width()/2-i, display.height()/2+i,
|
|
||||||
display.width()/2+i, display.height()/2+i, WHITE);
|
|
||||||
if (color == WHITE) color = BLACK;
|
|
||||||
else color = WHITE;
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawroundrect(void) {
|
|
||||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
|
||||||
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfillroundrect(void) {
|
|
||||||
uint8_t color = WHITE;
|
|
||||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
|
||||||
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
|
|
||||||
if (color == WHITE) color = BLACK;
|
|
||||||
else color = WHITE;
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawrect(void) {
|
|
||||||
for (int16_t i=0; i<display.height()/2; i+=2) {
|
|
||||||
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawline() {
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(0, 0, i, display.height()-1, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=0; i<display.height(); i+=4) {
|
|
||||||
display.drawLine(0, 0, display.width()-1, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(0, display.height()-1, i, 0, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=display.width()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=0; i<display.height(); i+=4) {
|
|
||||||
display.drawLine(display.width()-1, 0, 0, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*void testscrolltext(void) {
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(10,0);
|
|
||||||
display.clearDisplay();
|
|
||||||
display.println("scroll");
|
|
||||||
display.display();
|
|
||||||
|
|
||||||
display.startscrollright(0x00, 0x0F);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
delay(1000);
|
|
||||||
display.startscrollleft(0x00, 0x0F);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
delay(1000);
|
|
||||||
display.startscrolldiagright(0x00, 0x07);
|
|
||||||
delay(2000);
|
|
||||||
display.startscrolldiagleft(0x00, 0x07);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
}*/
|
|
|
@ -1,369 +0,0 @@
|
||||||
/*********************************************************************
|
|
||||||
This is an example for our Monochrome OLEDs based on SH1106 drivers
|
|
||||||
|
|
||||||
Pick one up today in the adafruit shop!
|
|
||||||
------> http://www.adafruit.com/category/63_98
|
|
||||||
|
|
||||||
This example is for a 128x64 size display using SPI to communicate
|
|
||||||
4 or 5 pins are required to interface
|
|
||||||
|
|
||||||
Adafruit invests time and resources providing this open source code,
|
|
||||||
please support Adafruit and open-source hardware by purchasing
|
|
||||||
products from Adafruit!
|
|
||||||
|
|
||||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
|
||||||
BSD license, check license.txt for more information
|
|
||||||
All text above, and the splash screen must be included in any redistribution
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
#include <SPI.h>
|
|
||||||
#include <Wire.h>
|
|
||||||
#include <Adafruit_GFX.h>
|
|
||||||
#include <Adafruit_SH1106.h>
|
|
||||||
|
|
||||||
// If using software SPI (the default case):
|
|
||||||
#define OLED_MOSI 9
|
|
||||||
#define OLED_CLK 10
|
|
||||||
#define OLED_DC 11
|
|
||||||
#define OLED_CS 12
|
|
||||||
#define OLED_RESET 13
|
|
||||||
Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
|
|
||||||
|
|
||||||
/* Uncomment this block to use hardware SPI
|
|
||||||
#define OLED_DC 6
|
|
||||||
#define OLED_CS 7
|
|
||||||
#define OLED_RESET 8
|
|
||||||
Adafruit_SH1106 display(OLED_DC, OLED_RESET, OLED_CS);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NUMFLAKES 10
|
|
||||||
#define XPOS 0
|
|
||||||
#define YPOS 1
|
|
||||||
#define DELTAY 2
|
|
||||||
|
|
||||||
#define LOGO16_GLCD_HEIGHT 16
|
|
||||||
#define LOGO16_GLCD_WIDTH 16
|
|
||||||
static const unsigned char PROGMEM logo16_glcd_bmp[] =
|
|
||||||
{ B00000000, B11000000,
|
|
||||||
B00000001, B11000000,
|
|
||||||
B00000001, B11000000,
|
|
||||||
B00000011, B11100000,
|
|
||||||
B11110011, B11100000,
|
|
||||||
B11111110, B11111000,
|
|
||||||
B01111110, B11111111,
|
|
||||||
B00110011, B10011111,
|
|
||||||
B00011111, B11111100,
|
|
||||||
B00001101, B01110000,
|
|
||||||
B00011011, B10100000,
|
|
||||||
B00111111, B11100000,
|
|
||||||
B00111111, B11110000,
|
|
||||||
B01111100, B11110000,
|
|
||||||
B01110000, B01110000,
|
|
||||||
B00000000, B00110000 };
|
|
||||||
|
|
||||||
#if (SH1106_LCDHEIGHT != 64)
|
|
||||||
#error("Height incorrect, please fix Adafruit_SH1106.h!");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(9600);
|
|
||||||
|
|
||||||
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
|
|
||||||
display.begin(SH1106_SWITCHCAPVCC);
|
|
||||||
// init done
|
|
||||||
|
|
||||||
// Show image buffer on the display hardware.
|
|
||||||
// Since the buffer is intialized with an Adafruit splashscreen
|
|
||||||
// internally, this will display the splashscreen.
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
|
|
||||||
// Clear the buffer.
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw a single pixel
|
|
||||||
display.drawPixel(10, 10, WHITE);
|
|
||||||
// Show the display buffer on the hardware.
|
|
||||||
// NOTE: You _must_ call display after making any drawing commands
|
|
||||||
// to make them visible on the display hardware!
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw many lines
|
|
||||||
testdrawline();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw rectangles
|
|
||||||
testdrawrect();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw multiple rectangles
|
|
||||||
testfillrect();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw mulitple circles
|
|
||||||
testdrawcircle();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw a white circle, 10 pixel radius
|
|
||||||
display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testdrawroundrect();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testfillroundrect();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testdrawtriangle();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
testfilltriangle();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw the first ~12 characters in the font
|
|
||||||
testdrawchar();
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();
|
|
||||||
|
|
||||||
// draw scrolling text
|
|
||||||
/*testscrolltext();
|
|
||||||
delay(2000);
|
|
||||||
display.clearDisplay();*/
|
|
||||||
|
|
||||||
// text display tests
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(0,0);
|
|
||||||
display.println("Hello, world!");
|
|
||||||
display.setTextColor(BLACK, WHITE); // 'inverted' text
|
|
||||||
display.println(3.141592);
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.print("0x"); display.println(0xDEADBEEF, HEX);
|
|
||||||
display.display();
|
|
||||||
delay(2000);
|
|
||||||
|
|
||||||
// miniature bitmap display
|
|
||||||
display.clearDisplay();
|
|
||||||
display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
|
||||||
display.display();
|
|
||||||
|
|
||||||
// invert the display
|
|
||||||
display.invertDisplay(true);
|
|
||||||
delay(1000);
|
|
||||||
display.invertDisplay(false);
|
|
||||||
delay(1000);
|
|
||||||
|
|
||||||
// draw a bitmap icon and 'animate' movement
|
|
||||||
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
|
|
||||||
uint8_t icons[NUMFLAKES][3];
|
|
||||||
|
|
||||||
// initialize
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
icons[f][XPOS] = random(display.width());
|
|
||||||
icons[f][YPOS] = 0;
|
|
||||||
icons[f][DELTAY] = random(5) + 1;
|
|
||||||
|
|
||||||
Serial.print("x: ");
|
|
||||||
Serial.print(icons[f][XPOS], DEC);
|
|
||||||
Serial.print(" y: ");
|
|
||||||
Serial.print(icons[f][YPOS], DEC);
|
|
||||||
Serial.print(" dy: ");
|
|
||||||
Serial.println(icons[f][DELTAY], DEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
// draw each icon
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
|
|
||||||
}
|
|
||||||
display.display();
|
|
||||||
delay(200);
|
|
||||||
|
|
||||||
// then erase it + move it
|
|
||||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
|
||||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
|
|
||||||
// move it
|
|
||||||
icons[f][YPOS] += icons[f][DELTAY];
|
|
||||||
// if its gone, reinit
|
|
||||||
if (icons[f][YPOS] > display.height()) {
|
|
||||||
icons[f][XPOS] = random(display.width());
|
|
||||||
icons[f][YPOS] = 0;
|
|
||||||
icons[f][DELTAY] = random(5) + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void testdrawchar(void) {
|
|
||||||
display.setTextSize(1);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(0,0);
|
|
||||||
|
|
||||||
for (uint8_t i=0; i < 168; i++) {
|
|
||||||
if (i == '\n') continue;
|
|
||||||
display.write(i);
|
|
||||||
if ((i > 0) && (i % 21 == 0))
|
|
||||||
display.println();
|
|
||||||
}
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawcircle(void) {
|
|
||||||
for (int16_t i=0; i<display.height(); i+=2) {
|
|
||||||
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfillrect(void) {
|
|
||||||
uint8_t color = 1;
|
|
||||||
for (int16_t i=0; i<display.height()/2; i+=3) {
|
|
||||||
// alternate colors
|
|
||||||
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
|
|
||||||
display.display();
|
|
||||||
color++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawtriangle(void) {
|
|
||||||
for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
|
|
||||||
display.drawTriangle(display.width()/2, display.height()/2-i,
|
|
||||||
display.width()/2-i, display.height()/2+i,
|
|
||||||
display.width()/2+i, display.height()/2+i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfilltriangle(void) {
|
|
||||||
uint8_t color = WHITE;
|
|
||||||
for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
|
|
||||||
display.fillTriangle(display.width()/2, display.height()/2-i,
|
|
||||||
display.width()/2-i, display.height()/2+i,
|
|
||||||
display.width()/2+i, display.height()/2+i, WHITE);
|
|
||||||
if (color == WHITE) color = BLACK;
|
|
||||||
else color = WHITE;
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawroundrect(void) {
|
|
||||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
|
||||||
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testfillroundrect(void) {
|
|
||||||
uint8_t color = WHITE;
|
|
||||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
|
||||||
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
|
|
||||||
if (color == WHITE) color = BLACK;
|
|
||||||
else color = WHITE;
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawrect(void) {
|
|
||||||
for (int16_t i=0; i<display.height()/2; i+=2) {
|
|
||||||
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void testdrawline() {
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(0, 0, i, display.height()-1, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=0; i<display.height(); i+=4) {
|
|
||||||
display.drawLine(0, 0, display.width()-1, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(0, display.height()-1, i, 0, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=display.width()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
|
||||||
display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
|
|
||||||
display.clearDisplay();
|
|
||||||
for (int16_t i=0; i<display.height(); i+=4) {
|
|
||||||
display.drawLine(display.width()-1, 0, 0, i, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
for (int16_t i=0; i<display.width(); i+=4) {
|
|
||||||
display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void testscrolltext(void) {
|
|
||||||
display.setTextSize(2);
|
|
||||||
display.setTextColor(WHITE);
|
|
||||||
display.setCursor(10,0);
|
|
||||||
display.clearDisplay();
|
|
||||||
display.println("scroll");
|
|
||||||
display.display();
|
|
||||||
|
|
||||||
display.startscrollright(0x00, 0x0F);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
delay(1000);
|
|
||||||
display.startscrollleft(0x00, 0x0F);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
delay(1000);
|
|
||||||
display.startscrolldiagright(0x00, 0x07);
|
|
||||||
delay(2000);
|
|
||||||
display.startscrolldiagleft(0x00, 0x07);
|
|
||||||
delay(2000);
|
|
||||||
display.stopscroll();
|
|
||||||
}
|
|
||||||
*/
|
|
|
@ -1,9 +0,0 @@
|
||||||
name=Adafruit SH1106-gemu-1.0
|
|
||||||
version=1.0
|
|
||||||
author=Adafruit
|
|
||||||
maintainer=Adafruit <info@adafruit.com>
|
|
||||||
sentence=SH1106
|
|
||||||
paragraph=SH1106
|
|
||||||
category=Display
|
|
||||||
url=
|
|
||||||
architectures=*
|
|
|
@ -357,7 +357,7 @@
|
||||||
// REMOVED - #define USE_DISPLAY_SSD1306 // [DisplayModel 2] Enable SSD1306 Oled 128x64 display (I2C addresses 0x3C and 0x3D) (+16k code)
|
// REMOVED - #define USE_DISPLAY_SSD1306 // [DisplayModel 2] Enable SSD1306 Oled 128x64 display (I2C addresses 0x3C and 0x3D) (+16k code)
|
||||||
#define USE_DISPLAY_MATRIX // [DisplayModel 3] Enable 8x8 Matrix display (I2C adresseses see below) (+11k code)
|
#define USE_DISPLAY_MATRIX // [DisplayModel 3] Enable 8x8 Matrix display (I2C adresseses see below) (+11k code)
|
||||||
#define USE_DISPLAY_SEVENSEG // [DisplayModel 11] [I2cDriver47] Enable sevenseg display (I2C addresses 0x70 - 0x77) (<+11k code)
|
#define USE_DISPLAY_SEVENSEG // [DisplayModel 11] [I2cDriver47] Enable sevenseg display (I2C addresses 0x70 - 0x77) (<+11k code)
|
||||||
#define USE_DISPLAY_SH1106 // [DisplayModel 7] Enable SH1106 Oled 128x64 display (I2C addresses 0x3C and 0x3D)
|
// REMOVED - #define USE_DISPLAY_SH1106 // [DisplayModel 7] Enable SH1106 Oled 128x64 display (I2C addresses 0x3C and 0x3D)
|
||||||
// #define USE_DISPLAY_TM1650 // [DisplayModel 20] [I2cDriver74] Enable TM1650 display (I2C addresses 0x24 - 0x27 and 0x34 - 0x37)
|
// #define USE_DISPLAY_TM1650 // [DisplayModel 20] [I2cDriver74] Enable TM1650 display (I2C addresses 0x24 - 0x27 and 0x34 - 0x37)
|
||||||
|
|
||||||
#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC)
|
#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC)
|
||||||
|
|
|
@ -159,9 +159,10 @@ constexpr uint32_t feature[] = {
|
||||||
#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_EPAPER_29)
|
#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_EPAPER_29)
|
||||||
0x00000800 | // xdsp_05_epaper.ino
|
0x00000800 | // xdsp_05_epaper.ino
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SH1106)
|
// REMOVED
|
||||||
0x00001000 | // xdsp_07_sh1106.ino
|
// #if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SH1106)
|
||||||
#endif
|
// 0x00001000 | // xdsp_07_sh1106.ino
|
||||||
|
// #endif
|
||||||
#ifdef USE_MP3_PLAYER
|
#ifdef USE_MP3_PLAYER
|
||||||
0x00002000 | // xdrv_14_mp3.ino
|
0x00002000 | // xdrv_14_mp3.ino
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,179 +17,182 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef USE_I2C
|
// REMOVED
|
||||||
#ifdef USE_DISPLAY
|
// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay
|
||||||
#ifdef USE_DISPLAY_SH1106
|
|
||||||
|
|
||||||
#define OLED_RESET 4
|
// #ifdef USE_I2C
|
||||||
|
// #ifdef USE_DISPLAY
|
||||||
|
// #ifdef USE_DISPLAY_SH1106
|
||||||
|
|
||||||
#define SPRINT(A) char str[32];sprintf(str,"val: %d ",A);Serial.println((char*)str);
|
// #define OLED_RESET 4
|
||||||
|
|
||||||
|
// #define SPRINT(A) char str[32];sprintf(str,"val: %d ",A);Serial.println((char*)str);
|
||||||
|
|
||||||
|
|
||||||
#define XDSP_07 7
|
// #define XDSP_07 7
|
||||||
#define XI2C_06 6 // See I2CDEVICES.md
|
// #define XI2C_06 6 // See I2CDEVICES.md
|
||||||
|
|
||||||
#define OLED_ADDRESS1 0x3C // Oled 128x32 I2C address
|
// #define OLED_ADDRESS1 0x3C // Oled 128x32 I2C address
|
||||||
#define OLED_ADDRESS2 0x3D // Oled 128x64 I2C address
|
// #define OLED_ADDRESS2 0x3D // Oled 128x64 I2C address
|
||||||
|
|
||||||
#define OLED_BUFFER_COLS 40 // Max number of columns in display shadow buffer
|
// #define OLED_BUFFER_COLS 40 // Max number of columns in display shadow buffer
|
||||||
#define OLED_BUFFER_ROWS 16 // Max number of lines in display shadow buffer
|
// #define OLED_BUFFER_ROWS 16 // Max number of lines in display shadow buffer
|
||||||
|
|
||||||
#define OLED_FONT_WIDTH 6
|
// #define OLED_FONT_WIDTH 6
|
||||||
#define OLED_FONT_HEIGTH 8
|
// #define OLED_FONT_HEIGTH 8
|
||||||
|
|
||||||
#include <Wire.h>
|
// #include <Wire.h>
|
||||||
#include <renderer.h>
|
// #include <renderer.h>
|
||||||
#include <Adafruit_SH1106.h>
|
// #include <Adafruit_SH1106.h>
|
||||||
|
|
||||||
Adafruit_SH1106 *oled1106;
|
// Adafruit_SH1106 *oled1106;
|
||||||
|
|
||||||
/*********************************************************************************************/
|
// /*********************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
void SH1106InitDriver() {
|
// void SH1106InitDriver() {
|
||||||
if (!TasmotaGlobal.i2c_enabled) { return; }
|
// if (!TasmotaGlobal.i2c_enabled) { return; }
|
||||||
|
|
||||||
if (!Settings->display_model) {
|
// if (!Settings->display_model) {
|
||||||
if (I2cSetDevice(OLED_ADDRESS1)) {
|
// if (I2cSetDevice(OLED_ADDRESS1)) {
|
||||||
Settings->display_address[0] = OLED_ADDRESS1;
|
// Settings->display_address[0] = OLED_ADDRESS1;
|
||||||
Settings->display_model = XDSP_07;
|
// Settings->display_model = XDSP_07;
|
||||||
}
|
// }
|
||||||
else if (I2cSetDevice(OLED_ADDRESS2)) {
|
// else if (I2cSetDevice(OLED_ADDRESS2)) {
|
||||||
Settings->display_address[0] = OLED_ADDRESS2;
|
// Settings->display_address[0] = OLED_ADDRESS2;
|
||||||
Settings->display_model = XDSP_07;
|
// Settings->display_model = XDSP_07;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (XDSP_07 == Settings->display_model) {
|
// if (XDSP_07 == Settings->display_model) {
|
||||||
I2cSetActiveFound(Settings->display_address[0], "SH1106");
|
// I2cSetActiveFound(Settings->display_address[0], "SH1106");
|
||||||
|
|
||||||
if (Settings->display_width != SH1106_LCDWIDTH) {
|
// if (Settings->display_width != SH1106_LCDWIDTH) {
|
||||||
Settings->display_width = SH1106_LCDWIDTH;
|
// Settings->display_width = SH1106_LCDWIDTH;
|
||||||
}
|
// }
|
||||||
if (Settings->display_height != SH1106_LCDHEIGHT) {
|
// if (Settings->display_height != SH1106_LCDHEIGHT) {
|
||||||
Settings->display_height = SH1106_LCDHEIGHT;
|
// Settings->display_height = SH1106_LCDHEIGHT;
|
||||||
}
|
// }
|
||||||
// init renderer
|
// // init renderer
|
||||||
oled1106 = new Adafruit_SH1106(SH1106_LCDWIDTH,SH1106_LCDHEIGHT);
|
// oled1106 = new Adafruit_SH1106(SH1106_LCDWIDTH,SH1106_LCDHEIGHT);
|
||||||
renderer = oled1106;
|
// renderer = oled1106;
|
||||||
renderer->Begin(SH1106_SWITCHCAPVCC, Settings->display_address[0],0);
|
// renderer->Begin(SH1106_SWITCHCAPVCC, Settings->display_address[0],0);
|
||||||
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
|
// renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
|
||||||
renderer->setTextColor(1,0);
|
// renderer->setTextColor(1,0);
|
||||||
|
|
||||||
#ifdef SHOW_SPLASH
|
// #ifdef SHOW_SPLASH
|
||||||
if (!Settings->flag5.display_no_splash) {
|
// if (!Settings->flag5.display_no_splash) {
|
||||||
renderer->setTextFont(0);
|
// renderer->setTextFont(0);
|
||||||
renderer->setTextSize(2);
|
// renderer->setTextSize(2);
|
||||||
renderer->setCursor(20,20);
|
// renderer->setCursor(20,20);
|
||||||
renderer->println(F("SH1106"));
|
// renderer->println(F("SH1106"));
|
||||||
renderer->Updateframe();
|
// renderer->Updateframe();
|
||||||
renderer->DisplayOnff(1);
|
// renderer->DisplayOnff(1);
|
||||||
}
|
// }
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("DSP: SH1106"));
|
// AddLog(LOG_LEVEL_INFO, PSTR("DSP: SH1106"));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************************************/
|
// /*********************************************************************************************/
|
||||||
#ifdef USE_DISPLAY_MODES1TO5
|
// #ifdef USE_DISPLAY_MODES1TO5
|
||||||
|
|
||||||
void SH1106PrintLog(void)
|
// void SH1106PrintLog(void)
|
||||||
{
|
// {
|
||||||
disp_refresh--;
|
// disp_refresh--;
|
||||||
if (!disp_refresh) {
|
// if (!disp_refresh) {
|
||||||
disp_refresh = Settings->display_refresh;
|
// disp_refresh = Settings->display_refresh;
|
||||||
if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
|
// if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
|
||||||
|
|
||||||
char* txt = DisplayLogBuffer('\370');
|
// char* txt = DisplayLogBuffer('\370');
|
||||||
if (txt != NULL) {
|
// if (txt != NULL) {
|
||||||
uint8_t last_row = Settings->display_rows -1;
|
// uint8_t last_row = Settings->display_rows -1;
|
||||||
|
|
||||||
renderer->clearDisplay();
|
// renderer->clearDisplay();
|
||||||
renderer->setTextSize(Settings->display_size);
|
// renderer->setTextSize(Settings->display_size);
|
||||||
renderer->setCursor(0,0);
|
// renderer->setCursor(0,0);
|
||||||
for (byte i = 0; i < last_row; i++) {
|
// for (byte i = 0; i < last_row; i++) {
|
||||||
strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
|
// strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
|
||||||
renderer->println(disp_screen_buffer[i]);
|
// renderer->println(disp_screen_buffer[i]);
|
||||||
}
|
// }
|
||||||
strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
|
// strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
|
||||||
DisplayFillScreen(last_row);
|
// DisplayFillScreen(last_row);
|
||||||
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]);
|
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]);
|
||||||
|
|
||||||
renderer->println(disp_screen_buffer[last_row]);
|
// renderer->println(disp_screen_buffer[last_row]);
|
||||||
renderer->Updateframe();
|
// renderer->Updateframe();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
void SH1106Time(void)
|
// void SH1106Time(void)
|
||||||
{
|
// {
|
||||||
char line[12];
|
// char line[12];
|
||||||
|
|
||||||
renderer->clearDisplay();
|
// renderer->clearDisplay();
|
||||||
renderer->setTextSize(Settings->display_size);
|
// renderer->setTextSize(Settings->display_size);
|
||||||
renderer->setTextFont(Settings->display_font);
|
// renderer->setTextFont(Settings->display_font);
|
||||||
renderer->setCursor(0, 0);
|
// renderer->setCursor(0, 0);
|
||||||
snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ]
|
// snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ]
|
||||||
renderer->println(line);
|
// renderer->println(line);
|
||||||
renderer->println();
|
// renderer->println();
|
||||||
snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018]
|
// snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018]
|
||||||
renderer->println(line);
|
// renderer->println(line);
|
||||||
renderer->Updateframe();
|
// renderer->Updateframe();
|
||||||
}
|
// }
|
||||||
|
|
||||||
void SH1106Refresh(void) // Every second
|
// void SH1106Refresh(void) // Every second
|
||||||
{
|
// {
|
||||||
if (!renderer) return;
|
// if (!renderer) return;
|
||||||
if (Settings->display_mode) { // Mode 0 is User text
|
// if (Settings->display_mode) { // Mode 0 is User text
|
||||||
switch (Settings->display_mode) {
|
// switch (Settings->display_mode) {
|
||||||
case 1: // Time
|
// case 1: // Time
|
||||||
SH1106Time();
|
// SH1106Time();
|
||||||
break;
|
// break;
|
||||||
case 2: // Local
|
// case 2: // Local
|
||||||
case 3: // Local
|
// case 3: // Local
|
||||||
case 4: // Mqtt
|
// case 4: // Mqtt
|
||||||
case 5: // Mqtt
|
// case 5: // Mqtt
|
||||||
SH1106PrintLog();
|
// SH1106PrintLog();
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
#endif // USE_DISPLAY_MODES1TO5
|
// #endif // USE_DISPLAY_MODES1TO5
|
||||||
|
|
||||||
/*********************************************************************************************\
|
// /*********************************************************************************************\
|
||||||
* Interface
|
// * Interface
|
||||||
\*********************************************************************************************/
|
// \*********************************************************************************************/
|
||||||
|
|
||||||
bool Xdsp07(uint32_t function)
|
// bool Xdsp07(uint32_t function)
|
||||||
{
|
// {
|
||||||
if (!I2cEnabled(XI2C_06)) { return false; }
|
// if (!I2cEnabled(XI2C_06)) { return false; }
|
||||||
|
|
||||||
bool result = false;
|
// bool result = false;
|
||||||
|
|
||||||
if (FUNC_DISPLAY_INIT_DRIVER == function) {
|
// if (FUNC_DISPLAY_INIT_DRIVER == function) {
|
||||||
SH1106InitDriver();
|
// SH1106InitDriver();
|
||||||
}
|
// }
|
||||||
else if (XDSP_07 == Settings->display_model) {
|
// else if (XDSP_07 == Settings->display_model) {
|
||||||
|
|
||||||
switch (function) {
|
// switch (function) {
|
||||||
case FUNC_DISPLAY_MODEL:
|
// case FUNC_DISPLAY_MODEL:
|
||||||
result = true;
|
// result = true;
|
||||||
break;
|
// break;
|
||||||
#ifdef USE_DISPLAY_MODES1TO5
|
// #ifdef USE_DISPLAY_MODES1TO5
|
||||||
case FUNC_DISPLAY_EVERY_SECOND:
|
// case FUNC_DISPLAY_EVERY_SECOND:
|
||||||
SH1106Refresh();
|
// SH1106Refresh();
|
||||||
break;
|
// break;
|
||||||
#endif // USE_DISPLAY_MODES1TO5
|
// #endif // USE_DISPLAY_MODES1TO5
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
|
|
||||||
#endif // USE_DISPLAY_SH1106
|
// #endif // USE_DISPLAY_SH1106
|
||||||
#endif // USE_DISPLAY
|
// #endif // USE_DISPLAY
|
||||||
#endif // USE_I2C
|
// #endif // USE_I2C
|
||||||
|
|
Loading…
Reference in New Issue