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