changed functionality for Attiny84

This commit is contained in:
sublunarspace 2020-06-03 15:19:12 +02:00
parent 76f1e71b5a
commit 74648bb968

View file

@ -25,103 +25,54 @@ SOFTWARE.
*/ */
#define Attiny 261 //84 or 261 #include "OneButton.h"
#if Attiny == 261 #define btnA 0 //PA0 / Button A:
#define btnA 9 //PB0 / Button A: #define btnB 2 //PA1 / Button B:
#define btnB 8 //PB1 / Button B: #define btnC 1 //PA2 / Button C:
#define btnC 13 //PA7 / Button C: #define led_R 4 //PA4 / RED LED
#define led_R 12 //PA6 / RED LED #define led_G 5 //PA5 / GREEN LED
#define led_G 14 //PA3 / GREEN LED #define led_B 6 //PA6 / BLUE LED
#define led_B 1 //PA1 / BLUE LED #define uv_LED 3 //PA3 / UV LED
#define uv_LED 6 //PB3 / UV LED #define OPAMP 8 //PB2 / turns on the Op Amp circuit
#define OPAMP 3 //PB6 / turns on the Op Amp circuit #define ANALOG 7 //PA7 / Get analog
#endif
#if Attiny == 84
#define btnA 6 //PA4 / Button A:
#define btnB 5 //PA5 / Button B:
#define btnC 4 //PA6/ Button C:
#define led_R 10 //PA0 / RED LED
#define led_G 9 //PA1/ GREEN LED
#define led_B 8 //PA2 / BLUE LED
#define uv_LED 7 //PA3 / UV LED
#define OPAMP 3 //PA7 / turns on the Op Amp circuit
#define ANALOG 2 //PB2 // Get analog
#endif
#define ON HIGH #define ON HIGH
#define OFF LOW #define OFF LOW
//---- BUTTONS ---- //---- BUTTONS ----
byte counterA = 0; //count push btnA: byte counterA = 0; //count push btnA:
byte counterB = 0; //count push btnB:
byte counterC = 0; //count push btnC: byte counterC = 0; //count push btnC:
bool enabled_btnAC = true; //Button A + C enabled or not bool enabled_btnAC = true; //Button A + C enabled or not
bool enabled_btnB = true; //Button B enabled or not bool enabled_btnB = true; //Button B enabled or not
static bool last_btnA = false; //Previous state of button A
static bool last_btnB = false; //Previous state of button B OneButton buttonA(btnA, true); //Button A setup
static bool last_btnC = false; //Previous state of button C OneButton buttonB(btnB, true); //Button B setup
OneButton buttonC(btnC, true); //Button C setup
//---- LEDS ---- //---- LEDS ----
bool enabled_LED = false; //turn on a tricolor LED bool enabled_LED = false; //turn on a tricolor LED
bool was_on_LED = false; //was LED on? bool was_on_LED = false; //was LED on?
bool usePWM = false; //use softPWM for more nuanced colors bool usePWM = false; //use softPWM for more nuanced colors
bool dimmer = false; //LED brightness follows analog input signal
void offLeds() {
analogWrite(led_R, 255);
analogWrite(led_B, 255);
analogWrite(led_G, 255);
}
//---- TIMER ---- //---- TIMER ----
bool countDelay = false; //are we counting ticks to time out the UV LEDs? bool countDelay = false; //are we counting ticks to time out the UV LEDs?
static uint32_t delayCount = 0; uint32_t oldTime = millis();
#if Attiny == 84
uint32_t oldTime = millis();
#endif
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
//---- COLOR ---- //---- COLOR ----
struct COLOR { //Creating structure for colors struct COLOR { //Creating structure for colors
byte r; byte r;
byte g; byte g;
byte b; byte b;
}; };
COLOR selectedColor = { 0 , 0 , 0 }; COLOR selectedColor = { 0, 0, 0 };
void setColor(COLOR paint, bool full = true) {
//tricolor LED color
selectedColor = paint;
selectedColor.r = paint.r;
selectedColor.b = paint.b;
selectedColor.g = paint.g;
//paint contains r g b value for pwm on pins
showColor();
}
void showColor() { // 100% of color
if (enabled_LED == true) {
#if Attiny == 84
byte full = 100;
if( dimmer == true ){
full = (255 / analogRead(ANALOG)) * full;
}
softPWM(led_R, selectedColor.r - ((selectedColor.r / full) * full), 1);
softPWM(led_B, selectedColor.b - ((selectedColor.b / full) * full) , 1);
softPWM(led_G, selectedColor.g - ((selectedColor.g / full) * full) , 1);
#else
softPWM(led_R, selectedColor.r, 1);
softPWM(led_B, selectedColor.b, 1);
softPWM(led_G, selectedColor.g, 1);
#endif
} else {
offLeds();
}
}
//---- PLANETARY COLORS ---- //---- PLANETARY COLORS ----
COLOR white = { 255 , 255 , 255 }; //Moon correspondence COLOR white = { 255 , 255 , 255 }; //Moon correspondence
COLOR orange = { 255 , 128 , 0 }; //Mercury correspondence COLOR orange = { 255 , 128 , 0 }; //Mercury correspondence
COLOR green = { 0 , 255 , 0 }; //Venus correspondence COLOR green = { 0 , 255 , 0 }; //Venus correspondence
@ -135,105 +86,72 @@ COLOR grey = { 40 , 40 , 40 }; //Saturn correspondence
//---- DEVICE SETUP ---- //---- DEVICE SETUP ----
void setup() { void setup() {
//Buttons // BUTTONS
pinMode(btnA, INPUT); buttonA.attachClick(cycleColors);
pinMode(btnB, INPUT); buttonB.attachLongPressStart(ultraviolet);
pinMode(btnC, INPUT); buttonC.attachLongPressStart(opAmp);
//LEDS // LEDS
pinMode(led_B, OUTPUT); pinMode(led_B, OUTPUT);
pinMode(led_G, OUTPUT); pinMode(led_G, OUTPUT);
pinMode(led_R, OUTPUT); pinMode(led_R, OUTPUT);
offLeds(); offLeds();
//UV LED // UV LED
pinMode(uv_LED, OUTPUT); pinMode(uv_LED, OUTPUT);
digitalWrite(uv_LED, OFF); digitalWrite(uv_LED, OFF);
// OP AMP // OP AMP
#if Attiny == 84
pinMode(ANALOG, INPUT); pinMode(ANALOG, INPUT);
#endif
pinMode(OPAMP, OUTPUT); pinMode(OPAMP, OUTPUT);
digitalWrite(OPAMP, OFF); digitalWrite(OPAMP, OFF);
} }
//---- DEVICE LOOP ---- //---- DEVICE LOOP ----
void loop() { void loop() {
// Detect and debounce button presses buttonA.tick();
if ( (millis() - lastDebounceTime) > debounceDelay) { buttonB.tick();
buttonC.tick();
//Button A:
bool pressed_btnA = !digitalRead(btnA);
if (pressed_btnA != last_btnA ) {
if (pressed_btnA == true) {
counterA++;
if (counterA > 10)counterA = 1;
pressButton_A();
}
last_btnA = pressed_btnA;
}
//Button B:
bool pressed_btnB = !digitalRead(btnB);
if (pressed_btnB != last_btnB ) {
if (pressed_btnB == true) {
counterB++;
if (counterB > 2)counterB = 1;
pressButton_B();
}
last_btnB = pressed_btnB;
}
//Button C:
bool pressed_btnC = !digitalRead(btnC);
if (pressed_btnC != last_btnC ) {
if (pressed_btnC == true) {
counterC++;
#if Attiny == 84
if (counterC > 4)counterC = 1;
#else
if (counterC > 2)counterC = 1;
#endif
pressButton_C();
}
last_btnC = pressed_btnC;
}
lastDebounceTime = millis(); //set the current time
}
showColor(); showColor();
//Counts up and turns UV LED off after 1min if ( countDelay == true && ((millis()-oldTime) > 60000)) { //If enabled, turns UV LED off after 1min
#if Attiny == 261
if (countDelay == true) {
delayCount++;
counterB = 1;
}
else delayCount = 0;
if (delayCount > 1200000) {
#endif
#if Attiny == 84
if ( countDelay == true && ((millis()-oldTime) > 60000)) {
#endif
//Turn the UV LED off //Turn the UV LED off
digitalWrite(uv_LED, LOW); digitalWrite(uv_LED, LOW);
countDelay = false; countDelay = false;
//Reenable all buttons
enabled_btnAC = true;
//LED Status back to before Button B was pushed
enabled_LED = was_on_LED;
} }
} }
//---- BUTTON STATE MACHINE FUNCTIONS //---- FUNCTIONS ----
//Button A:
void pressButton_A() { void offLeds() {
if (enabled_btnAC == false) { analogWrite(led_R, 255);
counterA = 0; analogWrite(led_B, 255);
return;//Chek if button is disabled analogWrite(led_G, 255);
}
void setColor(COLOR paint, bool full = true) {
//tricolor LED color
selectedColor.r = paint.r;
selectedColor.b = paint.b;
selectedColor.g = paint.g;
showColor();
}
void showColor() { // 100% of color
if (enabled_LED == true) {
softPWM(led_R, selectedColor.r, 1);
softPWM(led_B, selectedColor.b, 1);
softPWM(led_G, selectedColor.g, 1);
} else {
offLeds();
} }
}
void cycleColors() {
counterA++;
if (enabled_btnAC == true) {
switch (counterA) { switch (counterA) {
case 1: case 1:
enabled_LED = true; enabled_LED = true;
@ -271,78 +189,52 @@ void pressButton_A() {
counterA = 0;//TURN OFF counterA = 0;//TURN OFF
break; break;
} }
}
} }
//Button B: void ultraviolet() {
void pressButton_B() { if (enabled_btnB == true) {
if (enabled_btnB == false) { blinker(led_B, 500, 5);
counterB = 0; if ( digitalRead(btnA) == LOW ) {
blinker(led_B, 50, 10);
enabled_btnB = false;
enabled_btnAC = false;
countDelay = false;
digitalWrite(uv_LED, ON);
return; return;
} }
if (counterB == 1) { //1st press:
//was color LED on when button was pushed?
was_on_LED = enabled_LED;
//Disable LED and buttons A and C
enabled_LED = false;
counterA = 0;
counterC = 0;
enabled_btnAC = false;
enabled_btnB == false;
//Turn off Op-Amp circuit
digitalWrite(OPAMP, OFF);
enabled_btnB == true;
digitalWrite(uv_LED, ON); digitalWrite(uv_LED, ON);
#if Attiny == 84
if ( countDelay == false ) { if ( countDelay == false ) {
oldTime = millis(); oldTime = millis();
} }
#endif
countDelay = true; // turn on delay counter in loop() countDelay = true; // turn on delay counter in loop()
} }
if (counterB == 2) { //2nd press:
if (digitalRead(uv_LED) == ON) {
//Turn UV LED off
digitalWrite(uv_LED, OFF);
}
//Re-enable all buttons
enabled_btnAC = true;
enabled_btnB = true;
//LED Status back to before Button B was pushed
enabled_LED = was_on_LED;
//reset delay counter
countDelay = false;
}
} }
//Button C: void opAmp() {
void pressButton_C() { if (enabled_btnAC == true) {
if (enabled_btnAC == false) { counterC++;
if (counterC == 1) { //1st press:
blinker(led_G, 50, 2);
digitalWrite(OPAMP, ON);
}
if (counterC == 2) { //2nd press:
blinker(led_R, 50, 2);
digitalWrite(OPAMP, OFF);
counterC = 0; counterC = 0;
return;
} }
#if Attiny == 84
if (counterC == 1) { //1st press:
dimmer = true;
} }
if (counterC == 2) { //2nd press: }
dimmer = false;
digitalWrite(OPAMP, ON); void blinker(byte pin, int len, byte rep) {
byte counter = 1;
while (counter <= rep) {
analogWrite(pin, 0);
delay(len);
offLeds();
delay(len);
counter++;
} }
if (counterC == 3) { //3rd press:
dimmer = true;
digitalWrite(OPAMP, ON);
}
if (counterC == 4) { //2nd press:
digitalWrite(OPAMP, OFF);
}
#else
if (counterC == 1) { //1st press:
digitalWrite(OPAMP, ON);
}
if (counterC == 2) { //2nd press:
digitalWrite(OPAMP, OFF);
}
#endif
} }
//---- SOFTWARE PWM ---- //---- SOFTWARE PWM ----