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