Varal automático via arduíno

Boa noite, tudo bem? Sou Thalia e preciso de uma ajudinha. Por favor.
Estou fazendo um varal automático via arduíno utilizando o sensor de chuva, ponte h e motor DC.
Coloquei um botão pulsante onde o o primeiro toque o motor deve girar 10 segundos e desativar ( saindo da área para o quintal). No segundo toque o motor deve girar no sentido inverso do primeiro toque por 10 segundos e parar (saíndo do quintal para área) no terceiro toque entra no automático o motor deve girar 10 segundos e parar no mesmo sentido do primeiro toque (indo para quintal). Mas ao detectar chuva o motor deve girar 10 segundos e desativar no mesmo sentido do segundo toque (voltando para área - detectado chuva), mas se parar de chover o motor deve ir para o quintal novamente.

O primeiro e segundo toque funcionou. No terceiro toque ele só vai os 10 segundos para ir no quintal, mas quando jogo água no sensor não detecta chuva e não faz girar o motor.
Meu código é esse…

Poderiam me ajudar, por favor. Desde já agradeço imensamente

#define motorPin1 2 // Pino 1 da ponte H
#define motorPin2 3 // Pino 2 da ponte H
#define sensorPin A0 // Pino analógico para o sensor de chuva
#define pushButtonPin 12 // Pino do botão
#define redLedPin 13 // Pino para o LED vermelho
#define greenLedPin 10 // Pino para o LED verde
#define blueLedPin 9 // Pino para o LED azul

bool motorAtivo = false; // Variável para controlar o estado do motor
bool automaticoAtivo = false; // Variável para controlar o modo automático
int numToques = 0; // Contador de toques no botão
unsigned long tempoInicioMotor = 0; // Variável para armazenar o tempo de início do motor
bool primeiroToque = false; // Variável para verificar se é o primeiro toque

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(sensorPin, INPUT);
pinMode(pushButtonPin, INPUT_PULLUP);
pinMode(redLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(blueLedPin, OUTPUT);
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(sensorPin);

if (!automaticoAtivo) {
// Modo manual
if (digitalRead(pushButtonPin) == LOW) {
numToques++;
if (numToques == 1) {
// Primeiro toque: Liga o motor, gira por 10 segundos e desliga
motorLiga();
primeiroToque = true;
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
digitalWrite(blueLedPin, LOW);
delay(10000);
motorDesliga();
digitalWrite(redLedPin, LOW);
Serial.println(“Motor desligado após 10 segundos”);
} else if (numToques == 2) {
// Segundo toque: Liga o motor, gira por 10 segundos no sentido oposto ao primeiro toque e desliga
motorLiga();
primeiroToque = false;
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
digitalWrite(blueLedPin, LOW);
motorInverteSentido();
delay(10000);
motorDesliga();
digitalWrite(greenLedPin, LOW);
Serial.println(“Motor desligado após 10 segundos”);
} else if (numToques == 3) {
// Terceiro toque: Liga o motor, gira por 10 segundos no sentido do primeiro toque e desliga
motorLiga();
primeiroToque = true;
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, LOW);
digitalWrite(blueLedPin, HIGH);
delay(10000);
motorDesliga();
digitalWrite(blueLedPin, LOW);
Serial.println(“Motor desligado após 10 segundos”);
}
delay(250); // Debounce para evitar múltiplos acionamentos do botão
}
} else {
// Modo automático
if (sensorValue < 500) {
if (!motorAtivo) {
if (primeiroToque) {
motorInverteSentido(); // Inverte o sentido do motor se for o primeiro toque
}
motorLiga();
tempoInicioMotor = millis(); // Armazena o tempo de início do motor
Serial.println(“Motor ligado”);
}
// Gira o motor por 10 segundos
if (motorAtivo && millis() - tempoInicioMotor >= 10000) {
motorDesliga();
digitalWrite(greenLedPin, LOW);
Serial.println(“Motor desligado após 10 segundos”);
}
} else {
if (!motorAtivo) {
if (!primeiroToque) {
motorInverteSentido(); // Inverte o sentido do motor se não for o primeiro toque
}
motorLiga();
tempoInicioMotor = millis(); // Armazena o tempo de início do motor
Serial.println(“Motor ligado”);
}
// Gira o motor por 10 segundos
if (motorAtivo && millis() - tempoInicioMotor >= 10000) {
motorDesliga();
digitalWrite(redLedPin, LOW);
Serial.println(“Motor desligado após 10 segundos”);
}
}
}

