Estrutura switch case

boa noite. sou novo por aqui, mas vejo que tem muitas pessoas interessadas em ajudar. Estou como problema de código no switch case. estou iniciando um projeto simples se irrigação e queria fazê-lo com a estrutura switch case.
apenas queria fazer com que, dependendo do comando case eu pudesse ir para qualquer um dos cases, ou seja, case 1 para case 3, do case 3 para case 12, do case 12 para case 4 e assim por diante. eu consigo fazer quando os cases estão com comandos simples, mas quando coloco um comando que tem while ou if o código não funciona...

postando parte do meu código para que alguém possa me auxiliar...

// -----informações do relógio-----
#include <RTClib.h>
RTC_DS1307 rtc;
char DiasDaSemana[7][5] = {"Dom", "Seg", "Ter", "Quar", "Quin", "Sext", "Sab"};

//-----informações do higrômetro----
byte amostra = 10;// quantidade de amostras para serem analizadas na média
#define pinoSensorHigrometro A0
const int leituraMaxima = 1023;
const int leituraMinima = 140; /* caso o valor minimo(ou maximo) seja
  inferior(superior) ao da leitura do solo, o resultado da
  porcentagem sera alterada para mais de 100 %*/

//-----informações do sensor de água----
#define pinoRele 2
#define pinoSensorAgua A2

//-----informações para millis---
unsigned long tempoAtual;
unsigned long tempoAnterior = 0;

int estado = 20;

void setup() {

  Serial.begin(19200);
  Serial.println("iniciando sistema");
  delay(2000);
  rtc.begin();
  pinMode(pinoSensorHigrometro, INPUT);
  pinMode(pinoRele, OUTPUT);
  pinMode(pinoSensorAgua, INPUT);
}

void loop() {

  delay(1000);
  Serial.println("loop");//verificao da rotina
  // verificacaoDoRelogio();

  switch (estado) {

    case 1: //higrometro
      Serial.println("higrometro");
      int somatoria = 0; /*variável que guarda a somatória de cada leitura do sensor
  ideal iniciar com um valor para ter referencia
  este comando nao da para usar porque ao retirar o pino do sensor
  a leitura continua sendo feita, mas de forma desordenada*/
      for (int i = 1; i <= amostra; i++) {
        int leituraSensor = analogRead(pinoSensorHigrometro); //Le o sensor
        leituraSensor = map(analogRead(pinoSensorHigrometro), leituraMinima, leituraMaxima, 100, 0);
        somatoria += leituraSensor; // recebe a leitura atual do sensor,guarda o valor
        //e soma com o próximo valor da leitura.
        // Isso devido o simbolo "+=".
      }

      unsigned int media = (somatoria / amostra); // variável que calcula a média positiva

      if (media >= 60) {
        Serial.print("Humidade do Solo: ");
        Serial.print(media);
        Serial.print("%");
        Serial.println(" (Solo úmido)");// não precisa irrigar
        digitalWrite(pinoRele, HIGH);
        estado = 1;//verificação do relogio
        break;
      }
      if (media < 60) {
        Serial.print("Humidade do Solo: ");
        Serial.print(media);
        Serial.print("%");
        Serial.println(" (Precisa irrigar)");
        digitalWrite(pinoRele, LOW);
        estado = 200; //sensor da água
      }
      break;

    case 2: //sensor da água: Identifica se esta saindo água da torneira ou não
      tempoAtual = millis();
      Serial.println("sensor da água");
      int leituraSensor = analogRead(pinoSensorAgua);

      if (leituraSensor < 500) {//saindo água da torneira

        Serial.print("fluxo de água ok!!  ");
        Serial.println();
        estado = 20; //tempo de irrigação

      }
      if (leituraSensor > 500) {
        Serial.println("aguardando fluxo de água..."  );
        digitalWrite(pinoRele, LOW);

        //-- tempo(15s) do while para a água chegar até o sensor de água---

        while (tempoAtual - tempoAnterior >= 5000) {// tempo de 5s para teste
          if (leituraSensor < 500) {
            digitalWrite(pinoRele, LOW);//o pino já esta ligado antes desse comando...
            estado = 20; //5minutos de irrigação
            tempoAnterior = millis();
            break;
          }
          if (leituraSensor > 500) {
            digitalWrite(pinoRele, HIGH);
            estado = 200; // tempo de reinicio da irrigação
            tempoAnterior = millis();
            break;
          }
        }
      }

      break;
      Serial.println("case 2");
      estado = 0;
      break;

    case 20:
      Serial.println("case 3");
      estado = 200;
      break;

    case 200:
      Serial.println("case 3");
      estado = 1;
      break;

      delay(1000);

    default:
      Serial.println("algum problema apresentado...");
  }
}

void verificacaoDoRelogio() {
  Serial.println("verificação do relogio");
  DateTime dadosRTC = rtc.now();
  while (dadosRTC.hour() == 165) {
    Serial.println("Erro no relógio");
    rtc.begin();
    DateTime dadosRTC = rtc.now();
    if (dadosRTC.hour() != 165) {
      break;
    }
  }
}

a parte após o "break" nunca será executada

    case 2: //sensor da água: Identifica se esta saindo água da torneira ou não

      ...

      break;
      Serial.println("case 2");
      estado = 0;
      break;

ps: por favor, use tags de código ao postar código no fórum. Corrigi sua postagem neste momento, mas não irei fazer mais.

Olá,

Mas isso já acontece no teu código. Estás a usar a variável "estado" para selecionar o próximo estado que corresponde a um determinado "case".

No estado 1 manténs o mesmo estado ou seleccionas o estado 200, dependendo da média de humidade obtida. Dizes que queres ir do estado 1 para o estado 3, no entanto não existe esse estado 3? Não parece fazer sentido :confused: . Também não existe estado 12... Para quê ir do estado 3 para o 12 se ambos não existem? Primeiro tens de fazer um case para o 3 e outro para o 12. Depois é seleccionar esses estados dependendo de uma determinada condição noutro estado... Algo como o já está a ser feito no estado 1...

Suponho que te referes ao código do "case" em que "estado==2"? Este código nunca é executado porque em nenhum outro estado é seleccionado o "estado" 2...

Neste "case" em que "estado==2" parece haver um erro na situação em que "leituraSensor > 500". A condição "(tempoAtual - tempoAnterior >= 5000)" só é verdadeira a primeira vez quando "tempoAnterior" é zero. Depois "tempoAnterior" é sempre maior que o "tempoActual". Tens de actualizar o "tempoActual" e não o "tempoAnterior":

    tempoAtual = millis();
    tempoAnterior = tempoAtual; <------ Inicializa o tempoAnterior
    ...
    
    if (leituraSensor > 500) {
      Serial.println("aguardando fluxo de água...");
      digitalWrite(pinoRele, LOW);

      //-- tempo(15s) do while para a água chegar até o sensor de água---

      while (tempoAtual - tempoAnterior >= 5000) { // tempo de 5s para teste
        if (leituraSensor < 500) {
          digitalWrite(pinoRele, LOW); //o pino já esta ligado antes desse comando...
          estado = 20; //5minutos de irrigação
          tempoAnterior = millis(); <------ Devias actualizar o tempoActual?
          break;
        }
        if (leituraSensor > 500) {
          digitalWrite(pinoRele, HIGH);
          estado = 200; // tempo de reinicio da irrigação
          tempoAnterior = millis(); <------ Devias actualizar o tempoActual?
          break;
        }
      }
    }

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