#include #include #include //fertiger Code, der funktioniert f�r rgb mit attiny85 #define LED_Blau PCINT0 #define PIN_EIN PCINT2 #define PIN_AUS 1 #define LED_Gruen 4 #define LED_Rot 3 int led2Timeout[] = { 300, 2700, 300, 2700, 300, 8700, 300, 8700 }; // 300, 2700, 300, 2700, 300, 8700, 300, 8700 int led2Phases = 8; int led2Phase = 0; int led2State = 1; long led2Timer = 0; int i = 0; int j = 0; ISR(PCINT0_vect) {} OneButton TasterEIN(1, false); bool button_Aus = LOW; bool button_EIN = LOW; bool schlafen = LOW; int LED[] = { LED_Blau, LED_Gruen, LED_Rot }; void setup() { pinMode(LED_Blau, OUTPUT); pinMode(PIN_EIN, INPUT_PULLUP); pinMode(LED_Gruen, OUTPUT); pinMode(LED_Rot, OUTPUT); pinMode(PIN_AUS, INPUT_PULLUP); TasterEIN.attachClick(Ein_Click); TasterEIN.attachDoubleClick(Doppel_Click); TasterEIN.attachDuringLongPress(Langer_Click); led2Timer = millis(); // pin change interrupt PCMSK |= bit(PIN_EIN); GIFR |= bit(PCIF); // clear any outstanding interrupts GIMSK |= bit(PCIE); // enable pin change interrupts } void loop() { TasterEIN.tick(); if (j == 0) { if (i == 0 || i == 1 || i == 2) { digitalWrite(LED[i], LOW); } if (i == 3) { digitalWrite(LED[0], LOW); digitalWrite(LED[1], LOW); digitalWrite(LED[2], LOW); } } if (j == 1) { if (i == 0 || i == 1 || i == 2) { if (millis() > led2Timer + led2Timeout[led2Phase]) { // pr�ft den Timer led2Phase++; // erh�ht die Leuchtphase um 1 if (led2Phase > led2Phases - 1) { // falls Leuchtphasenmaximum �berschritten led2Phase = 0; // Leuchtphase zur�cksetzen } led2Timer = millis(); // Timer resetten led2State *= (-1); // LED Zustand wird umgekehrt if (led2State > 0) digitalWrite(LED[i], LOW); // wenn LED Zustand > 0, schalte LED ein else digitalWrite(LED[i], HIGH); // wenn LED Zustand < 0, schalte LED aus } } if (i == 3) { if (millis() > led2Timer + led2Timeout[led2Phase]) { // pr�ft den Timer led2Phase++; // erh�ht die Leuchtphase um 1 if (led2Phase > led2Phases - 1) { // falls Leuchtphasenmaximum �berschritten led2Phase = 0; // Leuchtphase zur�cksetzen } led2Timer = millis(); // Timer resetten led2State *= (-1); // LED Zustand wird umgekehrt if (led2State > 0) { digitalWrite(LED[0], LOW); digitalWrite(LED[1], LOW); digitalWrite(LED[2], LOW); }// wenn LED Zustand > 0, schalte LED ein else { digitalWrite(LED[0], HIGH); digitalWrite(LED[1], HIGH); digitalWrite(LED[2], HIGH); // wenn LED Zustand < 0, schalte LED aus } } } } if (schlafen == HIGH) { schlafen = LOW; digitalWrite(LED_Blau, HIGH); digitalWrite(LED_Gruen, HIGH); digitalWrite(LED_Rot, HIGH); goToSleep(); } } void goToSleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); ADCSRA = 0; // turn off ADC power_all_disable(); // power off ADC, Timer 0 and 1, serial interface sleep_enable(); sleep_cpu(); sleep_disable(); power_all_enable(); // power everything back on } void Ein_Click() { i++; digitalWrite(LED[0], HIGH); digitalWrite(LED[1], HIGH); digitalWrite(LED[2], HIGH); if (i == 4) { i = 0; } } void Langer_Click() { schlafen = HIGH; } void Doppel_Click() { j++; digitalWrite(LED[0], HIGH); digitalWrite(LED[1], HIGH); digitalWrite(LED[2], HIGH); if (j == 2) { j = 0; } }