diff --git a/.travis.yml b/.travis.yml index 1eb9c4566d2d2fa62ef3ac330fb63425bed27849..88a1e72ba590475a21d8f6e194ad3696fb9dfcb7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ cache: env: - PLATFORMIO_CI_SRC=examples/SSD1306UiDemo - PLATFORMIO_CI_SRC=examples/SSD1306SimpleDemo + - PLATFORMIO_CI_SRC=examples/SSD1306DrawingDemo + - PLATFORMIO_CI_SRC=examples/SSD1306OTADemo - PLATFORMIO_CI_SRC=examples/SSD1306ClockDemo diff --git a/examples/SSD1306DrawingDemo/SSD1306DrawingDemo.ino b/examples/SSD1306DrawingDemo/SSD1306DrawingDemo.ino new file mode 100644 index 0000000000000000000000000000000000000000..ff947900767e330bade56d1a02308ddc67160886 --- /dev/null +++ b/examples/SSD1306DrawingDemo/SSD1306DrawingDemo.ino @@ -0,0 +1,221 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2016 by Daniel Eichhorn + * Copyright (c) 2016 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +// Include the correct display library +// For a connection via I2C using Wire include +#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier +#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"` +// For a connection via I2C using brzo_i2c (must be installed) include +// #include <brzo_i2c.h> // Only needed for Arduino 1.6.5 and earlier +// #include "SSD1306Brzo.h" +// For a connection via SPI include +// #include <SPI.h> // Only needed for Arduino 1.6.5 and earlier +// #include "SSD1306Spi.h" + +// Use the corresponding display class: + +// Initialize the OLED display using SPI +// D5 -> CLK +// D7 -> MOSI (DOUT) +// D0 -> RES +// D2 -> DC +// D8 -> CS +// SSD1306Spi display(D0, D2, D8); + +// Initialize the OLED display using brzo_i2c +// D3 -> SDA +// D4 -> SCL +// SSD1306Brzo display(0x3c, D3, D5); + +// Initialize the OLED display using Wire library +SSD1306 display(0x3c, D3, D5); + +// Adapted from Adafruit_SSD1306 +void drawLines() { + for (int16_t i=0; i<DISPLAY_WIDTH; i+=4) { + display.drawLine(0, 0, i, DISPLAY_HEIGHT-1); + display.display(); + delay(10); + } + for (int16_t i=0; i<DISPLAY_HEIGHT; i+=4) { + display.drawLine(0, 0, DISPLAY_WIDTH-1, i); + display.display(); + delay(10); + } + delay(250); + + display.clear(); + for (int16_t i=0; i<DISPLAY_WIDTH; i+=4) { + display.drawLine(0, DISPLAY_HEIGHT-1, i, 0); + display.display(); + delay(10); + } + for (int16_t i=DISPLAY_HEIGHT-1; i>=0; i-=4) { + display.drawLine(0, DISPLAY_HEIGHT-1, DISPLAY_WIDTH-1, i); + display.display(); + delay(10); + } + delay(250); + + display.clear(); + for (int16_t i=DISPLAY_WIDTH-1; i>=0; i-=4) { + display.drawLine(DISPLAY_WIDTH-1, DISPLAY_HEIGHT-1, i, 0); + display.display(); + delay(10); + } + for (int16_t i=DISPLAY_HEIGHT-1; i>=0; i-=4) { + display.drawLine(DISPLAY_WIDTH-1, DISPLAY_HEIGHT-1, 0, i); + display.display(); + delay(10); + } + delay(250); + display.clear(); + for (int16_t i=0; i<DISPLAY_HEIGHT; i+=4) { + display.drawLine(DISPLAY_WIDTH-1, 0, 0, i); + display.display(); + delay(10); + } + for (int16_t i=0; i<DISPLAY_WIDTH; i+=4) { + display.drawLine(DISPLAY_WIDTH-1, 0, i, DISPLAY_HEIGHT-1); + display.display(); + delay(10); + } + delay(250); +} + +// Adapted from Adafruit_SSD1306 +void drawRect(void) { + for (int16_t i=0; i<DISPLAY_HEIGHT/2; i+=2) { + display.drawRect(i, i, DISPLAY_WIDTH-2*i, DISPLAY_HEIGHT-2*i); + display.display(); + delay(10); + } +} + +// Adapted from Adafruit_SSD1306 +void fillRect(void) { + uint8_t color = 1; + for (int16_t i=0; i<DISPLAY_HEIGHT/2; i+=3) { + display.setColor((color % 2 == 0) ? BLACK : WHITE); // alternate colors + display.fillRect(i, i, DISPLAY_WIDTH - i*2, DISPLAY_HEIGHT - i*2); + display.display(); + delay(10); + color++; + } + // Reset back to WHITE + display.setColor(WHITE); +} + +// Adapted from Adafruit_SSD1306 +void drawCircle(void) { + for (int16_t i=0; i<DISPLAY_HEIGHT; i+=2) { + display.drawCircle(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, i); + display.display(); + delay(10); + } + delay(1000); + display.clear(); + + // This will draw the part of the circel in quadrant 1 + // Quadrants are numberd like this: + // 0010 | 0001 + // ------|----- + // 0100 | 1000 + // + display.drawCircleQuads(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, DISPLAY_HEIGHT/4, 0b00000001); + display.display(); + delay(200); + display.drawCircleQuads(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, DISPLAY_HEIGHT/4, 0b00000011); + display.display(); + delay(200); + display.drawCircleQuads(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, DISPLAY_HEIGHT/4, 0b00000111); + display.display(); + delay(200); + display.drawCircleQuads(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, DISPLAY_HEIGHT/4, 0b00001111); + display.display(); +} + +void printBuffer(void) { + // Initialize the log buffer + // allocate memory to store 8 lines of text and 30 chars per line. + display.setLogBuffer(5, 30); + + // Some test data + const char* test[] = { + "Hello", + "World" , + "----", + "Show off", + "how", + "the log buffer", + "is", + "working.", + "Even", + "scrolling is", + "working" + }; + + for (uint8_t i = 0; i < 11; i++) { + display.clear(); + // Print to the screen + display.println(test[i]); + // Draw it to the internal screen buffer + display.drawLogBuffer(0, 0); + // Display it on the screen + display.display(); + delay(500); + } +} + +void setup() { + display.init(); + + // display.flipScreenVertically(); + + display.setContrast(255); + + drawLines(); + delay(1000); + display.clear(); + + drawRect(); + delay(1000); + display.clear(); + + fillRect(); + delay(1000); + display.clear(); + + drawCircle(); + delay(1000); + display.clear(); + + printBuffer(); + delay(1000); + display.clear(); +} + +void loop() { } diff --git a/examples/SSD1306OTADemo/SSD1306OTADemo.ino b/examples/SSD1306OTADemo/SSD1306OTADemo.ino new file mode 100644 index 0000000000000000000000000000000000000000..05d12af428e9c48775b1f7f96ade4a6f0e1212b2 --- /dev/null +++ b/examples/SSD1306OTADemo/SSD1306OTADemo.ino @@ -0,0 +1,111 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2016 by Daniel Eichhorn + * Copyright (c) 2016 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +// WiFi includes + #include <ESP8266WiFi.h> + + // OTA Includes + #include <ESP8266mDNS.h> + #include <ArduinoOTA.h> + + const char *ssid = "[Your SSID]"; + const char *password = "[Your Password]"; + + +// Include the correct display library +// For a connection via I2C using Wire include +#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier +#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"` +// For a connection via I2C using brzo_i2c (must be installed) include +// #include <brzo_i2c.h> // Only needed for Arduino 1.6.5 and earlier +// #include "SSD1306Brzo.h" +// For a connection via SPI include +// #include <SPI.h> // Only needed for Arduino 1.6.5 and earlier +// #include "SSD1306Spi.h" + +// Use the corresponding display class: + +// Initialize the OLED display using SPI +// D5 -> CLK +// D7 -> MOSI (DOUT) +// D0 -> RES +// D2 -> DC +// D8 -> CS +// SSD1306Spi display(D0, D2, D8); + +// Initialize the OLED display using brzo_i2c +// D3 -> SDA +// D4 -> SCL +// SSD1306Brzo display(0x3c, D3, D5); + +// Initialize the OLED display using Wire library +SSD1306 display(0x3c, D3, D5); + + +void setup() { + WiFi.begin ( ssid, password ); + + // Wait for connection + while ( WiFi.status() != WL_CONNECTED ) { + delay ( 10 ); + } + + display.init(); + display.flipScreenVertically(); + display.setContrast(255); + + ArduinoOTA.begin(); + ArduinoOTA.onStart([]() { + display.clear(); + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH); + display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2 - 10, "OTA Update"); + display.display(); + }); + + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + display.drawProgressBar(4, 32, 120, 8, progress / (total / 100) ); + display.display(); + }); + + ArduinoOTA.onEnd([]() { + display.clear(); + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH); + display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, "Restart"); + display.display(); + }); + + // Align text vertical/horizontal center + display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH); + display.setFont(ArialMT_Plain_10); + display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, "Ready for OTA:\n" + WiFi.localIP().toString()); + display.display(); +} + +void loop() { + ArduinoOTA.handle(); +}