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"