// A basic everyday NeoPixel pixels test program.
// NEOPIXEL BEST PRACTICES for most reliable operation:
// - Add 1000 uF CAPACITOR between NeoPixel pixels's + and - connections.
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
// - NeoPixel pixels's DATA-IN should pass through a 300-500 OHM RESISTOR.
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
// connect GROUND (-) first, then +, then data.
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel pixels,
// a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)
#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal.h>
/*const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int buttonPin1 = 8;
const int buttonPin2 = 7;
const int poti1 = A2;
int j_knopf1 = LOW;
int j_knopf2 = LOW;
int j_menu = 0;
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 6
#define NUMPIXELS 300 */
//Adafruit_NeoPixel pixels(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);
//Grundlegendes Quellcode-Setup
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal.h> // Einbinden einer Bibliothek zum Ansteuern der Neopixel-LED-Leiste
//Bibliothek zur Nutzung von Zufallszahl-Befehlen
//#include <cstdlib>
#define PIN 6 //Arduino-Anschlusspin für Dateneingabe
#define NUMPIXELS 300 //Anzahl der Neopixel in der Leiste
using namespace std;
int pixelanzahl;
int erzeugeZufallszahl(int);
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int buttonPin1 = 8;
const int buttonPin2 = 7;
const int poti1 = A2;
int j_knopf1 = LOW;
int j_knopf2 = LOW;
//int poti1 = 0; Diesen Befehl habe ich erstmal rausgenommen, weil der Compiler eine "conflicting declaration" mit Zeile 12 ausgibt ~Clemens
int j_menu = 0;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //Von nun an lassen sich die Adafruit_Neopixel.h-Befehle mit pixels.[command] aufrufen
//Funktionsprototypen
void sendWave(int, float); //Welleneffekt-Funktion anlegen mit regelbaren Parametern
int erzeugeZufallszahl(int); //Erzeugung von Pseudozufallszahlen für eine zufällige Reflexionsflankenposition
void setup() { //Grundeinstellungen für den Modus Wellenbewegung: keine besonderes Einstellungen (so far)
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
//fehlt hier ein Output-Pin für die Neopixel-Leiste? :) ~ Clemens
pixels.begin(); //Initialisierung der Neopixel-LED-Leiste
lcd.setCursor(0,1);
lcd.print("Test");
}
// hier ist Platz für die Hauptmenü-Navigation (Jacques)
// sehr nett von dir Clemens, aber meins muss ins Loop :D ~Jacques
//hier ist Platz für den Modus "Lichtmengenregulation auf der Messe (Gunnar)"
//hier ist Platz für den Modus "Partyblinken/Strobo (Banu)"
//hier ist Platz für den Modus "Wellenbewegung (Clemens)"
void loop() {
/*j_knopf1 = digitalRead(buttonPin1);
j_knopf2 = digitalRead(buttonPin2);
if(j_knopf1 == HIGH){
j_menu++;
}
if(j_knopf2 == HIGH){
j_menu--;
}
if(j_menu >= 3){
j_menu = 0;
}
if(j_menu <=-1){
j_menu = 2;
}
switch (j_menu) {
case 0:
lcd.setCursor(0, 0);
lcd.print(">Welle ");
lcd.setCursor(0, 1);
lcd.print(" Entspannung pur");
break;
case 1:
lcd.setCursor(0,0);
lcd.print(">Partylicht ");
lcd.setCursor(0, 1);
lcd.print(" Das wird wild ");
break;
case 2:
lcd.setCursor(0,0);
lcd.print(">Lichteruhr");
lcd.setCursor(0, 1);
lcd.print(" Einfach besser aufwachen");
break;
}*/
sendWave(4,50.0);
}
void sendWave(int eyeSize, float speedDelay){
//Pseudo-zufällige Wahl der Reflexionsflankenposition bei jedem Aufruf der sendWave-Funktion
int reFlanke = erzeugeZufallszahl(NUMPIXELS);
//Welle von rechts nach links
for(int c_i = -eyeSize-5; c_i < reFlanke-(1+eyeSize+2*3); c_i++) {
pixels.clear();
pixels.setPixelColor(c_i, 0, 250/10, 190/10); //Fade-In-Effekt:erster Pixel der LED-Gruppe besitzt nur 10% Helligkeit
pixels.setPixelColor(c_i+1, 0, 250/5, 190/5); //Fade-In-Effekt: zweiter Pixel der LED-Gruppe besitzt nur 20% Helligkeit
pixels.setPixelColor(c_i+2, 0, 250/2, 190/2); //Fade-In-Effekt: dritter Pixel der LED-Gruppe besitzt nur 50% Helligkeit
for(int c_j = 3; c_j <= eyeSize+2; c_j++) { //100% helle Wellenmitte der Breite eyeSize
pixels.setPixelColor(c_i+c_j, 0, 250, 190);
}
pixels.setPixelColor(c_i+eyeSize+3, 0, 250/2, 190/2); //Fade-Out-Effekt: vorvorletzter Pixel der LED-Gruppe besitzt nur 50% Helligkeit
pixels.setPixelColor(c_i+eyeSize+4, 0, 250/5, 190/5); //Fade-Out-Effekt: vorletzter Pixel der LED-Gruppe besitzt nur 20% Helligkeit
pixels.setPixelColor(c_i+eyeSize+5, 0, 250/10, 190/10); //Fade-Out-Effekt: letzter Pixel der LED-Gruppe besitzt nur 10% Helligkeit
pixels.show();
delay(speedDelay); //Zeitverzögerung, sonst würde das menschliche Auge nichts sehen, weil Ansteuerung nur ganz kurz und sehr schnell
}
//eyeSize+2*3-NUMPIXELS-1 -eyeSize-7
//reflektierte Welle von links nach rechts
for(int c_i = reFlanke-(1+eyeSize+2*3); c_i >= -eyeSize-7; c_i--) { //Start bei i=9, Fade in auf 10,11,12 (Start bei 0) 100% auf 13,14,15,16 fade out auf 17,18,19
pixels.clear();
pixels.setPixelColor(c_i+1, 0, 250/10, 190/10); //Fade-In-Effekt: erster Pixel (von rechts) der LED-Gruppe besitzt nur 10% Helligkeit
pixels.setPixelColor(c_i+2, 0, 250/5, 190/5); //Fade-In-Effekt: zweiter Pixel (von rechts) der LED-Gruppe besitzt nur 20% Helligkeit
pixels.setPixelColor(c_i+3, 0, 250/2, 190/2); //Fade-In-Effekt: dritter Pixel (von rechts) LED-Gruppe besitzt nur 50% Helligkeit
for(int c_j = 4; c_j <= eyeSize+3; c_j++) { //100% helle Wellenmitte der Breite eyeSize
pixels.setPixelColor(c_i+c_j, pixels.Color(0,250,190));
}
pixels.setPixelColor(c_i+eyeSize+4, 0,250/2,190/2); //Fade-Out-Effekt: vorvorletzter Pixel der LED-Gruppe besitzt nur 50% Helligkeit
pixels.setPixelColor(c_i+eyeSize+5, 0, 250/5, 190/5); //Fade-Out-Effekt: vorletzter Pixel der LED-Gruppe besitzt nur 20% Helligkeit
pixels.setPixelColor(c_i+eyeSize+6, 0, 250/10, 190/10); //Fade-Out-Effekt: letzter Pixel der LED-Gruppe besitzt nur 10% Helligkeit
pixels.show();
delay(speedDelay*1.5); //variable Zeitverzögerung über einen zusätzlichen Parameter, sonst würde das menschliche Auge nichts sehen, weil Ansteuerung nur ganz kurz und sehr schnell
}
//Wartezeit zwischen Absorption der alten Welle und Emission einer neuen Welle
delay(1000);
}
int erzeugeZufallszahl(int pixelanzahl){
int zufallswert = 0;
return zufallswert = (rand() % ((pixelanzahl/2)+1)) + (pixelanzahl/2); /*Bsp: LED-Leiste mit 300 Neopixeln:
Erster Summand variiert zwischen 0 und 150 (erste Hälfte der LED-Leiste)
Zweiter Summand verschiebt das Zufallszahlenintervall in die zweite Hälfte der LED-Leiste*/
}