/*
Programm: Analog-Digital-Konverter mit Neopixel und Display
Autor:
Datum: 04.11.2022
Das Programm wertet die Entfernung mittels Ultraschall aus.
Abhängig von diesem Wert wird ein NeoPixel angesteuert und der Wert auf eines
Display ausgegeben.
Ausgang:
Neopixel, OLED
Eingang:
Ultraschall
*/
#include <Wire.h> //fuer I2C, wie OLED
//OLED-Display
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C //I2C-Adresse des Displays (Hersteller)
#define RST_PIN -1 //geteilt mir Arduino Reset
//OLED-Display anlegen
SSD1306AsciiWire display1;
//Komunikations-Pins am Arduino UNO: A4(SDA), A5(SCL)
/*****************************************************************************************/
// Neopixel
//https://adafruit.github.io/Adafruit_NeoPixel/html/class_adafruit___neo_pixel.html
#include <Adafruit_NeoPixel.h> //Bibliothek
#ifdef __AVR__ //falls das Zusatzmodul Adafruit Trinket verwendet wird
#include <avr/power.h> // binde zusätzliche Bibliothek zur Stromversorgung ein
#endif
#define NEOPIN 9 //digitalen Pin für die Ansteuerung des NeoPixel
#define NUMPIXELS 12 //Anzahl der LEDs des NeoPixel
//Setup des Neopixel mittel vorheriger #defines
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NEOPIN, NEO_GRB + NEO_KHZ800);
/*****************************************************************************************/
//Ultraschall
#define TRIGGER 7 //Trigger (Auslösen des Signals)
#define ECHO 6 //Echon Empfang das Echo-Signals
#define MINENTF 5 //minimale Entfernung, die sicher ist
#define MaxENTF 150 //maximale Entfernung, die sicher ist
/*****************************************************************************************/
//Rotary Encoder
#include "EncoderTool.h"
using namespace EncoderTool; //
#define ENCPIN1 5
#define ENCPIN2 4
PolledEncoder enc; //pins ohne Interrupt -> polled Encoder -> tick um abzufragen
/*****************************************************************************************/
//Variablen
float entfernung = 0.0;
int maxPixel = 0; //hoechste Pixelnummer, fuer die leuchtenden Pixel
byte style = 2; //Wert fuer Darstellung NeoPixel
/*****************************************************************************************/
//Konstanten
const int pause = 500; //Wert für Pause am Ende von loop
const int highestPixel = NUMPIXELS - 1; //erspart meherere Berechnungen für NeoPixel
/*****************************************************************************************/
void setup() {
//serieller Monitor
Serial.begin(9600); //Initialisieren des seriellen Monitors
//Pin-Setup
pinMode(TRIGGER, OUTPUT); //Trigger-Pin Ausgang
pinMode(ECHO, INPUT); //Echo-Pin Eingang
//Encoder
setupRotEnc();
//Neopixel
setupNeopixel();
//OLED
setupDisplay();
delay(2000); //Pause
}
/*****************************************************************************************/
void loop() {
//Auswertung des Sensorwertes
setMaxPixelFromUSchall();
//Ausgabe Display
display1.clear();
setDisplay(); //Aufruf Unterprogramm
//Ausgabe NeoPixel
pixels.clear(); //setzt Konfiguraton der Pixel zurueck
setNeopixel(style); //Aufruf Unterprogramm
pixels.show(); //Anzeige der aktuellen Konfiguration
delay(pause); //warten
}