Novato dificultando o uso de Switch Case

Vi um código que usava "SWITCH CASE" com Serial.read (desde que o programador se comunicasse diretamente pelo teclado), minha dúvida é se em alguma instância eu consigo fazer ele ler a tela SERIAL de tempos em tempos e se atualizar.

(Sim, dava pra acender os LEDs somente com if/else/else if, mas eu queria me desafiar a entender SWITCH CASE de forma mais complicada risos)

O erro que meu código está entregando é o seguinte, somente o LED Amarelo acende, no caso o "ledPIN1", na porta 11.

float   valorLido = A0;
byte       pinoLDR = 0;
const int   ledPIN = 9;
const int ledPIN1 = 11;
const int ledPIN2 = 13;
char              data;
int             option;


void setup() {
 
  pinMode      (pinoLDR, INPUT);
  pinMode     (ledPIN , OUTPUT);
  pinMode    (ledPIN1 , OUTPUT);
  pinMode    (ledPIN2 , OUTPUT);
  Serial.begin           (9600);
  delay                   (100);

}
 
void loop(){

  valorLido = analogRead(pinoLDR);
  Serial.println      (valorLido);
  delay                     (500);
  data =            Serial.read();
  delay                     (500);
  
      if(data <= 200.00)
  {
      option = 0;
  }
      else if(data <= 400.00)
  {
      option = 1;
  }
      else if(data >= 401.00)
  {
      option = 2;
  }
      switch (option)
  {
        case 0: // GREEN ON IF DATA = 200 OR LESS
      digitalWrite(ledPIN, HIGH);
      delay(500);
      digitalWrite(ledPIN1, LOW);
      digitalWrite(ledPIN2, LOW);
    break;

        case 1: // YELLOW ON IF DATA BETWEEN 201 AND 400
      digitalWrite(ledPIN1, HIGH);
      delay(500);
      digitalWrite(ledPIN, LOW);
      digitalWrite(ledPIN2, LOW);
    break;

        case 2: // RED ON IF DATA IS GREATER THAN 401
      digitalWrite(ledPIN2, HIGH);
      delay(500);
      digitalWrite(ledPIN, LOW);
      digitalWrite(ledPIN1, LOW);
    break;   
  }
}

Olá! Bem vindo ao Forum.

Notei duas questões no seu programa.

  1. Essas duas condições estão se sobrepondo:

Afinal, toda vez que a variável data é menor que 200, ela é menor que 400 também, fazendo com que o switch caia quase sempre na opção 1. Você precisa ajustar o if da opção 1 para ficar entre 200.01 e 400.00.

  1. a variável data está armazenando o caracter que você digitar na Serial. Eu estou entendendo que o que você queria colocar na comparação era o valor da leitura do LDR. Se for esse o caso, a comparação deveria ser com "valorLido" e não com "data".

Uma pergunta extra: embora o LDR tenha leitura analógica, você precisa mesmo de duas casas decimais? Se não precisa, declare "valorLido" como int.

Divirta-se! :upside_down_face:

Voce pode simplificar seu código fazendo o switch assim:

float   valorLido = A0;
byte       pinoLDR = 0;
const int   ledPIN = 9;
const int ledPIN1 = 11;
const int ledPIN2 = 13;
char              data;
//--------------------------------------------------------------
void setup() {
  pinMode      (pinoLDR, INPUT);
  pinMode     (ledPIN, OUTPUT);
  pinMode    (ledPIN1, OUTPUT);
  pinMode    (ledPIN2, OUTPUT);
  Serial.begin           (9600);
  delay                   (100);
}
//--------------------------------------------------------------
void loop() {

  valorLido = analogRead(pinoLDR);
  Serial.println      (valorLido);
  delay                     (500);
  data =            Serial.read();
  delay                     (500);
  switch (int(valorLido))
  {
    case 0 ... 200: // GREEN ON IF DATA = 200 OR LESS
      digitalWrite(ledPIN, HIGH);
      delay(500);
      digitalWrite(ledPIN1, LOW);
      digitalWrite(ledPIN2, LOW);
      break;

    case 201 ...400: // YELLOW ON IF DATA BETWEEN 201 AND 400
      digitalWrite(ledPIN1, HIGH);
      delay(500);
      digitalWrite(ledPIN, LOW);
      digitalWrite(ledPIN2, LOW);
      break;

    case 401 ...1023: // RED ON IF DATA IS GREATER THAN 401
      digitalWrite(ledPIN2, HIGH);
      delay(500);
      digitalWrite(ledPIN, LOW);
      digitalWrite(ledPIN1, LOW);
      break;
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.