# Varal automático via arduíno

**URL:** <https://forum.fazedores.com/t/varal-automatico-via-arduino/9060>\
**Category:** Arduino\
**Created:** [Maio 27, 2023, 1:52am UTC](https://forum.fazedores.com/t/varal-automatico-via-arduino/9060 "2023-05-27T01:52:38Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![ThaliaS](https://avatars.discourse-cdn.com/v4/letter/t/f04885/32.png) [@ThaliaS](https://forum.fazedores.com/u/ThaliaS)\
**Post date:** [Maio 27, 2023, 1:52am UTC](https://forum.fazedores.com/t/varal-automatico-via-arduino/9060/1 "2023-05-27T01:52:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![rogerbsp](https://avatars.discourse-cdn.com/v4/letter/r/b782af/32.png) [@rogerbsp](https://forum.fazedores.com/u/rogerbsp)\
**Post date:** [Maio 29, 2023, 11:20am UTC](https://forum.fazedores.com/t/varal-automatico-via-arduino/9060/2 "2023-05-29T11:20:31Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![ThaliaS](https://avatars.discourse-cdn.com/v4/letter/t/f04885/32.png) [@ThaliaS](https://forum.fazedores.com/u/ThaliaS)\
**Post date:** [Maio 29, 2023, 12:36pm UTC](https://forum.fazedores.com/t/varal-automatico-via-arduino/9060/3 "2023-05-29T12:36:01Z")

</div>

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