esp32-warm-water
esp32 based project for the control of a heating element based on temperature
ssd1306.h
Go to the documentation of this file.
1 /*
2  * MIT License
3  *
4  * Copyright (c) 2020 nopnop2002
5  * Copyright (c) 2021 wolffshots
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25 
31 #ifndef MAIN_SSD1306_H
32 #define MAIN_SSD1306_H
33 
34 #include "driver/spi_master.h"
35 
36 // Following definitions are bollowed from
37 // http://robotcantalk.blogspot.com/2015/03/interfacing-arduino-with-ssd1306-driven.html
38 
39 /* Control byte for i2c
40 Co : bit 8 : Continuation Bit
41  * 1 = no-continuation (only one byte to follow)
42  * 0 = the controller should expect a stream of bytes.
43 D/C# : bit 7 : Data/Command Select bit
44  * 1 = the next byte or byte stream will be Data.
45  * 0 = a Command byte or byte stream will be coming up next.
46  Bits 6-0 will be all zeros.
47 Usage:
48 0x80 : Single Command byte
49 0x00 : Command Stream
50 0xC0 : Single Data byte
51 0x40 : Data Stream
52 */
53 #define OLED_CONTROL_BYTE_CMD_SINGLE 0x80
54 #define OLED_CONTROL_BYTE_CMD_STREAM 0x00
55 #define OLED_CONTROL_BYTE_DATA_SINGLE 0xC0
56 #define OLED_CONTROL_BYTE_DATA_STREAM 0x40
57 
58 // Fundamental commands (pg.28)
59 #define OLED_CMD_SET_CONTRAST 0x81 // follow with 0x7F
60 #define OLED_CMD_DISPLAY_RAM 0xA4
61 #define OLED_CMD_DISPLAY_ALLON 0xA5
62 #define OLED_CMD_DISPLAY_NORMAL 0xA6
63 #define OLED_CMD_DISPLAY_INVERTED 0xA7
64 #define OLED_CMD_DISPLAY_OFF 0xAE
65 #define OLED_CMD_DISPLAY_ON 0xAF
66 
67 // Addressing Command Table (pg.30)
68 #define OLED_CMD_SET_MEMORY_ADDR_MODE 0x20
69 #define OLED_CMD_SET_HORI_ADDR_MODE 0x00 // Horizontal Addressing Mode
70 #define OLED_CMD_SET_VERT_ADDR_MODE 0x01 // Vertical Addressing Mode
71 #define OLED_CMD_SET_PAGE_ADDR_MODE 0x02 // Page Addressing Mode
72 #define OLED_CMD_SET_COLUMN_RANGE 0x21 // can be used only in HORZ/VERT mode - follow with 0x00 and 0x7F = COL127
73 #define OLED_CMD_SET_PAGE_RANGE 0x22 // can be used only in HORZ/VERT mode - follow with 0x00 and 0x07 = PAGE7
74 
75 // Hardware Config (pg.31)
76 #define OLED_CMD_SET_DISPLAY_START_LINE 0x40
77 #define OLED_CMD_SET_SEGMENT_REMAP_0 0xA0
78 #define OLED_CMD_SET_SEGMENT_REMAP_1 0xA1
79 #define OLED_CMD_SET_MUX_RATIO 0xA8 // follow with 0x3F = 64 MUX
80 #define OLED_CMD_SET_COM_SCAN_MODE 0xC8
81 #define OLED_CMD_SET_DISPLAY_OFFSET 0xD3 // follow with 0x00
82 #define OLED_CMD_SET_COM_PIN_MAP 0xDA // follow with 0x12
83 #define OLED_CMD_NOP 0xE3 // NOP
84 
85 // Timing and Driving Scheme (pg.32)
86 #define OLED_CMD_SET_DISPLAY_CLK_DIV 0xD5 // follow with 0x80
87 #define OLED_CMD_SET_PRECHARGE 0xD9 // follow with 0xF1
88 #define OLED_CMD_SET_VCOMH_DESELCT 0xDB // follow with 0x30
89 
90 // Charge Pump (pg.62)
91 #define OLED_CMD_SET_CHARGE_PUMP 0x8D // follow with 0x14
92 
93 // Scrolling Command
94 #define OLED_CMD_HORIZONTAL_RIGHT 0x26
95 #define OLED_CMD_HORIZONTAL_LEFT 0x27
96 #define OLED_CMD_CONTINUOUS_SCROLL 0x29
97 #define OLED_CMD_DEACTIVE_SCROLL 0x2E
98 #define OLED_CMD_ACTIVE_SCROLL 0x2F
99 #define OLED_CMD_VERTICAL 0xA3
100 
101 #define I2CAddress 0x3C
102 #define SPIAddress 0xFF
103 
104 typedef enum
105 {
110  SCROLL_STOP = 5
112 
113 typedef struct
114 {
115  bool _valid;
116  int _segLen; // 0-128
117  uint8_t _segs[128];
118 } PAGE_t;
119 
120 typedef struct
121 {
122  int _address;
123  int _width;
124  int _height;
125  int _pages;
126  int _dc;
127  spi_device_handle_t _SPIHandle;
128  bool _scEnable;
129  int _scStart;
130  int _scEnd;
132  PAGE_t _page[8];
133  bool _flip;
134 } SSD1306_t;
135 
136 void ssd1306_init(SSD1306_t *dev);
138 void ssd1306_display_text(SSD1306_t *dev, int page, char *text, int text_len, bool invert);
139 void ssd1306_wrapped_display_text(SSD1306_t *dev, int line, char *text);
140 void ssd1306_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width);
141 void ssd1306_clear_screen(SSD1306_t *dev, bool invert);
142 void ssd1306_clear_line(SSD1306_t *dev, int page, bool invert);
143 void ssd1306_contrast(SSD1306_t *dev, int contrast);
144 void ssd1306_software_scroll(SSD1306_t *dev, int start, int end);
145 void ssd1306_scroll_text(SSD1306_t *dev, char *text, int text_len, bool invert);
149 void ssd1306_invert(uint8_t *buf, size_t blen);
150 void ssd1306_flip(uint8_t *buf, size_t blen);
151 uint8_t ssd1306_rotate(uint8_t ch1);
154 
155 void i2c_master_init(SSD1306_t *dev, int16_t sda, int16_t scl, int16_t reset);
156 void i2c_init(SSD1306_t *dev, int width, int height);
157 void i2c_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width);
158 void i2c_contrast(SSD1306_t *dev, int contrast);
161 
162 void spi_master_init(SSD1306_t *dev, int16_t GPIO_MOSI, int16_t GPIO_SCLK, int16_t GPIO_CS, int16_t GPIO_DC, int16_t GPIO_RESET);
163 bool spi_master_write_byte(spi_device_handle_t SPIHandle, const uint8_t *Data, size_t DataLength);
164 bool spi_master_write_command(SSD1306_t *dev, uint8_t Command);
165 bool spi_master_write_data(SSD1306_t *dev, const uint8_t *Data, size_t DataLength);
166 void spi_init(SSD1306_t *dev, int width, int height);
167 void spi_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width);
168 void spi_contrast(SSD1306_t *dev, int contrast);
171 
172 #endif /* MAIN_SSD1306_H */
SSD1306_t dev
device for oled
Definition: main.c:81
void ssd1306_contrast(SSD1306_t *dev, int contrast)
Definition: ssd1306.c:201
ssd1306_scroll_type_t
Definition: ssd1306.h:105
@ SCROLL_STOP
Definition: ssd1306.h:110
@ SCROLL_LEFT
Definition: ssd1306.h:107
@ SCROLL_DOWN
Definition: ssd1306.h:108
@ SCROLL_RIGHT
Definition: ssd1306.h:106
@ SCROLL_UP
Definition: ssd1306.h:109
void ssd1306_software_scroll(SSD1306_t *dev, int start, int end)
Definition: ssd1306.c:218
void ssd1306_hardware_scroll_line(SSD1306_t *dev, int page, ssd1306_scroll_type_t scroll)
Definition: ssd1306.c:351
void i2c_contrast(SSD1306_t *dev, int contrast)
Definition: ssd1306_i2c.c:211
void spi_hardware_scroll(SSD1306_t *dev, ssd1306_scroll_type_t scroll)
Definition: ssd1306_spi.c:275
void ssd1306_deinit(SSD1306_t *dev)
Definition: ssd1306.c:100
void ssd1306_wrapped_display_text(SSD1306_t *dev, int line, char *text)
Definition: ssd1306.c:146
void i2c_master_init(SSD1306_t *dev, int16_t sda, int16_t scl, int16_t reset)
Definition: ssd1306_i2c.c:50
void spi_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width)
Definition: ssd1306_spi.c:226
void spi_master_init(SSD1306_t *dev, int16_t GPIO_MOSI, int16_t GPIO_SCLK, int16_t GPIO_CS, int16_t GPIO_DC, int16_t GPIO_RESET)
Definition: ssd1306_spi.c:65
bool spi_master_write_data(SSD1306_t *dev, const uint8_t *Data, size_t DataLength)
Definition: ssd1306_spi.c:153
bool spi_master_write_command(SSD1306_t *dev, uint8_t Command)
Definition: ssd1306_spi.c:139
void ssd1306_flip(uint8_t *buf, size_t blen)
Definition: ssd1306.c:383
void ssd1306_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width)
Definition: ssd1306.c:159
void spi_hardware_scroll_line(SSD1306_t *dev, int page, ssd1306_scroll_type_t scroll)
Definition: ssd1306_spi.c:352
uint8_t ssd1306_rotate(uint8_t ch1)
Definition: ssd1306.c:398
void ssd1306_fadeout(SSD1306_t *dev)
Definition: ssd1306.c:412
void spi_init(SSD1306_t *dev, int width, int height)
Definition: ssd1306_spi.c:165
void ssd1306_scroll_text(SSD1306_t *dev, char *text, int text_len, bool invert)
Definition: ssd1306.c:251
void ssd1306_invert(uint8_t *buf, size_t blen)
Definition: ssd1306.c:367
void i2c_init(SSD1306_t *dev, int width, int height)
Definition: ssd1306_i2c.c:80
void ssd1306_hardware_scroll(SSD1306_t *dev, ssd1306_scroll_type_t scroll)
Definition: ssd1306.c:334
void spi_contrast(SSD1306_t *dev, int contrast)
Definition: ssd1306_spi.c:258
void i2c_hardware_scroll_line(SSD1306_t *dev, int page, ssd1306_scroll_type_t scroll)
Definition: ssd1306_i2c.c:335
void ssd1306_init(SSD1306_t *dev)
Definition: ssd1306.c:53
bool spi_master_write_byte(spi_device_handle_t SPIHandle, const uint8_t *Data, size_t DataLength)
Definition: ssd1306_spi.c:119
void ssd1306_clear_line(SSD1306_t *dev, int page, bool invert)
Definition: ssd1306.c:190
void i2c_display_image(SSD1306_t *dev, int page, int seg, uint8_t *images, int width)
Definition: ssd1306_i2c.c:159
void ssd1306_display_text(SSD1306_t *dev, int page, char *text, int text_len, bool invert)
Definition: ssd1306.c:112
void ssd1306_scroll_clear(SSD1306_t *dev)
Definition: ssd1306.c:311
void i2c_hardware_scroll(SSD1306_t *dev, ssd1306_scroll_type_t scroll)
Definition: ssd1306_i2c.c:236
void ssd1306_dump(SSD1306_t dev)
Definition: ssd1306.c:449
void ssd1306_clear_screen(SSD1306_t *dev, bool invert)
Definition: ssd1306.c:175
int _segLen
Definition: ssd1306.h:116
bool _valid
Definition: ssd1306.h:115
int _scEnd
Definition: ssd1306.h:130
int _address
Definition: ssd1306.h:122
int _scStart
Definition: ssd1306.h:129
int _pages
Definition: ssd1306.h:125
bool _flip
Definition: ssd1306.h:133
int _dc
Definition: ssd1306.h:126
spi_device_handle_t _SPIHandle
Definition: ssd1306.h:127
int _height
Definition: ssd1306.h:124
int _scDirection
Definition: ssd1306.h:131
bool _scEnable
Definition: ssd1306.h:128
int _width
Definition: ssd1306.h:123