Projeto CatWater
Dois de nossos gatos (Sophia e Dexter, mãe e filho, respectivamente) se acostumaram a beber água na torneira do tanque da área externa. Para tanto, eles costumavam subir e “pedir” (miar) para que abríssemos a torneira. Como não estamos em casa o tempo todo para abrir a água para eles, resolvi fazer colocar uma válvula solenoide controlada por um Arduino ligado a um sensor ultrassônico, para que a torneira libere a água quando alguém ou algo estiver na frente do sensor. Esta é a motivação para o projeto CatWater.
Os componentes utilizados no projeto foram:
- Arduino Nano
- Válvula Solenoide 12V de 1/2″
- Módulo Relé 5V
- Sensor Ultrassônico HC-SR04
- UBEC (Opcional)
- Mini Breadboard 140 pontos (Opcional)
- Fonte 12V 1A
- Jumpers e/ou fios para conectar tudo
A mini breadboard é opcional pois você pode querer conectar os componentes de outra maneira (soldando diretamente no Arduino ou fazendo uma placa de circuito impresso). No caso do UBEC, eu preferi utilizá-lo porque já queimei um Arduino Nano ao conectá-lo com 12V. Caso você utilize um Arduino que suporte os 12V, sem problemas. Caso contrário, recomendo usar um UBEC ou outro tipo de regulador para baixar a tensão para 5V.
Vejamos na imagem abaixo como ficou tudo conectado:
As conexões do sensor e do módulo são:
Dispositivo | Pino | Arduino |
---|---|---|
Sensor HC-SR04 | VCC | 5V |
Sensor HC-SR04 | TRIG | D3 |
Sensor HC-SR04 | ECHO | D4 |
Sensor HC-SR04 | GND | GND |
Módulo Relé | VCC | 5V |
Módulo Relé | GND | GND |
Módulo Relé | S | D5 |
Além disso, da fonte de 12V, o positivo e o negativo entram no UBEC e deste saem para os pinos VIN e GND do Arduino. Ainda da fonte de 12V, qualquer um dos pólos vai para o borne COMMON (C) do relé, e sai do NC (Normally Closed) para uma das pernas da válvula solenoide. E o outro pólo vai direto para a outra perna do solenoide. Ou seja, o relé fica responsável por fechar o circuito no solenoide.
Feito isso, é só fazer o envio do código abaixo para o seu Arduino Nano, usando o Arduino IDE ou outro ambiente de sua preferência:
#define trigPin1 3
#define echoPin1 4
#define relayPin 5
#define DISTANCE 55
void setup() {
Serial.begin(9600);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(relayPin, OUTPUT);
delay(2000);
}
void loop()
{
int distance1 = getDistanceinCM(trigPin1, echoPin1);
Serial.print("Distancia: ");
Serial.print(distance1);
Serial.println("cm");
if ((distance1>-1) && (distance1 {
digitalWrite(relayPin, HIGH);
delay(3000);
}
else
{
digitalWrite(relayPin, LOW);
}
delay(800);
}
int getDistanceinCM(int trigPin, int echoPin)
{
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
//Serial.print("Distance:");
//Serial.println(distance);
if (distance >= 200 || distance <= 0)
{
distance = -1;
}
return distance;
}
Agora, algumas observações sobre o código. A função getDistanceinCM() você achará na net em vários exemplos de utilização do sensor ultrassônico. Ela é responsável por fornecer a distância em centímetros do objeto mais próximo em frente ao sensor. Estes sensores tem um limite, é claro, e no código também há um limite de 200cm (a maioria deles não chega nesta distância). Portanto, a função retornará -1 quando não conseguir calcular a distância ou esta for maior que 200cm. Isso também é importante devido a uma possível inconsistência nos valores lidos (seja por algum tipo de interferência ou pela baixa qualidade do sensor).
A distância que fará com que o relé seja ativado, fazendo assim com que a válvula solenoide seja ativada, é definida pelo define DISTANCE, onde no meu caso este valor de 55 ficou satisfatório. Você precisará ajustar este valor de acordo com a distância do seu sensor para onde ele estará apontado, então faça testes.
Uma vez detectada um objeto mais próximo que 55cm a água permanecerá ligada por 3 segundos, e depois após 800ms será verificado novamente e a água será ligada novamente por 3 segundos e assim por diante. Isso pode ser modificado para, por exemplo, ligar e desligar quase imediatamente (levando em consideração os 800ms), mas achei melhor assim para evitar o liga/desliga constante do relé e da válvula no caso do bichano ficar se mexendo e o sensor não o detectar o tempo todo.
No meu caso, mesmo com essa distância de 55cm, uma vez ou outra, provavelmente por algum tipo de interferência ele detecta algo a mais de 1 metro de distância (mas lê algum valor menor ou igual a 55) e ativa o relé. Ainda preciso trabalhar nisso… Talvez uma dupla verificação antes de acionar o relé seja interessante…
Bom, feito tudo isso, devidamente ajustado e testado, basta arrumar uma caixinha ou algo que sirva para guardar tudo e deixar apenas o sensor ultrassônico para fora. No meu caso, por exemplo, estou usando uma carcaça de um NVR e uma tampa de inseticida… rsrsrsrs, mas pretendo mudar isso, em breve. As “crianças” já aprenderam que agora é só subir no tanque que a água é liberada, então estou contente com o resultado. E abaixo é possível ver a Sophia usando a “torneira automática”:
Boa noite
Gostei do seu projeto
poderia disponibilizar o código para que eu faça um projeto igual
agradeço
Opa, Luciano! O código é só este do post mesmo. 🙂
Não consegui baixar o código fonte consegue postar ele aqui nos comentários? Abraços
Eita, foi mal. O WordPress aprontou alguma e no lugar do código tinha uma mensagem esquisita. Editei a página e recoloquei o código. Valeu!
Boa tarde.
Seu projeto ficou muito legal.
Sou leigo no assunto, como ficaria o código para eu usar 2 sensores unltrassonicos com modulo rele duplo?