#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Display Definings
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//
uint16_t LUXpredef[9] = {500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4400};
int lampPwm = 11; //Pin für den Ausgang der Lampe
int tastLi = 8; //Pin für den Eingang des linken Tasters
int tastRe = 9; //Pin für den Eingang des rechten Tasters
int ldrIn = 0; //Pin für den Analogen Eingang des LDR
int stufe = 0; //Stufensteuerung der lampe
//Struct of Array
typedef struct pwmLuxStruct{
uint8_t PWM;
uint16_t LUX;
uint16_t LDR;
uint8_t STUFE;
} ;
pwmLuxStruct Eprom[9];
//
void setup() {
pinMode(lampPwm, OUTPUT);
pinMode(tastLi, INPUT_PULLUP);
pinMode(tastRe, INPUT_PULLUP);
Load();
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally /*
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
}
//Serieller Monitor Steuerung & Speichern und Laden EEPROM
void Einstellung(){
Serial.println("Setup");
Tabelle();
Auswahl12:
Serial.println("\n1. Alle Werte verändern?\n2. Einen Wert verändern?\nTippen sie ein:(1|2)");
while(Serial.available() == 0){}
String eingabe = Serial.readString();
eingabe.trim();
if(eingabe == "2"){
Individuel:
Serial.println("PWM||LUX");
while(Serial.available() == 0){}
eingabe = Serial.readString();
eingabe.trim();
eingabe.toLowerCase();
if(eingabe == "pwm"){
Serial.println("PWM wurde ausgewählt");
Serial.println("\"1-8\" Eingeben");
while(Serial.available() == 0);
String eingabe = Serial.readString();
uint8_t ArrayNr = eingabe.toInt();
Serial.print("Parameter für PWM(");
Serial.print(ArrayNr);
Serial.println(") eingeben (0-255)");
while(Serial.available()==0){}
eingabe = Serial.readString();
uint8_t ArrayPm8 = eingabe.toInt();
ArrayNr--;
Eprom[ArrayNr].PWM = ArrayPm8;
ArrayNr++;
Serial.print("Wert für PWM(");
Serial.print(ArrayNr);
Serial.println(") wird Gespeichert");
}
else if (eingabe == "lux"){
Serial.println("LUX wurde ausgewählt");
Serial.println("\"1-8\" Eingeben");
while(Serial.available() == 0);
String eingabe = Serial.readString();
uint8_t ArrayNr = eingabe.toInt();
Serial.print("Parameter für LUX(");
Serial.print(ArrayNr);
Serial.println(") eingeben (0-5000)");
while(Serial.available()==0){}
eingabe = Serial.readString();
uint16_t ArrayPm16 = eingabe.toInt();
ArrayNr--;
Eprom[ArrayNr].LUX = ArrayPm16;
ArrayNr++;
Serial.print("Wert für LUX(");
Serial.print(ArrayNr);
Serial.println(") wird Gespeichert");
}
else{
Serial.println("Bitte wiederholen");
goto Individuel;
}
}
else if(eingabe == "1"){
//Alle werte Einlesen
for(int x = 0; x<=8; x++){
WerteAuslesenPWM:
Serial.print("geben sie den PWM(");
Serial.print(x);
Serial.println(") Wert ein:");
Serial.println("(Exit) für Beenden");
Serial.println("WICHTIG!! 0-255");
while(Serial.available() == 0){}
if (isDigit(Serial.peek())) {
Eprom[x].PWM = Serial.parseInt();
Serial.print("Der wert für PWM(");
Serial.print(x);
Serial.print(") ist = ");
Serial.println(Eprom[x].PWM);
Serial.println();
Serial.readStringUntil("-");
}
else{
String eingabe = Serial.readString();
eingabe.trim();
if(eingabe == "Exit"){
Serial.println("Beende Eingabe");
return;
}
Serial.readStringUntil("-");
Serial.println();
Serial.println("Fehler bitte wiederholen");
Serial.println();
goto WerteAuslesenPWM;
}
WerteAuslesenLUX:
Serial.print("geben sie den LUX(");
Serial.print(x);
Serial.println(") Wert ein:");
Serial.println("(Exit) für Beenden");
Serial.println("WICHTIG!! 0-5000");
Serial.print("Enter für Voreinstellung = ");
Serial.println(LUXpredef[x]);
while(Serial.available() == 0){}
if (isDigit(Serial.peek())) {
Eprom[x].LUX = Serial.parseInt();
Serial.print("Der wert für LUX(");
Serial.print(x);
Serial.print(") ist = ");
Serial.println(Eprom[x].LUX);
Serial.println();
Serial.readStringUntil("-");
}
else{
String eingabe = Serial.readString();
eingabe.trim();
if (eingabe == ""){
Eprom[x].LUX = LUXpredef[x];
Serial.println("Voreinstellung gewählt!");
Serial.print("Der wert für LUX(");
Serial.print(x);
Serial.print(") ist = ");
Serial.println(Eprom[x].LUX);
Serial.println();
Serial.readStringUntil("-");
}
else if (eingabe == "Exit"){
Serial.println("Beende Einage");
return;
}
else{
Serial.readStringUntil("-");
Serial.println();
Serial.println("Fehler bitte wiederholen");
Serial.println();
goto WerteAuslesenLUX;
}
}
}
//
}
else{
Serial.print("\n\nWurde nicht verstanden\nBitte wiederholen");
goto Auswahl12;
}
//EEPROM Speichern
SpeichernEprom:
Serial.println("Alte Werte Überschreiben? (yes/NO)");
while(Serial.available() == 0){}
eingabe = Serial.readString();
eingabe.trim();
if(eingabe == "Y" || eingabe == "y" || eingabe == "yes" || eingabe == "YES"){
Save();
Serial.println("Werte Gespeichert");
Serial.println("Beende Eingabe");
}
else if ( eingabe == "NO" || eingabe == "no" || eingabe == "N" || eingabe == "n") {
Serial.println("Beende Eingabe");
return;
}
else{
Serial.println("ehler, bitte Wiederholen.");
goto SpeichernEprom;
}
//
}
void Print(){
Serial.println(Eprom[0].PWM);
Serial.println(Eprom[0].LUX);
}
void Save() {
/*
int adr = 0;
for(int i=0; i<=8; i++){
EEPROM.put(adr, Eprom[i].PWM);
adr += sizeof(Eprom[i].PWM);
EEPROM.put(adr, Eprom[i].LUX);
adr += sizeof(Eprom[i].LUX);
}
Serial.print("Gespeichert bis EEPROM Adresse: " );
Serial.println(adr);
return;
*/
EEPROM.put(0, Eprom);
}
void Load(){
/*
int adr = 0;
for(int x=0; x<=8; x++){
Eprom[x].PWM = EEPROM[adr];
adr += sizeof(Eprom[x].PWM);
Eprom[x].LUX = EEPROM[adr];
adr += sizeof(Eprom[x].LUX);
}
*/
EEPROM.get(0, Eprom);
}
void Preconfig(){
Eprom[0] = {84,500};
Eprom[1] = {119,1000};
Eprom[2] = {145,1500};
Eprom[3] = {169,2000};
Eprom[4] = {192,2500};
Eprom[5] = {211,3000};
Eprom[6] = {229,3500};
Eprom[7] = {247,4000};
Eprom[8] = {255,4400};
}
void Tabelle(){
Serial.println("Werte aus dem EEPROM:");
Serial.println("| PWM | LUX |");
Serial.println("---------------");
for(int x = 0; x<=8; x++){
Serial.print("| ");
Serial.print(Eprom[x].PWM);
Serial.print(" |");
Serial.print(Eprom[x].LUX);
Serial.println(" |");
}
}
void Hilfe(){
Serial.println("Liste der möglicher Befehle:");
Serial.println("\"setup\" (PWM und LUX werter eingeben)");
Serial.println("\"preconfig\" (Voreingestellte PWM und LUX Werte laden)");
Serial.println("\"tabelle\" (PWM und LUX Werte als Tabelle anzeigen lassen)");
Serial.println("\"hex\" (Hex werte Anzeigen lassen die im EEPROM Gespeichert sind)");
}
void EEPROM_HEX_DUMP(int8_t mode){
Serial.print("EEPROM-Size =");
Serial.println(EEPROM.length());
int16_t wert;
int16_t laenge=0;
if(mode==0)
laenge = EEPROM.length(); // gesamten Speicher auslesen
else if(mode == 1)
laenge =256; // 1. Block auslesen
for(int16_t adr=0; adr<laenge; adr++)
{
if(adr==0)
{
Serial.print(adr, HEX);
Serial.print(" : ");
}
if(adr%256==0 && adr>0) // nach jeder 16ten Ausgabe einen Zeilenumbruch einfügen
{
Serial.println();
Serial.println("____________________________________________________");
delay(1000);
}
if(adr%16==0 && adr>0) // nach jeder 16ten Ausgabe einen Zeilenumbruch einfügen
{
Serial.println(); // Zeilenumbruch
Serial.print(adr, HEX);
Serial.print(" : ");
}
int16_t wert = EEPROM.read(adr); // EEPROM and der Adresse auslesen
if(wert < 16) // wenn der Wert kleiner 16 dann eine 0 hinzufügen
Serial.print("0");
Serial.print(wert,HEX);
Serial.print(" ");
}
Serial.println();
Serial.println("____________________________________________________");
}
//
//Display Steuerung
void Displaysteu(){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.print("LUX: ");
display.println(Eprom[stufe].LUX);
display.display();
}
//
void loop() {
Eprom[1].LDR = analogRead(ldrIn);
//Serielle Schnitstelle befehle
if(Serial.available() > 0){
String eingabe = Serial.readString();
eingabe.trim();
if (eingabe == "setup"){
Serial.readStringUntil('-');
Einstellung();
}
else if (eingabe == "preconfig"){
Preconfig();
Save();
Serial.println("Preconfig geladen und Gespeichert");
Tabelle();
}
else if (eingabe == "help"){
Hilfe();
}
else if (eingabe == "tabelle"){
Tabelle();
}
else if (eingabe == "hex"){
EEPROM_HEX_DUMP(0);
}
else{
Serial.println("für Hilfe \"help\" eintippen");
}
}
//
if(digitalRead(tastLi) == LOW){
stufe--;
if(stufe <= 0) stufe = 0;
}
if(digitalRead(tastRe) == LOW){
stufe++;
if(stufe >= 9) stufe = 9;
}
analogWrite(lampPwm, Eprom[stufe].PWM);
Displaysteu();
}