Comunicação Serial - GuilhermeLaurente/DebreixDigital GitHub Wiki

#define clk_1 3
#define dt_1 7
volatile int encoder_1 = 0;
bool escSerial_1 = false;
int sw_1 = 6;
unsigned short int sw_1_counter = 0;

#define clk_2 2
#define dt_2 4
volatile int encoder_2 = 0;
bool escSerial_2 = false;
int sw_2 = 5;
unsigned short int sw_2_counter = 0;

Define as variáveis de cada um dos pinos dos dois encoders, como exposto na tabela a seguir, além de uma variável booleana iniciada em false e uma variável inteira para carregar a contagem dos push buttons de cada encoder.

Rotary Encoder Arduino
CLK 1 pino 3 (INT1)
DT 1 pino 7
SW 1 pino 6
CLK 2 pino 2 (INT2)
DT 2 pino 4
SW 2 pino 5
const int led_R = 10;
const int led_G = 9;
const int led_B = 11;

Define os pinos do LED RGB conectados ao arduino, como na tabela a seguir:

LED RGB Arduino
R pino 10
G pino 9
B pino 11
void setup()
{
  [...]
}

A função setup() é executada uma única vez no início do código.

  pinMode(clk_1, INPUT);
  pinMode(dt_1, INPUT);
  pinMode(sw_1, INPUT_PULLUP);

  pinMode(clk_2, INPUT);
  pinMode(dt_2, INPUT);
  pinMode(sw_2, INPUT_PULLUP);

  pinMode(led_R, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(led_B, OUTPUT);

Define como INPUT os pinos relacionados ao encoder, sendo o push button como INPUT_PULLUP, e os pinos relacionados ao LED RGB como OUTPUT.

  Serial.begin(9600);
  while (!Serial);

Inicia a conexão com o monitor serial na velocidade de 9600 e mantém conectado enquanto houver possibilidade.

  attachInterrupt(0, clk_1_int, FALLING);
  attachInterrupt(1, clk_2_int, FALLING);

Relaciona as variáves clk_1_int e clk_2_int com os pinos de interrupção e define a mudança

void loop()
{
  if (digitalRead(sw_1) == LOW)
  {
    sw_1_counter++;
    encoder_1 = 0;
    encoder_2 = 0;
    Serial.print(encoder_2, DEC);
    Serial.print(",");
    Serial.print(encoder_1, DEC);
    Serial.print(",");
    Serial.print(sw_1_counter);
    Serial.print(",");
    Serial.println(sw_2_counter);

//      digitalWrite(9, LOW);
//      digitalWrite(10, LOW);
     digitalWrite(11, LOW);

    while (digitalRead(sw_1) == LOW);

    delay (100);
  }
  if (escSerial_1 == true)
  {
    escSerial_1 = false;
    Serial.print(encoder_2, DEC);
    Serial.print(",");
    Serial.print(encoder_1, DEC);
    Serial.print(",");
    Serial.print(sw_1_counter);
    Serial.print(",");
    Serial.println(sw_2_counter);

  }

  if (digitalRead(sw_2) == LOW)
  {
    sw_2_counter++;
    encoder_1 = 0;
    encoder_2 = 0;
    Serial.print(encoder_2, DEC);
    Serial.print(",");
    Serial.print(encoder_1, DEC);
    Serial.print(",");
    Serial.print(sw_1_counter);
    Serial.print(",");
    Serial.println(sw_2_counter);

//      digitalWrite(9, LOW);
//     digitalWrite(10, LOW);
         digitalWrite(11, LOW);

    while (digitalRead(sw_2) == LOW);

    delay (100);
  }
  if (escSerial_2 == true)
  {
    escSerial_2 = false;
    Serial.print(encoder_2, DEC);
    Serial.print(",");
    Serial.print(encoder_1, DEC);
    Serial.print(",");
    Serial.print(sw_1_counter);
    Serial.print(",");
    Serial.println(sw_2_counter);
  }

  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

}

void clk_1_int (void)
{
  // digitalWrite(9, LOW);
  //digitalWrite(10, LOW);
  //digitalWrite(11, LOW);

  if (digitalRead(dt_1) == HIGH)
  {
    encoder_1 ++ ;
    digitalWrite(9, LOW);
  } else {
    encoder_1 -- ;
    digitalWrite(10, LOW);
  }
  escSerial_1 = true;
}

void clk_2_int (void)
{
  //digitalWrite(9, LOW);
  //digitalWrite(10, LOW);
  //digitalWrite(11, LOW);

  if (digitalRead(dt_2) == HIGH)
  {
    encoder_2 ++ ;
    digitalWrite(9, LOW);
  } else {
    encoder_2 -- ;
    digitalWrite(10, LOW);
  }
  escSerial_2 = true;
}