/* ===================================
* Arduino Demo
*
* by computerarchiv-muenchen.de
*
* http://demo99.makercafe-muenchen.de
* ===================================
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define YELLOW_PIN 12
#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display( OLED_WIDTH, OLED_HEIGHT, &Wire, OLED_RESET ); // 0.96' display
#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 );
void setup() {
pinMode( YELLOW_PIN, OUTPUT );
pinMode( RED_PIN, OUTPUT );
pinMode( GREEN_PIN, OUTPUT );
pinMode( BLUE_PIN, OUTPUT );
digitalWrite( YELLOW_PIN, LOW );
resetLED();
Serial.begin( 9600 );
if( !display.begin( SSD1306_SWITCHCAPVCC, OLED_ADDRESS ) ) {
Serial.println( F( "SSD1306 allocation failed" ) );
for(;;); // Don't proceed, loop forever
}
delay( PAUSE_SHORT );
}
void loop() {
resetLED();
display.clearDisplay();
writeText( 1, 7, " Hallo ", true, 3 );
writeText( 1, 31, " Welt ", true, 3 );
delay( PAUSE_LONG );
flashLED3x();
delay( PAUSE_LONG );
digitalWrite( YELLOW_PIN, HIGH );
flashDisplay();
digitalWrite( YELLOW_PIN, LOW );
delay( PAUSE_LONG );
scrollDisplay();
delay( PAUSE_LONG );
show( " Rot ", HIGH, LOW, LOW );
show( " Gruen ", LOW, HIGH, LOW );
show( " Blau ", LOW, LOW, HIGH );
display.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_PIN, LOW );
digitalWrite( GREEN_PIN, LOW );
digitalWrite( BLUE_PIN, LOW );
}
void flashLED( void ) {
digitalWrite( YELLOW_PIN, HIGH );
delay( 500 );
digitalWrite( YELLOW_PIN, 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_PIN, j );
}
if( green ) {
analogWrite( GREEN_PIN, j );
}
if( blue ) {
analogWrite( BLUE_PIN, 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_PIN, j );
}
if( green ) {
analogWrite( GREEN_PIN, j );
}
if( blue ) {
analogWrite( BLUE_PIN, j );
}
delay( 20 );
}
}
void flashDisplay( void ) {
display.invertDisplay( true );
delay( PAUSE_SHORT );
display.invertDisplay( false );
}
void scrollDisplay( void ) {
digitalWrite( YELLOW_PIN, HIGH );
display.startscrollright( 0x00, 0x0F );
delay( PAUSE_MID );
display.stopscroll();
display.startscrollleft( 0x00, 0x0F );
delay( PAUSE_MID );
display.stopscroll();
display.startscrolldiagright( 0x00, 0x07 );
delay( PAUSE_MID );
display.startscrolldiagleft( 0x00, 0x07 );
delay( PAUSE_MID );
display.stopscroll();
digitalWrite( YELLOW_PIN, LOW );
}
void writeText( int x, int y, String text, bool invers, int size ) {
display.setTextSize( size );
display.setCursor( x, y );
if( invers ) {
display.setTextColor( SSD1306_BLACK, SSD1306_WHITE );
} else {
display.setTextColor( SSD1306_BLACK );
}
display.println( text );
display.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_PIN, HIGH );
for( int i = 0; i < display.width(); i+=4 ) {
display.drawLine( 0, 0, i, display.height()-1, SSD1306_WHITE );
display.display();
delay( 1 );
}
for( int i = display.width() -1; i > 0; i-=4 ) {
display.drawLine( display.width() -1, display.height() -1, i, 0, SSD1306_WHITE );
display.display();
delay( 1 );
}
digitalWrite( YELLOW_PIN, LOW );
}
void show( String text, bool red, bool green, bool blue ) {
display.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();
}