/*
ledbar color setting
for OVMV module Okegem
via 4 push buttons
07/08/2013 Valentijn
red 255,0,0
green 0,255,0
blue 0,0,255
yellow 255,255,0
white 255,255,255
purple 128,0,255 / 80,0,80
off 0,0,0
aqua 0,255,255
*/
#define F_CPU 100000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>
#define DEBOUNCE_TIME 25 /* time to wait while "de-bouncing" button */
#define LOCK_INPUT_TIME 250 /* time to wait after a button press */
#define numberOfButtons 2
//Aliassen voor de PWM kanalen
#define PWM_RED OCR1BL // 16 - PB2
#define PWM_GREEN OCR1AL // 15 - PB3
#define PWM_BLUE OCR0A // 14 - PB4
#define PWM_WHITE OCR0B // 9 - PD5
#ifndef ButtonPress
#define ButtonPress
char ButtonPressed(int buttonNumber, unsigned char pinOfButton, unsigned char portBit, int confidenceLevel);
char Pressed[numberOfButtons];
int Pressed_Confidence_Level[numberOfButtons]; //Measure button press cofidence
int Released_Confidence_Level[numberOfButtons]; //Measure button release confidence
char ButtonPressed(int buttonNumber, unsigned char pinOfButton, unsigned char portBit, int confidenceLevel)
{
if (bit_is_clear(pinOfButton, portBit))
{
Pressed_Confidence_Level[buttonNumber] ++; //Increase Pressed Conficence
Released_Confidence_Level[buttonNumber] = 0; //Reset released button confidence since there is a button press
if (Pressed_Confidence_Level[buttonNumber] > confidenceLevel) //Indicator of good button press
{
if (Pressed[buttonNumber] == 0)
{
Pressed[buttonNumber] = 1;
return 1;
}
//Zero it so a new pressed condition can be evaluated
Pressed_Confidence_Level[buttonNumber] = 0;
}
}
else
{
Released_Confidence_Level[buttonNumber] ++; //This works just like the pressed
Pressed_Confidence_Level[buttonNumber] = 0; //Reset pressed button confidence since the button is released
if (Released_Confidence_Level[buttonNumber] > confidenceLevel)
{
Pressed[buttonNumber] = 0;
Released_Confidence_Level[buttonNumber] = 0;
}
}
return 0;
}
#endif
void delay_ms(unsigned int t)
{
while(t)
{
t--;
_delay_ms(1);
}
}
void set_color(unsigned int r, unsigned int g, unsigned int b)
{
PWM_RED = r;
PWM_GREEN = g;
PWM_BLUE = b;
delay_ms(100);
}
int main()
{
int red,green,blue;
// TIMER 0 Fast PWM, clear OC0A on match
TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
// TIMER 0 Prescaler ck/8
TCCR0B = (1 << CS01);
// TIMER 1 Fast PWM 8-bit, clear OC1A, OC1B on match
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
// TIMER 1 Prescaler ck/8
TCCR1B = (1 << CS11) | (1 << WGM12);
//PWM kanalen als uitgang
DDRB = (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PD5); //0C0A, 0C1A, OC1B
DDRD = 0b00000000;
PORTD |= (1 << PIND0) | (1 << PIND1) | (1 << PIND2) | (1 << PIND3); // set to high
// initial color values
red=0; green=0; blue=255; // blue
//oneindige RGB fade loop
while(1)
{
set_color(red, green, blue);
if (ButtonPressed(0, PIND, 0, 50))
{
//delay_ms(LOCK_INPUT_TIME);
red=255; green=255; blue=255; // white
}
if (ButtonPressed(1, PIND, 1, 50))
{
//delay_ms(LOCK_INPUT_TIME);
red=128; green=0; blue=255; // purple
}
if (ButtonPressed(2, PIND, 2, 50))
{
//delay_ms(LOCK_INPUT_TIME);
red=255; green=255; blue=0; // yellow
}
if (ButtonPressed(3, PIND, 3, 50))
{
//delay_ms(LOCK_INPUT_TIME);
red=0; green=255; blue=255; // aqua
}
}
return 0;
}