// darkroomtimer /* Arduino Nano Display I2C SDA:A4, SCL:A5 Encoder D2(interrupt) und D6 Taster D3 (interrupt) // Version 0.0 mit Mini Oled Display // Version 0.1 mit Rotary encodr und Taste // Version 0.2 with preset and countdown timer // Version 0.4 with potentiometer // Version 0.5 with green-blue ring counter removed // Version 0.7 with hardware PWM and Gate, poti für komtrast-Eingabe Ausgang Lampe weiss Ausgang Lampe Rot Analog read pot für kontrast 0-255 PWM grün / blau */ #include #include //OSC=16MHz const int hv_DriverPin = 9; // PWM output Gate const int greenLEDPin = 10; // LED connected to digital pin 10 const int gateLEDPin = 11; // LED connected to digital pin 11 const int whiteLEDPin = 12; // LED connected to digital pin 12 const int potPin = A0; // Select the input pin for the potentiometer const int HV_PulseWidth = 50; // 0...ICR1 int preset=5; // eingestellte Zeit in Sekunden, initialisiert als 5 int prev_preset=0; // Zeit beim letzten Durchgang volatile int counter=0; // Zähler für timer volatile int prev_counter=0; // letzterZählerstand volatile long unsigned int last_time = 0; // für Debouncing bool running=false; // 1 wenn zählt, 0 in Ruhe volatile bool A=false; // Hilfsvariablen volatile bool B=false; // für Encoder Serviceroutine int contrastValue=8; // Kontrast vom Poti #define enA_PIN 3 // Pin mit Interrupt am Arduino Nano #define enB_PIN 6 // 2. Encoder-Pin ohne Interrupt #define tastPIN 2 // Interrupt Pin für Tastendruck #include "U8glib.h" U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI MINI OLED auto timer = timer_create_default(); // create a timer with default settings Timer<> default_timer; // save as above // see example for arduino-timer library Timer<1, micros, const char *> u_timer; Timer<16, millis, const char *> t_timer; bool countdown(void *) { // countdown timer subroutine if (counter >0 ) {running=true; counter--;} else running=false; return true;} void setup() { pinMode(hv_DriverPin, OUTPUT); TCCR1A = 0; // disable all PWM on Timer1 whilst we set it up TCCR1B = 0; ICR1 = 100; // T periode 0...65535 // Configure timer 1 for Fast PWM mode via ICR1, with prescaling = 1 TCCR1A = (1 << WGM11); TCCR1B = (1 << WGM13) | (1< vorwärts zählen else {preset--;} // verschieden > rückwärts zählen last_time = millis(); } void taster () { // switch ISR if ((millis() - last_time) < 200) return; // debounce time is 200ms // Serial.println(" TASTER"); counter=preset; last_time = millis(); } void draw() { // write to display in this function u8g.setPrintPos(10,10); // Erste Zeile u8g.print("PRESET = "); u8g.print(preset); u8g.setPrintPos(10,25); // Zweite Zeile u8g.print("COUNTER = "); u8g.print(counter); u8g.setPrintPos(10,40); // Dritte Zeile u8g.print("Contrast = "); u8g.print(OCR1A); //PWM wert anzeigen u8g.setPrintPos(10,55); // Vierte Zeile u8g.print("RUNNING = "); u8g.print (running); u8g.setPrintPos(10,60); // unterste position, 15v Zeichen u8g.print("..............."); draw; } void loop() { // map potentiometer input to PWM ratio (0 =100%, 100 = 0%) contrastValue = map(analogRead(potPin),0,1000,0,100); // read the value from the potentiometer (0-1024) scale to 0-100 OCR1A=contrastValue; u8g.firstPage(); do { draw();} while( u8g.nextPage() ); // u8g magic mumbo jumbo draw; if (running){digitalWrite (whiteLEDPin,HIGH);} else {digitalWrite (whiteLEDPin,LOW);} timer.tick(); // tick the timer t_timer.tick(); u_timer.tick(); }