Plant Monitoring project ei2i-4 Made by Jeanne Baumier, Anaïs Auberval and Thomas Broussard

Dependencies:   mbed

Committer:
Tbroussard
Date:
Mon Jan 15 15:57:21 2018 +0000
Revision:
9:c1392dfc57b8
Parent:
5:209b3eb7c162
Add deepsleep mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tbroussard 5:209b3eb7c162 1 /*********************************************************************
Tbroussard 5:209b3eb7c162 2 This is a library for our Monochrome OLEDs based on SSD1306 drivers
Tbroussard 5:209b3eb7c162 3
Tbroussard 5:209b3eb7c162 4 Pick one up today in the adafruit shop!
Tbroussard 5:209b3eb7c162 5 ------> http://www.adafruit.com/category/63_98
Tbroussard 5:209b3eb7c162 6
Tbroussard 5:209b3eb7c162 7 These displays use SPI to communicate, 4 or 5 pins are required to
Tbroussard 5:209b3eb7c162 8 interface
Tbroussard 5:209b3eb7c162 9
Tbroussard 5:209b3eb7c162 10 Adafruit invests time and resources providing this open source code,
Tbroussard 5:209b3eb7c162 11 please support Adafruit and open-source hardware by purchasing
Tbroussard 5:209b3eb7c162 12 products from Adafruit!
Tbroussard 5:209b3eb7c162 13
Tbroussard 5:209b3eb7c162 14 Written by Limor Fried/Ladyada for Adafruit Industries.
Tbroussard 5:209b3eb7c162 15 BSD license, check license.txt for more information
Tbroussard 5:209b3eb7c162 16 All text above, and the splash screen must be included in any redistribution
Tbroussard 5:209b3eb7c162 17 *********************************************************************/
Tbroussard 5:209b3eb7c162 18
Tbroussard 5:209b3eb7c162 19 /*
Tbroussard 5:209b3eb7c162 20 * Modified by Neal Horman 7/14/2012 for use in mbed
Tbroussard 5:209b3eb7c162 21 */
Tbroussard 5:209b3eb7c162 22
Tbroussard 5:209b3eb7c162 23 #ifndef _ADAFRUIT_SSD1306_H_
Tbroussard 5:209b3eb7c162 24 #define _ADAFRUIT_SSD1306_H_
Tbroussard 5:209b3eb7c162 25
Tbroussard 5:209b3eb7c162 26 #include "mbed.h"
Tbroussard 5:209b3eb7c162 27 #include "Adafruit_GFX.h"
Tbroussard 5:209b3eb7c162 28
Tbroussard 5:209b3eb7c162 29 #include <vector>
Tbroussard 5:209b3eb7c162 30 #include <algorithm>
Tbroussard 5:209b3eb7c162 31
Tbroussard 5:209b3eb7c162 32 // A DigitalOut sub-class that provides a constructed default state
Tbroussard 5:209b3eb7c162 33 class DigitalOut2 : public DigitalOut
Tbroussard 5:209b3eb7c162 34 {
Tbroussard 5:209b3eb7c162 35 public:
Tbroussard 5:209b3eb7c162 36 DigitalOut2(PinName pin, bool active = false) : DigitalOut(pin) { write(active); };
Tbroussard 5:209b3eb7c162 37 DigitalOut2& operator= (int value) { write(value); return *this; };
Tbroussard 5:209b3eb7c162 38 DigitalOut2& operator= (DigitalOut2& rhs) { write(rhs.read()); return *this; };
Tbroussard 5:209b3eb7c162 39 operator int() { return read(); };
Tbroussard 5:209b3eb7c162 40 };
Tbroussard 5:209b3eb7c162 41
Tbroussard 5:209b3eb7c162 42 #define SSD1306_EXTERNALVCC 0x1
Tbroussard 5:209b3eb7c162 43 #define SSD1306_SWITCHCAPVCC 0x2
Tbroussard 5:209b3eb7c162 44
Tbroussard 5:209b3eb7c162 45 /** The pure base class for the SSD1306 display driver.
Tbroussard 5:209b3eb7c162 46 *
Tbroussard 5:209b3eb7c162 47 * You should derive from this for a new transport interface type,
Tbroussard 5:209b3eb7c162 48 * such as the SPI and I2C drivers.
Tbroussard 5:209b3eb7c162 49 */
Tbroussard 5:209b3eb7c162 50 class Adafruit_SSD1306 : public Adafruit_GFX
Tbroussard 5:209b3eb7c162 51 {
Tbroussard 5:209b3eb7c162 52 public:
Tbroussard 5:209b3eb7c162 53 Adafruit_SSD1306(PinName RST, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
Tbroussard 5:209b3eb7c162 54 : Adafruit_GFX(rawWidth,rawHeight)
Tbroussard 5:209b3eb7c162 55 , rst(RST,false)
Tbroussard 5:209b3eb7c162 56 {
Tbroussard 5:209b3eb7c162 57 buffer.resize(rawHeight * rawWidth / 8);
Tbroussard 5:209b3eb7c162 58 };
Tbroussard 5:209b3eb7c162 59
Tbroussard 5:209b3eb7c162 60 void begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC);
Tbroussard 5:209b3eb7c162 61
Tbroussard 5:209b3eb7c162 62 // These must be implemented in the derived transport driver
Tbroussard 5:209b3eb7c162 63 virtual void command(uint8_t c) = 0;
Tbroussard 5:209b3eb7c162 64 virtual void data(uint8_t c) = 0;
Tbroussard 5:209b3eb7c162 65 virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
Tbroussard 5:209b3eb7c162 66
Tbroussard 5:209b3eb7c162 67 /// Clear the display buffer
Tbroussard 5:209b3eb7c162 68 void clearDisplay(void);
Tbroussard 5:209b3eb7c162 69 virtual void invertDisplay(bool i);
Tbroussard 5:209b3eb7c162 70
Tbroussard 5:209b3eb7c162 71 /// Cause the display to be updated with the buffer content.
Tbroussard 5:209b3eb7c162 72 void display();
Tbroussard 5:209b3eb7c162 73 /// Fill the buffer with the AdaFruit splash screen.
Tbroussard 5:209b3eb7c162 74 virtual void splash();
Tbroussard 5:209b3eb7c162 75
Tbroussard 5:209b3eb7c162 76 protected:
Tbroussard 5:209b3eb7c162 77 virtual void sendDisplayBuffer() = 0;
Tbroussard 5:209b3eb7c162 78 DigitalOut2 rst;
Tbroussard 5:209b3eb7c162 79
Tbroussard 5:209b3eb7c162 80 // the memory buffer for the LCD
Tbroussard 5:209b3eb7c162 81 std::vector<uint8_t> buffer;
Tbroussard 5:209b3eb7c162 82 };
Tbroussard 5:209b3eb7c162 83
Tbroussard 5:209b3eb7c162 84
Tbroussard 5:209b3eb7c162 85 /** This is the SPI SSD1306 display driver transport class
Tbroussard 5:209b3eb7c162 86 *
Tbroussard 5:209b3eb7c162 87 */
Tbroussard 5:209b3eb7c162 88 class Adafruit_SSD1306_Spi : public Adafruit_SSD1306
Tbroussard 5:209b3eb7c162 89 {
Tbroussard 5:209b3eb7c162 90 public:
Tbroussard 5:209b3eb7c162 91 /** Create a SSD1306 SPI transport display driver instance with the specified DC, RST, and CS pins, as well as the display dimentions
Tbroussard 5:209b3eb7c162 92 *
Tbroussard 5:209b3eb7c162 93 * Required parameters
Tbroussard 5:209b3eb7c162 94 * @param spi - a reference to an initialized SPI object
Tbroussard 5:209b3eb7c162 95 * @param DC (Data/Command) pin name
Tbroussard 5:209b3eb7c162 96 * @param RST (Reset) pin name
Tbroussard 5:209b3eb7c162 97 * @param CS (Chip Select) pin name
Tbroussard 5:209b3eb7c162 98 *
Tbroussard 5:209b3eb7c162 99 * Optional parameters
Tbroussard 5:209b3eb7c162 100 * @param rawHeight - the vertical number of pixels for the display, defaults to 32
Tbroussard 5:209b3eb7c162 101 * @param rawWidth - the horizonal number of pixels for the display, defaults to 128
Tbroussard 5:209b3eb7c162 102 */
Tbroussard 5:209b3eb7c162 103 Adafruit_SSD1306_Spi(SPI &spi, PinName DC, PinName RST, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
Tbroussard 5:209b3eb7c162 104 : Adafruit_SSD1306(RST, rawHieght, rawWidth)
Tbroussard 5:209b3eb7c162 105 , cs(CS,true)
Tbroussard 5:209b3eb7c162 106 , dc(DC,false)
Tbroussard 5:209b3eb7c162 107 , mspi(spi)
Tbroussard 5:209b3eb7c162 108 {
Tbroussard 5:209b3eb7c162 109 begin();
Tbroussard 5:209b3eb7c162 110 splash();
Tbroussard 5:209b3eb7c162 111 display();
Tbroussard 5:209b3eb7c162 112 };
Tbroussard 5:209b3eb7c162 113
Tbroussard 5:209b3eb7c162 114 virtual void command(uint8_t c)
Tbroussard 5:209b3eb7c162 115 {
Tbroussard 5:209b3eb7c162 116 cs = 1;
Tbroussard 5:209b3eb7c162 117 dc = 0;
Tbroussard 5:209b3eb7c162 118 cs = 0;
Tbroussard 5:209b3eb7c162 119 mspi.write(c);
Tbroussard 5:209b3eb7c162 120 cs = 1;
Tbroussard 5:209b3eb7c162 121 };
Tbroussard 5:209b3eb7c162 122
Tbroussard 5:209b3eb7c162 123 virtual void data(uint8_t c)
Tbroussard 5:209b3eb7c162 124 {
Tbroussard 5:209b3eb7c162 125 cs = 1;
Tbroussard 5:209b3eb7c162 126 dc = 1;
Tbroussard 5:209b3eb7c162 127 cs = 0;
Tbroussard 5:209b3eb7c162 128 mspi.write(c);
Tbroussard 5:209b3eb7c162 129 cs = 1;
Tbroussard 5:209b3eb7c162 130 };
Tbroussard 5:209b3eb7c162 131
Tbroussard 5:209b3eb7c162 132 protected:
Tbroussard 5:209b3eb7c162 133 virtual void sendDisplayBuffer()
Tbroussard 5:209b3eb7c162 134 {
Tbroussard 5:209b3eb7c162 135 cs = 1;
Tbroussard 5:209b3eb7c162 136 dc = 1;
Tbroussard 5:209b3eb7c162 137 cs = 0;
Tbroussard 5:209b3eb7c162 138
Tbroussard 5:209b3eb7c162 139 for(uint16_t i=0, q=buffer.size(); i<q; i++)
Tbroussard 5:209b3eb7c162 140 mspi.write(buffer[i]);
Tbroussard 5:209b3eb7c162 141
Tbroussard 5:209b3eb7c162 142 if(height() == 32)
Tbroussard 5:209b3eb7c162 143 {
Tbroussard 5:209b3eb7c162 144 for(uint16_t i=0, q=buffer.size(); i<q; i++)
Tbroussard 5:209b3eb7c162 145 mspi.write(0);
Tbroussard 5:209b3eb7c162 146 }
Tbroussard 5:209b3eb7c162 147
Tbroussard 5:209b3eb7c162 148 cs = 1;
Tbroussard 5:209b3eb7c162 149 };
Tbroussard 5:209b3eb7c162 150
Tbroussard 5:209b3eb7c162 151 DigitalOut2 cs, dc;
Tbroussard 5:209b3eb7c162 152 SPI &mspi;
Tbroussard 5:209b3eb7c162 153 };
Tbroussard 5:209b3eb7c162 154
Tbroussard 5:209b3eb7c162 155 /** This is the I2C SSD1306 display driver transport class
Tbroussard 5:209b3eb7c162 156 *
Tbroussard 5:209b3eb7c162 157 */
Tbroussard 5:209b3eb7c162 158 class Adafruit_SSD1306_I2c : public Adafruit_SSD1306
Tbroussard 5:209b3eb7c162 159 {
Tbroussard 5:209b3eb7c162 160 public:
Tbroussard 5:209b3eb7c162 161 #define SSD_I2C_ADDRESS 0x78
Tbroussard 5:209b3eb7c162 162 /** Create a SSD1306 I2C transport display driver instance with the specified RST pin name, the I2C address, as well as the display dimensions
Tbroussard 5:209b3eb7c162 163 *
Tbroussard 5:209b3eb7c162 164 * Required parameters
Tbroussard 5:209b3eb7c162 165 * @param i2c - A reference to an initialized I2C object
Tbroussard 5:209b3eb7c162 166 * @param RST - The Reset pin name
Tbroussard 5:209b3eb7c162 167 *
Tbroussard 5:209b3eb7c162 168 * Optional parameters
Tbroussard 5:209b3eb7c162 169 * @param i2cAddress - The i2c address of the display
Tbroussard 5:209b3eb7c162 170 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
Tbroussard 5:209b3eb7c162 171 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
Tbroussard 5:209b3eb7c162 172 */
Tbroussard 5:209b3eb7c162 173 Adafruit_SSD1306_I2c(I2C &i2c, PinName RST, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
Tbroussard 5:209b3eb7c162 174 : Adafruit_SSD1306(RST, rawHeight, rawWidth)
Tbroussard 5:209b3eb7c162 175 , mi2c(i2c)
Tbroussard 5:209b3eb7c162 176 , mi2cAddress(i2cAddress)
Tbroussard 5:209b3eb7c162 177 {
Tbroussard 5:209b3eb7c162 178 begin();
Tbroussard 5:209b3eb7c162 179 splash();
Tbroussard 5:209b3eb7c162 180 display();
Tbroussard 5:209b3eb7c162 181 };
Tbroussard 5:209b3eb7c162 182
Tbroussard 5:209b3eb7c162 183 virtual void command(uint8_t c)
Tbroussard 5:209b3eb7c162 184 {
Tbroussard 5:209b3eb7c162 185 char buff[2];
Tbroussard 5:209b3eb7c162 186 buff[0] = 0; // Command Mode
Tbroussard 5:209b3eb7c162 187 buff[1] = c;
Tbroussard 5:209b3eb7c162 188 mi2c.write(mi2cAddress, buff, sizeof(buff));
Tbroussard 5:209b3eb7c162 189 }
Tbroussard 5:209b3eb7c162 190
Tbroussard 5:209b3eb7c162 191 virtual void data(uint8_t c)
Tbroussard 5:209b3eb7c162 192 {
Tbroussard 5:209b3eb7c162 193 char buff[2];
Tbroussard 5:209b3eb7c162 194 buff[0] = 0x40; // Data Mode
Tbroussard 5:209b3eb7c162 195 buff[1] = c;
Tbroussard 5:209b3eb7c162 196 mi2c.write(mi2cAddress, buff, sizeof(buff));
Tbroussard 5:209b3eb7c162 197 };
Tbroussard 5:209b3eb7c162 198
Tbroussard 5:209b3eb7c162 199 protected:
Tbroussard 5:209b3eb7c162 200 virtual void sendDisplayBuffer()
Tbroussard 5:209b3eb7c162 201 {
Tbroussard 5:209b3eb7c162 202 char buff[17];
Tbroussard 5:209b3eb7c162 203 buff[0] = 0x40; // Data Mode
Tbroussard 5:209b3eb7c162 204
Tbroussard 5:209b3eb7c162 205 // send display buffer in 16 byte chunks
Tbroussard 5:209b3eb7c162 206 for(uint16_t i=0, q=buffer.size(); i<q; i+=16 )
Tbroussard 5:209b3eb7c162 207 { uint8_t x ;
Tbroussard 5:209b3eb7c162 208
Tbroussard 5:209b3eb7c162 209 // TODO - this will segfault if buffer.size() % 16 != 0
Tbroussard 5:209b3eb7c162 210 for(x=1; x<sizeof(buff); x++)
Tbroussard 5:209b3eb7c162 211 buff[x] = buffer[i+x-1];
Tbroussard 5:209b3eb7c162 212 mi2c.write(mi2cAddress, buff, sizeof(buff));
Tbroussard 5:209b3eb7c162 213 }
Tbroussard 5:209b3eb7c162 214 };
Tbroussard 5:209b3eb7c162 215
Tbroussard 5:209b3eb7c162 216 I2C &mi2c;
Tbroussard 5:209b3eb7c162 217 uint8_t mi2cAddress;
Tbroussard 5:209b3eb7c162 218 };
Tbroussard 5:209b3eb7c162 219
Tbroussard 5:209b3eb7c162 220 #endif