delay(100); // Pequeno atraso para estabilidade do código
}

void motorLiga() {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
motorAtivo = true;
}

void motorDesliga() {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
motorAtivo = false;
}

void motorInverteSentido() {
digitalWrite(motorPin1, !digitalRead(motorPin1));
digitalWrite(motorPin2, !digitalRead(motorPin2));
}

Já pensou em utilizar sensores fim de curso para saber a posição do varal?
Com isso eliminaria a necessidade de ficar contando o número de vezes que o botão foi acionado. O código ficaria mais simples, se o fim de curso de recuado está acionado então avança o varal quando o botão for pressionado, se está avançado então recua quando o botão for acionado .

Vc está utilizando push button dentro do loop, só vai funcionar se o botão for acionado no exato momento em que o código estiver sendo executado naquela linha. Em vez disso, eu sugiro vc tirar todo o código de dentro do loop e deixar apenas a leitura do sensor de chuva.
Os botões vc pode deixar numa interrupção externa, não esqueça de utilizar debounce para filtrar sinais espúrios.

Bom dia, Roger. Sim, iria utilizar esse sensor, mas onde moro é muito difícil encontrar e preciso entregar hoje esse projeto.

Será que você pode me ajudar nessa parte que seria o automático. Nesse caso, ele gira por 5 segundos e para quando detecta chuva, mas quando não está chovendo ele liga o motor pot 5 segundos para e liga o motor novamente. Mas eu queria que ele girasse por 5 segundos e desativasse.

Desde já agradeço!

#define SinalA A0

#define SinalD 1
#define MOTOR_PIN1 2
#define MOTOR_PIN2 3

bool motorLigado = false;
unsigned long tempoInicioGiro;
bool chuvaDetectada = false;

void setup() {
pinMode(SinalD, INPUT);
pinMode(MOTOR_PIN1, OUTPUT);
pinMode(MOTOR_PIN2, OUTPUT);
Serial.begin(9600);
}

void loop() {
int ValorDigital = digitalRead(SinalD);
int ValorAnalog = analogRead(SinalA);

Serial.print("Sinal digital: “);
Serial.print(ValorDigital);
Serial.print(” Sinal analógico: ");
Serial.println(ValorAnalog);

if (ValorAnalog < 700) {
Serial.println(“ESTA CHOVENDO”);
if (!chuvaDetectada && !motorLigado) {
GirarMotorSentidoInverso();
tempoInicioGiro = millis();
motorLigado = true;
chuvaDetectada = true;
}
} else {
Serial.println(“NAO ESTA CHOVENDO”);
if (!motorLigado) {
GirarMotorSentidoCorreto();
tempoInicioGiro = millis();
motorLigado = true;
}
}

if (motorLigado && (millis() - tempoInicioGiro >= 5000)) {
PararMotor();
motorLigado = false;
}

delay(500);
}

void GirarMotorSentidoCorreto() {
digitalWrite(MOTOR_PIN1, HIGH);
digitalWrite(MOTOR_PIN2, LOW);
}

void GirarMotorSentidoInverso() {
digitalWrite(MOTOR_PIN1, LOW);
digitalWrite(MOTOR_PIN2, HIGH);
}

void PararMotor() {
digitalWrite(MOTOR_PIN1, LOW);
digitalWrite(MOTOR_PIN2, LOW);
}