MONITOR DE CAIXA D'ÁGUA COM ARDUINO

 

Se você já teve a desagradável surpresa de descobrir que a caixa d’água secou justamente no momento em que mais precisava, veja o vídeo.

 

O protótipo exibido no vídeo, foi montado com uma placa Black Board da RoboCore, equivalente ao Arduino Uno. Na ilustração abaixo, a placa foi substituída por um Arduino Nano para que a montagem final coubesse em uma caixa 4x2.

 

 

Os pinos utilizados também foram modificados para facilitar o desenho da PCI. Abaixo, o esquema final do projeto.

 

 

O código abaixo também já foi modificado para a nova pinagem. Não cheguei a testar após essa modificação, mas acredito que não tenha nenhum bug.

 

 

 
// Timer Library 
#include "Timer.h" //http://playground.arduino.cc/Code/Timer 
Timer t; 
int ledEvent = -1; 
int buzEvent = -1; 
 
// Declarações 
const int pinLedG = 12; 
const int pinLedY = 11; 
const int pinLedR = 10; 
const int pinProbeH = A1; 
const int pinProbeM = A2; 
const int pinProbeL = A3; 
const int pinBuz = 4; 
const int pinBtm = 2; 
const int vRef = 100; // Valor superior às leituras flutuantes por indutância 
float pH = 0; 
float pM = 0; 
float pL = 0; 
bool quietOn = false; // Flag silenciar buzzer: true = não tocar buzzer; false = tocar 
int stateYellow = 0; // Guarda estado do led amarelo durante o blink 
 
// Protótipos 
void blinkYellow(bool blinkOn); 
void toggleYellow(); 
void playAlarm(bool buzOn); 
void playTone(); 
 
//-Arduino---------------------------------------------------------------- 
 
void setup() { 
// Inicializa pins. 
pinMode(pinLedG, OUTPUT); 
pinMode(pinLedY, OUTPUT); 
pinMode(pinLedR, OUTPUT); 
pinMode(pinProbeH, INPUT); 
pinMode(pinProbeM, INPUT); 
pinMode(pinProbeL, INPUT); 
pinMode(pinBuz, OUTPUT); 
pinMode(pinBtm, INPUT); 
// Inicia serial para debug 
Serial.begin(9600); 

 
void loop() { 
t.update(); // atualiza timer 
 
// Quiet: se botão foi pressionado, desliga buzzer 
if (digitalRead(pinBtm) == HIGH) { 
quietOn = true; 

 
// Leitura dos probes 
pH = analogRead(pinProbeH); 
pM = analogRead(pinProbeM); 
pL = analogRead(pinProbeL); 
 
// Para debug 
Serial.print(pH); 
Serial.print(" "); 
Serial.print(pM); 
Serial.print(" "); 
Serial.print(pL); 
Serial.print(" "); 
Serial.print(ledEvent); 
Serial.print(" "); 
Serial.print(buzEvent); 
Serial.println(""); 
// delay(500); 
 
// Reseta todos os leds 
digitalWrite(pinLedG, LOW); 
digitalWrite(pinLedY, LOW); 
digitalWrite(pinLedR, LOW); 
 
// Nível > 3/4: liga somente led verde 
if (pH > vRef) { 
quietOn = false; // reseta quiet 
playAlarm(false); 
blinkYellow(false); 
digitalWrite(pinLedG, HIGH); 

// Nível > 1/2: liga somente led amarelo em piscante 
if (pH < vRef && pM > vRef) { 
quietOn = false; // reseta quiet 
playAlarm(false); 
blinkYellow(true); 

// Nível < 1/2: liga somente led amarelo fixo 
if (pM < vRef && pL > vRef) { 
quietOn = false; // reseta quiet 
playAlarm(false); 
blinkYellow(false); 
digitalWrite(pinLedY, HIGH); 

// Nível < 1/4: liga somente led vermelho e toca buzzer até que 'quiet' seja pressionado 
if (pL < vRef) { 
playAlarm(true); 
blinkYellow(false); 
digitalWrite(pinLedR, HIGH); 


 
//-Funções---------------------------------------------------------------- 
 
void blinkYellow(bool blinkOn) { 
if (blinkOn) { 
if (ledEvent == -1) { 
ledEvent = t.every(500, toggleYellow); 

} else { 
if (ledEvent != -1) { 
t.stop(ledEvent); 
ledEvent = -1; 



 
void toggleYellow() { 
digitalWrite(pinLedY, (stateYellow) ? HIGH : LOW); 
stateYellow = !stateYellow; 
delay(500); 

 
void playAlarm(bool buzOn) { 
if (buzOn && !quietOn) { 
if (buzEvent == -1) { 
buzEvent = t.every(2000, playTone); 

} else { 
if (buzEvent != -1) { 
t.stop(buzEvent); 
buzEvent = -1; 



 
void playTone() { 
// Tone freqs: https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation#Ugly_Details 
tone(pinBuz, 784, 250); 

 
To change the appearance of the page, edit the styles of the corresponding elements (in most cases by using the "Main Frame" Style Zone).  
 
To change the menu’s links: edit, copy-paste, or delete the Link Elements within. 
 
To hide an element without deleting it, use its property Visible.
To "activate" displaying of an arrow, use its property "Visible"