В первом приближении:
/* Encoder Library - NoInterrupts Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/
// If you define ENCODER_DO_NOT_USE_INTERRUPTS *before* including
// Encoder, the library will never use interrupts. This is mainly
// useful to reduce the size of the library when you are using it
// with pins that do not support interrupts. Without interrupts,
// your program must call the read() function rapidly, or risk
// missing changes in position.
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
// Beware of Serial.print() speed. Without interrupts, if you
// transmit too much data with Serial.print() it can slow your
// reading from Encoder. Arduino 1.0 has improved transmit code.
// Using the fastest baud rate also helps. Teensy has USB packet
// buffering. But all boards can experience problems if you print
// too much and fill up buffers.
// Change these two numbers to the pins connected to your encoder.
// With ENCODER_DO_NOT_USE_INTERRUPTS, no interrupts are ever
// used, even if the pin has interrupt capability
#define MAX_COLOR_VALUE 255
#define RED_PIN 9 // Пин красного цвета
#define GREEN_PIN 10 // Пин зеленого цвета
#define BLUE_PIN 11 // Пин синего цвета
#define BUTT_PIN 4 // Пин кнопки энкодера: кнопка подключается между этим пином и GND
#define SENS 0 // Чуствительность энкодера: больше число - меньше чуствительность
#define iter 10 // Шаг изменения яркости на клик энкодера
int8_t stage = 0, bMode = 0;
int16_t red = MAX_COLOR_VALUE, green = 0, blue = 0;
Encoder myEnc( 5, 6 ); // Пины энкодера
void setup() {
Serial.begin(115200);
pinMode( BUTT_PIN, INPUT_PULLUP );
}
long position = 0;
int butPrev = 1;
void loop() {
long newPos = myEnc.read();
if ( abs( newPos - position ) > SENS )
{
if ( newPos > position )
stepUp();
else
stepDown();
position = newPos;
setLED();
}
/////////////////////////////// Кнопка
int but = digitalRead( BUTT_PIN );
if ( but != butPrev )
{
if ( but == 0 )
{
Serial.println( "Button pressed" );
if ( bMode == 0 )
{
red = green = blue = MAX_COLOR_VALUE;
setLED();
bMode = 1;
}
else
{
red = green = blue = 0;
setLED();
bMode = 0;
}
}
butPrev = but;
}
}
void status()
{
Serial.print( "Stage: " );
Serial.print( stage );
Serial.print( " R: " );
Serial.print( red );
Serial.print( " G: " );
Serial.print( green );
Serial.print( " B: " );
Serial.println( blue );
}
void setLED()
{
status();
analogWrite( RED_PIN, red );
analogWrite( GREEN_PIN, green );
analogWrite( BLUE_PIN, blue );
}
void stepUp()
{
switch( stage )
{
case 0: red = MAX_COLOR_VALUE; blue = 0;
green = min( green + iter, MAX_COLOR_VALUE );
if ( green >= MAX_COLOR_VALUE ) stage++;
break;
case 1: green = MAX_COLOR_VALUE; blue = 0;
red = max( red - iter, 0 );
if ( red == 0 ) stage++;
break;
case 2: green = MAX_COLOR_VALUE; red = 0;
blue = min( blue + iter, MAX_COLOR_VALUE );
if ( blue >= MAX_COLOR_VALUE ) stage++;
break;
case 3: blue = MAX_COLOR_VALUE; red = 0;
green = max( green - iter, 0 );
if ( green == 0 ) stage++;
break;
case 4: blue = MAX_COLOR_VALUE; green = 0;
red = min( red + iter, MAX_COLOR_VALUE );
if ( red >= MAX_COLOR_VALUE ) stage++;
break;
case 5: red = MAX_COLOR_VALUE; green = 0;
blue = max( blue - iter, 0 );
if ( blue == 0 ) stage = 0;
break;
}
}
void stepDown()
{
switch( stage )
{
case 0: red = MAX_COLOR_VALUE; blue = 0;
green = max( green - iter, 0 );
if ( green == 0 ) stage = 5;
break;
case 1: green = MAX_COLOR_VALUE; blue = 0;
red = min( red + iter, MAX_COLOR_VALUE );
if ( red >= MAX_COLOR_VALUE ) stage--;
break;
case 2: green = MAX_COLOR_VALUE; red = 0;
blue = max( blue - iter, 0 );
if ( blue == 0 ) stage--;
break;
case 3: blue = MAX_COLOR_VALUE; red = 0;
green = min( green + iter, MAX_COLOR_VALUE );
if ( green >= MAX_COLOR_VALUE ) stage--;
break;
case 4: blue = MAX_COLOR_VALUE; green = 0;
red = max( red - iter, 0 );
if ( red == 0 ) stage--;
break;
case 5: red = MAX_COLOR_VALUE; green = 0;
blue = min( blue + iter, MAX_COLOR_VALUE );
if ( blue >= MAX_COLOR_VALUE ) stage--;
break;
}
}