/* ===================================
* Arduino Demo
*
* by computerarchiv-muenchen.de
*
* http://demo98.makercafe-muenchen.de
* ===================================
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define YELLOW 12
#define RED 9
#define GREEN 10
#define BLUE 11
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define PAUSE_SHORT 1000
#define PAUSE_MID 2000
#define PAUSE_LONG 3000
void writeText( int x, int y, String text, bool invers, int size = 2 );
Adafruit_SSD1306 oled( SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET ); // 0.96' oled
void setup() {
pinMode( YELLOW, OUTPUT );
pinMode( RED, OUTPUT );
pinMode( GREEN, OUTPUT );
pinMode( BLUE, OUTPUT );
digitalWrite( YELLOW, LOW );
resetLED();
Serial.begin( 9600 );
if( !oled.begin( SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS ) ) {
Serial.println( F( "SSD1306 allocation failed" ) );
for(;;); // Don't proceed, loop forever
}
delay( PAUSE_SHORT );
}
void loop() {
resetLED();
oled.clearDisplay();
writeText( 1, 7, " Hallo ", true, 3 );
writeText( 1, 31, " Welt ", true, 3 );
delay( PAUSE_LONG );
flashLED3x();
delay( PAUSE_LONG );
digitalWrite( YELLOW, HIGH );
flashDisplay();
digitalWrite( YELLOW, LOW );
delay( PAUSE_LONG );
scrollDisplay();
delay( PAUSE_LONG );
show( " Rot ", HIGH, LOW, LOW );
show( " Gruen ", LOW, HIGH, LOW );
show( " Blau ", LOW, LOW, HIGH );
oled.clearDisplay();
drawLines();
writeText( 10, 10, " Blinken ", true );
flashLED3x();
delay( PAUSE_MID );
for( int i = 1; i <= 3; i++ ) {
flashText( " Rot ", HIGH, LOW, LOW );
fadeOutLED( HIGH, LOW, LOW );
resetLED();
flashText( " Gruen ", LOW, HIGH, LOW );
fadeOutLED( LOW, HIGH, LOW );
resetLED();
flashText( " Blau ", LOW, LOW, HIGH );
fadeOutLED( LOW, LOW, HIGH );
resetLED();
}
delay( PAUSE_MID );
resetLED();
flashLED3x();
}
void resetLED( void ) {
digitalWrite( RED, LOW );
digitalWrite( GREEN, LOW );
digitalWrite( BLUE, LOW );
}
void flashLED( void ) {
digitalWrite( YELLOW, HIGH );
delay( 500 );
digitalWrite( YELLOW, LOW );
}
void flashLED3x( void ) {
delay( PAUSE_SHORT );
for( int i = 1; i <= 3; i++ ) {
flashLED();
delay( 200 );
}
}
void fadeInLED( bool red, bool green, bool blue ) {
resetLED();
for( int i = 75; i < 255; i +=5) {
int j = (int)pow( 255, (float)i / 255 );
if( red ) {
analogWrite( RED, j );
}
if( green ) {
analogWrite( GREEN, j );
}
if( blue ) {
analogWrite( BLUE, j );
}
delay( 20 );
}
}
void fadeOutLED( bool red, bool green, bool blue ) {
for( int i = 255; i >= 75; i -=5) {
int j = (int)pow( 255, (float)i / 255 );
if( red ) {
analogWrite( RED, j );
}
if( green ) {
analogWrite( GREEN, j );
}
if( blue ) {
analogWrite( BLUE, j );
}
delay( 20 );
}
}
void flashDisplay( void ) {
oled.invertDisplay( true );
delay( PAUSE_SHORT );
oled.invertDisplay( false );
}
void scrollDisplay( void ) {
digitalWrite( YELLOW, HIGH );
oled.startscrollright( 0x00, 0x0F );
delay( PAUSE_MID );
oled.stopscroll();
oled.startscrollleft( 0x00, 0x0F );
delay( PAUSE_MID );
oled.stopscroll();
oled.startscrolldiagright( 0x00, 0x07 );
delay( PAUSE_MID );
oled.startscrolldiagleft( 0x00, 0x07 );
delay( PAUSE_MID );
oled.stopscroll();
digitalWrite( YELLOW, LOW );
}
void writeText( int x, int y, String text, bool invers, int size ) {
oled.setTextSize( size );
oled.setCursor( x, y );
if( invers ) {
oled.setTextColor( SSD1306_BLACK, SSD1306_WHITE );
} else {
oled.setTextColor( SSD1306_BLACK );
}
oled.println( text );
oled.display();
}
void flashText( String text, bool red, bool green, bool blue ) {
flashLED();
writeText( 10, 26, text, true );
fadeInLED( red, green, blue );
delay( PAUSE_SHORT );
}
void drawLines( void ) {
digitalWrite( YELLOW, HIGH );
for( int i = 0; i < oled.width(); i+=4 ) {
oled.drawLine( 0, 0, i, oled.height()-1, SSD1306_WHITE );
oled.display();
delay( 1 );
}
for( int i = oled.width() -1; i > 0; i-=4 ) {
oled.drawLine( oled.width() -1, oled.height() -1, i, 0, SSD1306_WHITE );
oled.display();
delay( 1 );
}
digitalWrite( YELLOW, LOW );
}
void show( String text, bool red, bool green, bool blue ) {
oled.clearDisplay();
delay( PAUSE_MID );
drawLines();
writeText( 1, 20, text, true, 3 );
flashLED3x();
delay( PAUSE_MID );
flashLED();
fadeInLED( red, green, blue );
delay( PAUSE_LONG );
scrollDisplay();
delay( PAUSE_MID );
fadeOutLED( red, green, blue );
resetLED();
}