-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5e3ce7b
commit 331eccc
Showing
6 changed files
with
475 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,325 @@ | ||
#include <Wire.h> | ||
#include "OLED.h" | ||
|
||
//==========================================================// | ||
|
||
// Small 8x8 font | ||
static const char myFont[][8] PROGMEM = { | ||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00}, | ||
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00}, | ||
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00}, | ||
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00}, | ||
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00}, | ||
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00}, | ||
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00}, | ||
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00}, | ||
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00}, | ||
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00}, | ||
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00}, | ||
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00}, | ||
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00}, | ||
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00}, | ||
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00}, | ||
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00}, | ||
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00}, | ||
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00}, | ||
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00}, | ||
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00}, | ||
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00}, | ||
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00}, | ||
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00}, | ||
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00}, | ||
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00}, | ||
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00}, | ||
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00}, | ||
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00}, | ||
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00}, | ||
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00}, | ||
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00}, | ||
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00}, | ||
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00}, | ||
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00}, | ||
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00}, | ||
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00}, | ||
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00}, | ||
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00}, | ||
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00}, | ||
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00}, | ||
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00}, | ||
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00}, | ||
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00}, | ||
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00}, | ||
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00}, | ||
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00}, | ||
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00}, | ||
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00}, | ||
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00}, | ||
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00}, | ||
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00}, | ||
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00}, | ||
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00}, | ||
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00}, | ||
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00}, | ||
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00}, | ||
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00}, | ||
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00}, | ||
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00}, | ||
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00}, | ||
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00}, | ||
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00}, | ||
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00}, | ||
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00}, | ||
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00}, | ||
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00}, | ||
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00}, | ||
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00}, | ||
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00}, | ||
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00}, | ||
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00}, | ||
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00}, | ||
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00}, | ||
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00}, | ||
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00}, | ||
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00}, | ||
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00}, | ||
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00}, | ||
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00}, | ||
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00}, | ||
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00}, | ||
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00}, | ||
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00}, | ||
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00}, | ||
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00}, | ||
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00}, | ||
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00}, | ||
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00}, | ||
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00}, | ||
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00}, | ||
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00} | ||
}; | ||
|
||
|
||
//==========================================================// | ||
// Resets display depending on the actual mode. | ||
void OLED::reset_display(void) | ||
{ | ||
displayOff(); | ||
clear_display(); | ||
displayOn(); | ||
} | ||
|
||
//==========================================================// | ||
// Turns display on. | ||
void OLED::displayOn(void) | ||
{ | ||
sendcommand(0xaf); //display on | ||
} | ||
|
||
//==========================================================// | ||
// Turns display off. | ||
void OLED::displayOff(void) | ||
{ | ||
sendcommand(0xae); //display off | ||
} | ||
|
||
//==========================================================// | ||
// Clears the display by sendind 0 to all the screen map. | ||
void OLED::clear_display(void) | ||
{ | ||
unsigned char i,k; | ||
for(k=0;k<8;k++) | ||
{ | ||
setXY(k,0); | ||
{ | ||
for(i=0;i<(128 + 2 * _offset);i++) //locate all COL | ||
{ | ||
SendChar(0); //clear all COL | ||
//delay(10); | ||
} | ||
} | ||
} | ||
} | ||
|
||
//==========================================================// | ||
// Actually this sends a byte, not a char to draw in the display. | ||
// Display's chars uses 8 byte font the small ones and 96 bytes | ||
// for the big number font. | ||
void OLED::SendChar(unsigned char data) | ||
{ | ||
//if (interrupt && !doing_menu) return; // Stop printing only if interrupt is call but not in button functions | ||
|
||
Wire.beginTransmission(_address); // begin transmitting | ||
Wire.write(0x40);//data mode | ||
Wire.write(data); | ||
Wire.endTransmission(); // stop transmitting | ||
} | ||
|
||
//==========================================================// | ||
// Prints a display char (not just a byte) in coordinates X Y, | ||
// being multiples of 8. This means we have 16 COLS (0-15) | ||
// and 8 ROWS (0-7). | ||
void OLED::sendCharXY(unsigned char data, int X, int Y) | ||
{ | ||
setXY(X, Y); | ||
Wire.beginTransmission(_address); // begin transmitting | ||
Wire.write(0x40);//data mode | ||
|
||
for(int i=0;i<8;i++) | ||
Wire.write(pgm_read_byte(myFont[data-0x20]+i)); | ||
|
||
Wire.endTransmission(); // stop transmitting | ||
} | ||
|
||
//==========================================================// | ||
// Used to send commands to the display. | ||
void OLED::sendcommand(unsigned char com) | ||
{ | ||
Wire.beginTransmission(_address); //begin transmitting | ||
Wire.write(0x80); //command mode | ||
Wire.write(com); | ||
Wire.endTransmission(); // stop transmitting | ||
} | ||
|
||
//==========================================================// | ||
// Set the cursor position in a 16 COL * 8 ROW map. | ||
void OLED::setXY(unsigned char row,unsigned char col) | ||
{ | ||
sendcommand(0xb0+row); //set page address | ||
sendcommand(_offset+(8*col&0x0f)); //set low col address | ||
sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address | ||
} | ||
|
||
|
||
//==========================================================// | ||
// Prints a string regardless the cursor position. | ||
void OLED::sendStr(unsigned char *string) | ||
{ | ||
unsigned char i=0; | ||
while(*string) | ||
{ | ||
for(i=0;i<8;i++) | ||
{ | ||
SendChar(pgm_read_byte(myFont[*string-0x20]+i)); | ||
} | ||
*string++; | ||
} | ||
} | ||
|
||
//==========================================================// | ||
// Prints a string in coordinates X Y, being multiples of 8. | ||
// This means we have 16 COLS (0-15) and 8 ROWS (0-7). | ||
void OLED::sendStrXY( const char *string, int X, int Y) | ||
{ | ||
setXY(X,Y); | ||
unsigned char i=0; | ||
while(*string) | ||
{ | ||
for(i=0;i<8;i++) | ||
{ | ||
SendChar(pgm_read_byte(myFont[*string-0x20]+i)); | ||
} | ||
*string++; | ||
} | ||
} | ||
|
||
|
||
//==========================================================// | ||
// Inits oled and draws logo at startup | ||
void OLED::init_OLED(void) | ||
{ | ||
sendcommand(0xae); //display off | ||
sendcommand(0xa6); //Set Normal Display (default) | ||
// Adafruit Init sequence for 128x64 OLED module | ||
sendcommand(0xAE); //DISPLAYOFF | ||
sendcommand(0xD5); //SETDISPLAYCLOCKDIV | ||
sendcommand(0x80); // the suggested ratio 0x80 | ||
sendcommand(0xA8); //SSD1306_SETMULTIPLEX | ||
sendcommand(0x3F); | ||
sendcommand(0xD3); //SETDISPLAYOFFSET | ||
sendcommand(0x0); //no offset | ||
sendcommand(0x40 | 0x0); //SETSTARTLINE | ||
sendcommand(0x8D); //CHARGEPUMP | ||
sendcommand(0x14); | ||
sendcommand(0x20); //MEMORYMODE | ||
sendcommand(0x00); //0x0 act like ks0108 | ||
|
||
//sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg | ||
sendcommand(0xA0); | ||
|
||
//sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg | ||
sendcommand(0xC0); | ||
|
||
sendcommand(0xDA); //0xDA | ||
sendcommand(0x12); //COMSCANDEC | ||
sendcommand(0x81); //SETCONTRAS | ||
sendcommand(0xCF); // | ||
sendcommand(0xd9); //SETPRECHARGE | ||
sendcommand(0xF1); | ||
sendcommand(0xDB); //SETVCOMDETECT | ||
sendcommand(0x40); | ||
sendcommand(0xA4); //DISPLAYALLON_RESUME | ||
sendcommand(0xA6); //NORMALDISPLAY | ||
|
||
clear_display(); | ||
sendcommand(0x2e); // stop scroll | ||
//----------------------------REVERSE comments----------------------------// | ||
sendcommand(0xa0); //seg re-map 0->127(default) | ||
sendcommand(0xa1); //seg re-map 127->0 | ||
sendcommand(0xc8); | ||
delay(1000); | ||
//----------------------------REVERSE comments----------------------------// | ||
// sendcommand(0xa7); //Set Inverse Display | ||
// sendcommand(0xae); //display off | ||
sendcommand(0x20); //Set Memory Addressing Mode | ||
sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode | ||
// sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET) | ||
} | ||
|
||
|
||
//==========================================================// | ||
|
||
|
||
OLED::OLED(uint8_t sda, uint8_t scl, uint8_t address, uint8_t offset) { | ||
_sda = sda; | ||
_scl = scl; | ||
_address = address; | ||
_offset = offset; | ||
} | ||
|
||
void OLED::begin(void) { | ||
// set up i2c | ||
Wire.begin(_sda, _scl); | ||
init_OLED(); | ||
reset_display(); | ||
} | ||
|
||
void OLED::on(void) { | ||
DEBUG_PRINTLN("on"); | ||
displayOn(); | ||
} | ||
|
||
void OLED::off(void) { | ||
DEBUG_PRINTLN("off"); | ||
displayOff(); | ||
} | ||
|
||
void OLED::clear(void) { | ||
DEBUG_PRINTLN("clear"); | ||
clear_display(); | ||
} | ||
|
||
void OLED::print(char *s, uint8_t r, uint8_t c) { | ||
DEBUG_PRINT("print "); | ||
DEBUG_PRINT(r); | ||
DEBUG_PRINT(","); | ||
DEBUG_PRINT(c); | ||
DEBUG_PRINT(" "); | ||
DEBUG_PRINTLN(s); | ||
sendStrXY(s, r, c); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
#ifndef OLED_H | ||
#define OLED_H | ||
|
||
#if ARDUINO >= 100 | ||
#include "Arduino.h" | ||
#else | ||
#include "WProgram.h" | ||
#endif | ||
|
||
// Uncomment to enable printing out nice debug messages. | ||
//#define OLED_DEBUG | ||
|
||
// Define where debug output will be printed. | ||
#define DEBUG_PRINTER Serial | ||
|
||
// Setup debug printing macros. | ||
#ifdef OLED_DEBUG | ||
#define DEBUG_PRINT(...) { DEBUG_PRINTER.print(__VA_ARGS__); } | ||
#define DEBUG_PRINTLN(...) { DEBUG_PRINTER.println(__VA_ARGS__); } | ||
#else | ||
#define DEBUG_PRINT(...) {} | ||
#define DEBUG_PRINTLN(...) {} | ||
#endif | ||
|
||
class OLED { | ||
public: | ||
OLED(uint8_t sda, uint8_t scl, uint8_t address=0x3c, uint8_t offset=0); | ||
void begin(void); | ||
void on(void); | ||
void off(void); | ||
void clear(void); | ||
void print(char *s, uint8_t r=0, uint8_t c=0); | ||
|
||
private: | ||
uint8_t _sda, _scl, _address, _offset; | ||
void reset_display(void); | ||
void displayOn(void); | ||
void displayOff(void); | ||
void clear_display(void); | ||
void SendChar(unsigned char data); | ||
void sendCharXY(unsigned char data, int X, int Y); | ||
void sendcommand(unsigned char com); | ||
void setXY(unsigned char row,unsigned char col); | ||
void sendStr(unsigned char *string); | ||
void sendStrXY( const char *string, int X, int Y); | ||
void init_OLED(void); | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
This is an [esp8266-Arduino](https://github.com/sandeepmistry/esp8266-Arduino) library for I2C-OLED displays. | ||
|
||
## Credits | ||
|
||
Original code was taken from [ESP8266-I2C-OLED](https://github.com/costonisp/ESP8266-I2C-OLED) project and was modified in form of library for [Arduino IDE](https://www.arduino.cc/en/Main/Software) for ESP8266. | ||
|
||
## Installation | ||
|
||
- Click on the *Download ZIP* button in the top right corner. | ||
- Uncompress it. | ||
- Rename the uncompressed folder OLED. | ||
- Check that the OLED folder contains OLED.cpp and OLED.h files. | ||
- Place the OLED folder in your <arduinosketchfolder>/libraries/ folder - you may need to create the libraries subfolder if its your first library. | ||
- Restart the IDE. |
Oops, something went wrong.