Перейти к содержанию

Loser7

Members
  • Постов

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Loser7

  1. В первом приближении:

    /* 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;
      }
    }

     

×
×
  • Создать...