Nucleo_SSD1306_DS1302_ESP8266_AM2320_BME280

Dependencies:   AM2320 AutomationElements BME280 DS1302 ESP8266 mbed

Committer:
dadangjia
Date:
Thu May 11 16:57:18 2017 +0000
Revision:
0:5f61200516d7
OK

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dadangjia 0:5f61200516d7 1 /* ============================================
dadangjia 0:5f61200516d7 2 Modified Code from Crius
dadangjia 0:5f61200516d7 3 The CriusOLED Hardware MUST be modified for correct function of ACK
dadangjia 0:5f61200516d7 4 Copyright (c) 2014 Michael Ruck michael@ruck.com
dadangjia 0:5f61200516d7 5
dadangjia 0:5f61200516d7 6 Permission is hereby granted, free of charge, to any person obtaining a copy
dadangjia 0:5f61200516d7 7 of this software and associated documentation files (the "Software"), to deal
dadangjia 0:5f61200516d7 8 in the Software without restriction, including without limitation the rights
dadangjia 0:5f61200516d7 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dadangjia 0:5f61200516d7 10 copies of the Software, and to permit persons to whom the Software is
dadangjia 0:5f61200516d7 11 furnished to do so, subject to the following conditions:
dadangjia 0:5f61200516d7 12
dadangjia 0:5f61200516d7 13 The above copyright notice and this permission notice shall be included in
dadangjia 0:5f61200516d7 14 all copies or substantial portions of the Software.
dadangjia 0:5f61200516d7 15
dadangjia 0:5f61200516d7 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dadangjia 0:5f61200516d7 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dadangjia 0:5f61200516d7 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dadangjia 0:5f61200516d7 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dadangjia 0:5f61200516d7 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dadangjia 0:5f61200516d7 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dadangjia 0:5f61200516d7 22 THE SOFTWARE.
dadangjia 0:5f61200516d7 23 ===============================================
dadangjia 0:5f61200516d7 24 */
dadangjia 0:5f61200516d7 25 #include "./data.h"
dadangjia 0:5f61200516d7 26 #define OLED_ADDR (0x78)
dadangjia 0:5f61200516d7 27
dadangjia 0:5f61200516d7 28 I2C i2c(I2C_SDA, I2C_SCL);
dadangjia 0:5f61200516d7 29
dadangjia 0:5f61200516d7 30 void displayOn(void);
dadangjia 0:5f61200516d7 31 void displayOff(void);
dadangjia 0:5f61200516d7 32 void SendByte(unsigned char data);
dadangjia 0:5f61200516d7 33 void sendcommand(unsigned char com);
dadangjia 0:5f61200516d7 34 void SendByte(unsigned char com);
dadangjia 0:5f61200516d7 35 void printBigNumber(unsigned char s, int X, int Y);
dadangjia 0:5f61200516d7 36 void SendByteXY(unsigned char data, int X, int Y);
dadangjia 0:5f61200516d7 37
dadangjia 0:5f61200516d7 38
dadangjia 0:5f61200516d7 39 //==========================================================//
dadangjia 0:5f61200516d7 40 // Turns display on.
dadangjia 0:5f61200516d7 41 void displayOn(void)
dadangjia 0:5f61200516d7 42 {
dadangjia 0:5f61200516d7 43 sendcommand(0xaf); //display on
dadangjia 0:5f61200516d7 44 }
dadangjia 0:5f61200516d7 45
dadangjia 0:5f61200516d7 46 //==========================================================//
dadangjia 0:5f61200516d7 47 // Turns display off.
dadangjia 0:5f61200516d7 48 void displayOff(void)
dadangjia 0:5f61200516d7 49 {
dadangjia 0:5f61200516d7 50 sendcommand(0xae); //display off
dadangjia 0:5f61200516d7 51 }
dadangjia 0:5f61200516d7 52 //==========================================================//
dadangjia 0:5f61200516d7 53 // Actually this sends a byte, not a char to draw in the display.
dadangjia 0:5f61200516d7 54 // Display's chars uses 8 byte font the small ones and 96 bytes
dadangjia 0:5f61200516d7 55 // for the big number font.
dadangjia 0:5f61200516d7 56 void SendByte(unsigned char data)
dadangjia 0:5f61200516d7 57 {
dadangjia 0:5f61200516d7 58 //Create a temporary buffer
dadangjia 0:5f61200516d7 59 char buff[2];
dadangjia 0:5f61200516d7 60
dadangjia 0:5f61200516d7 61 //Load the control byte and 8-bit data
dadangjia 0:5f61200516d7 62 buff[0] = (0x40);
dadangjia 0:5f61200516d7 63 buff[1] = data;
dadangjia 0:5f61200516d7 64
dadangjia 0:5f61200516d7 65 //Write the data
dadangjia 0:5f61200516d7 66 i2c.write(OLED_ADDR, buff, 2);
dadangjia 0:5f61200516d7 67
dadangjia 0:5f61200516d7 68 }
dadangjia 0:5f61200516d7 69
dadangjia 0:5f61200516d7 70 //==========================================================//
dadangjia 0:5f61200516d7 71 // Used to send commands to the display.
dadangjia 0:5f61200516d7 72 void sendcommand(unsigned char com)
dadangjia 0:5f61200516d7 73 {
dadangjia 0:5f61200516d7 74 //Create a temporary buffer
dadangjia 0:5f61200516d7 75 char buff[2];
dadangjia 0:5f61200516d7 76
dadangjia 0:5f61200516d7 77 //Load the control byte and 8-bit command
dadangjia 0:5f61200516d7 78 buff[0] = 0x00;
dadangjia 0:5f61200516d7 79 buff[1] = com;
dadangjia 0:5f61200516d7 80
dadangjia 0:5f61200516d7 81 //Write the command
dadangjia 0:5f61200516d7 82 i2c.write(OLED_ADDR, buff, 2);
dadangjia 0:5f61200516d7 83 }
dadangjia 0:5f61200516d7 84 //==========================================================//
dadangjia 0:5f61200516d7 85 // Set the cursor position in a 16 COL * 8 ROW map.
dadangjia 0:5f61200516d7 86 void setXY(unsigned char row,unsigned char col)
dadangjia 0:5f61200516d7 87 {
dadangjia 0:5f61200516d7 88 sendcommand(0xb0+row); //set page address
dadangjia 0:5f61200516d7 89 sendcommand(0x00+(8*col&0x0f)); //set low col address
dadangjia 0:5f61200516d7 90 sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address
dadangjia 0:5f61200516d7 91 }
dadangjia 0:5f61200516d7 92 //==========================================================//
dadangjia 0:5f61200516d7 93 // Clears the display by sendind 0 to all the screen map.
dadangjia 0:5f61200516d7 94 void clear_display(void)
dadangjia 0:5f61200516d7 95 {
dadangjia 0:5f61200516d7 96 unsigned char i,k;
dadangjia 0:5f61200516d7 97 for(k=0; k<8; k++) {
dadangjia 0:5f61200516d7 98 setXY(k,0);
dadangjia 0:5f61200516d7 99 {
dadangjia 0:5f61200516d7 100 for(i=0; i<128; i++) { //clear all COL
dadangjia 0:5f61200516d7 101 SendByte(0); //clear all COL
dadangjia 0:5f61200516d7 102 //delay(10);
dadangjia 0:5f61200516d7 103 }
dadangjia 0:5f61200516d7 104 }
dadangjia 0:5f61200516d7 105 }
dadangjia 0:5f61200516d7 106 }
dadangjia 0:5f61200516d7 107 //==========================================================//
dadangjia 0:5f61200516d7 108 // Resets display depending on the actual mode.
dadangjia 0:5f61200516d7 109 void reset_display(void)
dadangjia 0:5f61200516d7 110 {
dadangjia 0:5f61200516d7 111 displayOff();
dadangjia 0:5f61200516d7 112 clear_display();
dadangjia 0:5f61200516d7 113
dadangjia 0:5f61200516d7 114
dadangjia 0:5f61200516d7 115 displayOn();
dadangjia 0:5f61200516d7 116 }
dadangjia 0:5f61200516d7 117 //==========================================================//
dadangjia 0:5f61200516d7 118
dadangjia 0:5f61200516d7 119 void sendImage()
dadangjia 0:5f61200516d7 120 {
dadangjia 0:5f61200516d7 121 reset_display();
dadangjia 0:5f61200516d7 122 for(int i=0; i<128*8; i++) // show 128* 64 Logo
dadangjia 0:5f61200516d7 123 SendByte(logo[i]);
dadangjia 0:5f61200516d7 124
dadangjia 0:5f61200516d7 125 }
dadangjia 0:5f61200516d7 126 //==========================================================//
dadangjia 0:5f61200516d7 127 void printBigTime(char *s)
dadangjia 0:5f61200516d7 128 {
dadangjia 0:5f61200516d7 129
dadangjia 0:5f61200516d7 130 int Y=0;
dadangjia 0:5f61200516d7 131 int lon = strlen(s);
dadangjia 0:5f61200516d7 132 if(lon == 3) {
dadangjia 0:5f61200516d7 133 Y = 0;
dadangjia 0:5f61200516d7 134 } else if (lon == 2) {
dadangjia 0:5f61200516d7 135 Y = 3;
dadangjia 0:5f61200516d7 136 } else if (lon == 1) {
dadangjia 0:5f61200516d7 137 Y = 6;
dadangjia 0:5f61200516d7 138 }
dadangjia 0:5f61200516d7 139
dadangjia 0:5f61200516d7 140 int X = 2;
dadangjia 0:5f61200516d7 141 while(*s) {
dadangjia 0:5f61200516d7 142 printBigNumber(*s, X, Y);
dadangjia 0:5f61200516d7 143
dadangjia 0:5f61200516d7 144 Y+=3;
dadangjia 0:5f61200516d7 145 X=2;
dadangjia 0:5f61200516d7 146 setXY(X,Y);
dadangjia 0:5f61200516d7 147 *s++;
dadangjia 0:5f61200516d7 148 }
dadangjia 0:5f61200516d7 149 }
dadangjia 0:5f61200516d7 150
dadangjia 0:5f61200516d7 151
dadangjia 0:5f61200516d7 152 //==========================================================//
dadangjia 0:5f61200516d7 153 // Prints a display big number (96 bytes) in coordinates X Y,
dadangjia 0:5f61200516d7 154 // being multiples of 8. This means we have 16 COLS (0-15)
dadangjia 0:5f61200516d7 155 // and 8 ROWS (0-7).
dadangjia 0:5f61200516d7 156 void printBigNumber(unsigned char s, int X, int Y)
dadangjia 0:5f61200516d7 157 {
dadangjia 0:5f61200516d7 158 setXY(X,Y);
dadangjia 0:5f61200516d7 159 int salto=0;
dadangjia 0:5f61200516d7 160 for(int i=0; i<96; i++) {
dadangjia 0:5f61200516d7 161 if(s == ' ') {
dadangjia 0:5f61200516d7 162 SendByte(0);
dadangjia 0:5f61200516d7 163 } else
dadangjia 0:5f61200516d7 164 SendByte(bigNumbers[s-0x30][i]);
dadangjia 0:5f61200516d7 165
dadangjia 0:5f61200516d7 166 if(salto == 23) {
dadangjia 0:5f61200516d7 167 salto = 0;
dadangjia 0:5f61200516d7 168 X++;
dadangjia 0:5f61200516d7 169 setXY(X,Y);
dadangjia 0:5f61200516d7 170 } else {
dadangjia 0:5f61200516d7 171 salto++;
dadangjia 0:5f61200516d7 172 }
dadangjia 0:5f61200516d7 173 }
dadangjia 0:5f61200516d7 174 }
dadangjia 0:5f61200516d7 175 //==========================================================//
dadangjia 0:5f61200516d7 176 // Prints a display char (not just a byte) in coordinates X Y,
dadangjia 0:5f61200516d7 177 // being multiples of 8. This means we have 16 COLS (0-15)
dadangjia 0:5f61200516d7 178 // and 8 ROWS (0-7).
dadangjia 0:5f61200516d7 179 void SendByteXY(unsigned char data, int X, int Y)
dadangjia 0:5f61200516d7 180 {
dadangjia 0:5f61200516d7 181 i2c.start();
dadangjia 0:5f61200516d7 182 i2c.write(OLED_ADDR);
dadangjia 0:5f61200516d7 183 i2c.write(0x40);
dadangjia 0:5f61200516d7 184
dadangjia 0:5f61200516d7 185 for(int i=0; i<8; i++)
dadangjia 0:5f61200516d7 186 i2c.write((int)(myFont[data-0x20]+i)); // <<-------------------------------------
dadangjia 0:5f61200516d7 187
dadangjia 0:5f61200516d7 188 i2c.stop(); // stop transmitting
dadangjia 0:5f61200516d7 189 }
dadangjia 0:5f61200516d7 190 //==========================================================//
dadangjia 0:5f61200516d7 191 // Prints a string regardless the cursor position.
dadangjia 0:5f61200516d7 192 void sendStr(unsigned char *s)
dadangjia 0:5f61200516d7 193 {
dadangjia 0:5f61200516d7 194 unsigned char i=0;
dadangjia 0:5f61200516d7 195 while(*s) {
dadangjia 0:5f61200516d7 196 for(i=0; i<8; i++) {
dadangjia 0:5f61200516d7 197 SendByte(myFont[*s-0x20][i]);
dadangjia 0:5f61200516d7 198 }
dadangjia 0:5f61200516d7 199 *s++;
dadangjia 0:5f61200516d7 200 }
dadangjia 0:5f61200516d7 201 }
dadangjia 0:5f61200516d7 202 //==========================================================//
dadangjia 0:5f61200516d7 203 // Prints a string in coordinates X Y, being multiples of 8.
dadangjia 0:5f61200516d7 204 // This means we have 16 COLS (0-15) and 8 ROWS (0-7).
dadangjia 0:5f61200516d7 205 void sendStrXY( char *s, int X, int Y)
dadangjia 0:5f61200516d7 206 {
dadangjia 0:5f61200516d7 207 setXY(X,Y);
dadangjia 0:5f61200516d7 208 unsigned char i=0;
dadangjia 0:5f61200516d7 209 while(*s) {
dadangjia 0:5f61200516d7 210 for(i=0; i<8; i++) {
dadangjia 0:5f61200516d7 211 SendByte(myFont[*s-0x20][i]);
dadangjia 0:5f61200516d7 212 }
dadangjia 0:5f61200516d7 213 *s++;
dadangjia 0:5f61200516d7 214 }
dadangjia 0:5f61200516d7 215 }
dadangjia 0:5f61200516d7 216
dadangjia 0:5f61200516d7 217
dadangjia 0:5f61200516d7 218 //==========================================================//
dadangjia 0:5f61200516d7 219 // Inits oled and draws logo at startup
dadangjia 0:5f61200516d7 220 void init_OLED(void)
dadangjia 0:5f61200516d7 221 {
dadangjia 0:5f61200516d7 222 sendcommand(0xae); //display off
dadangjia 0:5f61200516d7 223 sendcommand(0xa6); //Set Normal Display (default)
dadangjia 0:5f61200516d7 224 // Adafruit Init sequence for 128x64 OLED module
dadangjia 0:5f61200516d7 225 sendcommand(0xAE); //DISPLAYOFF
dadangjia 0:5f61200516d7 226 sendcommand(0xD5); //SETDISPLAYCLOCKDIV
dadangjia 0:5f61200516d7 227 sendcommand(0x80); // the suggested ratio 0x80
dadangjia 0:5f61200516d7 228 sendcommand(0xA8); //SSD1306_SETMULTIPLEX
dadangjia 0:5f61200516d7 229 sendcommand(0x3F);
dadangjia 0:5f61200516d7 230 sendcommand(0xD3); //SETDISPLAYOFFSET
dadangjia 0:5f61200516d7 231 sendcommand(0x0); //no offset
dadangjia 0:5f61200516d7 232 sendcommand(0x40 | 0x0); //SETSTARTLINE
dadangjia 0:5f61200516d7 233 sendcommand(0x8D); //CHARGEPUMP
dadangjia 0:5f61200516d7 234 sendcommand(0x14);
dadangjia 0:5f61200516d7 235 sendcommand(0x20); //MEMORYMODE
dadangjia 0:5f61200516d7 236 sendcommand(0x00); //0x0 act like ks0108
dadangjia 0:5f61200516d7 237
dadangjia 0:5f61200516d7 238 sendcommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg
dadangjia 0:5f61200516d7 239 //sendcommand(0xA0);
dadangjia 0:5f61200516d7 240
dadangjia 0:5f61200516d7 241 sendcommand(0xC8); //COMSCANDEC Rotate screen 180 Deg
dadangjia 0:5f61200516d7 242 //sendcommand(0xC0);
dadangjia 0:5f61200516d7 243
dadangjia 0:5f61200516d7 244 sendcommand(0xDA); //0xDA
dadangjia 0:5f61200516d7 245 sendcommand(0x12); //COMSCANDEC
dadangjia 0:5f61200516d7 246 sendcommand(0x81); //SETCONTRAS
dadangjia 0:5f61200516d7 247 sendcommand(0xCF); //
dadangjia 0:5f61200516d7 248 sendcommand(0xd9); //SETPRECHARGE
dadangjia 0:5f61200516d7 249 sendcommand(0xF1);
dadangjia 0:5f61200516d7 250 sendcommand(0xDB); //SETVCOMDETECT
dadangjia 0:5f61200516d7 251 sendcommand(0x40);
dadangjia 0:5f61200516d7 252 sendcommand(0xA4); //DISPLAYALLON_RESUME
dadangjia 0:5f61200516d7 253 sendcommand(0xA6); //NORMALDISPLAY
dadangjia 0:5f61200516d7 254
dadangjia 0:5f61200516d7 255 clear_display();
dadangjia 0:5f61200516d7 256 sendcommand(0x2e); // stop scroll
dadangjia 0:5f61200516d7 257 //----------------------------REVERSE comments----------------------------//
dadangjia 0:5f61200516d7 258 // sendcommand(0xa0); //seg re-map 0->127(default)
dadangjia 0:5f61200516d7 259 // sendcommand(0xa1); //seg re-map 127->0
dadangjia 0:5f61200516d7 260 // sendcommand(0xc8);
dadangjia 0:5f61200516d7 261 // delay(1000);
dadangjia 0:5f61200516d7 262 //----------------------------REVERSE comments----------------------------//
dadangjia 0:5f61200516d7 263 // sendcommand(0xa7); //Set Inverse Display
dadangjia 0:5f61200516d7 264 // sendcommand(0xae); //display off
dadangjia 0:5f61200516d7 265 sendcommand(0x20); //Set Memory Addressing Mode
dadangjia 0:5f61200516d7 266 sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode
dadangjia 0:5f61200516d7 267 // sendcommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET)
dadangjia 0:5f61200516d7 268
dadangjia 0:5f61200516d7 269 setXY(0,0);
dadangjia 0:5f61200516d7 270
dadangjia 0:5f61200516d7 271 sendcommand(0xaf); //display on
dadangjia 0:5f61200516d7 272 }