Utilizando DIP Switchs

Demonstro neste post como utilizar o componente DIP Switch para configurar o funcionamento de alguma funcionalidade do projeto.

Adquirido na Tayda  (preço por volta de US$ 0,27)

DIP-Switch-UL-RoHS-160-Series-

Utilizando os pinos do Arduino como INPUT_PULLUP poderemos obter o status de cada switch do componente separadamente.

Montei um exemplo com o esquema e código abaixo mostrando sua utilização para configurar qual sequencia de animação mostrar nos LEDs. Com isso você pode ter uma ideia de como pode utilizá-lo para configurar qualquer coisa no seu projeto.

Uma parte do código foi baseada em um vídeo que CeruleansBlue postou no seu canal do YouTube.

O funcionamento da rotina que obtém os dados é assim:

Para obter o status dos pinos do DIP Switch, basta chamar a função “bin2int” passando como primeiro parametro a quantidade de pinos que vão ser lidos e posteriormente a realação de cada pino. Estes pinos são os pinos do arquivo que estão ligados a cada switch do DIP switch.

No exemplo abaixo, existem 4 configurações possíveis

Dip   ON OFF OFF – Animação 1 (binario B100)

Dip OFF ON OFF – Animação 2 (binário B010)

Dip OFF OFF ON – Animação 3 (binário B001)

Dip ON ON OFF – Animação 4 (binário B110)

Dip ON OFF ON – Animação 5 (binário B101)

O quarto DIP indica quando ON que a velocidade de acendimento dos LEDs deve aumentar e quando OFF que deve usar a velocidade mais lenta.

Dip-Switch_bb

O código fonte abaixo demonstra o funcionamento.

#include "binary.h"

// Configuração dos pinos para cada LED
// Each LED pin
byte leds[8] = { 2,3,4,5,6,7,8,9 };

// Intervalo de acendimento dos leds
// Interval of leds animation
int interval = 250;
int speedCfg = 0;

// Routine that read the DIP Switch configuration
int bin2int(int numvalues, ...)
{
	int total = 0;
	va_list values;
	va_start(values, numvalues);

	for(;numvalues > 0; numvalues--)
		if (!(digitalRead(va_arg(values, int))) )
			total += powint(2, numvalues-1);

	va_end(values);
	return total;

}

int powint(int base, int exponent)
{
	int result = 1;
	for(;exponent > 0; exponent--)
		result *= base;
	return result;
}

void setup() {
  // Inicializa todos os LEDs
  for(int idx=0; idx < 8; idx++)
    pinMode(leds[idx], OUTPUT);

  // Inicializa os pinos do DIP Switch como INPUT_PULLUP
  pinMode(A0, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
}

int config = 0;

void TurnOffLeds()
{
  for(int idx = 0; idx < 8; idx++)
  {
    digitalWrite(leds[idx], LOW);
  }
}

void Anim1()
{
  for(int idx = 0; idx < 8; idx++)      {     if (idx-1 >= 0)
      digitalWrite(leds[idx-1], LOW);

    digitalWrite(leds[idx], HIGH);
    delay(interval);
  }
}

void Anim2()
{
  for(int idx = 7; idx >= 0; idx--)
  {
    if (idx+1 <= 7)
      digitalWrite(leds[idx+1], LOW);

    digitalWrite(leds[idx], HIGH);
    delay(interval);
  }
}

void Anim3()
{
  for(int i = 0; i < 4; idx++)
  {
    digitalWrite(leds[idx], HIGH);
    digitalWrite(leds[7-idx], HIGH);
    delay(interval);
  }
}

void Anim4() {
  for(int idx = 0; idx < 8; idx++)
  {
      digitalWrite(leds[idx], HIGH);
      delay(interval);
  }

  for(int idx = 7; idx <= 0; idx--)
  {
     digitalWrite(leds[idx], LOW);
     delay(interval);
  }
}

void Anim5() {
  for(int idx = 0; idx < 8; idx++)
  {
     digitalWrite(leds[idx], HIGH);
     delay(interval);
  }

  for(int idx = 0; idx < 8; idx++)
  {
     digitalWrite(leds[idx], LOW);
     delay(interval);
  }
}

void loop() {
  // Get status of 3 pins. The 13, 12 and 11 (arduino pins)
  // Obtém o status de 3 pinos. O pino 13,12 e 11 (pinos do arduino)
  config = bin2int(3, A0,12,11);

  // Get the status of just 1 pin. The 10 (arduino).
  // This is the pin that defines the speed of animation
  speedCfg  = bin2int(1, 10);

  // If the pin of speed if ON then change to a faster speed
  // otherwise stay with the default slower speed
  if (speedCfg == 1)
    interval = 125;
  else
    interval = 250;

  TurnOffLeds();

  // Check each available configuration and play
  // Here I check the result as binary to make it easier to understand
  if (config == B100)
    Anim1();

  if (config == B010)
    Anim2();

  if (config == B001)
    Anim3();

  if (config == B110)
    Anim4();

  if (config == B101)
    Anim5();
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s