#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ---------------- PINOS ----------------
#define PINO_PH 34
#define PINO_TURB 35
#define PINO_TDS 32
#define PINO_SAL 33
#define LED_VERDE 26
#define LED_VERMELHO 27
// ---------------- LIMITES ----------------
const float PH_MIN = 6.5;
const float PH_MAX = 8.5;
const float NTU_MAX = 4.0;
const float TDS_MAX = 500.0;
const float SAL_MAX = 2500.0;
// ---------------- VARIÁVEIS ----------------
float ph;
float turbidez;
float tds;
float salinidade;
bool alarme = false;
int pagina = 0;
unsigned long tempoLeitura = 0;
unsigned long tempoPagina = 0;
const unsigned long INTERVALO_LEITURA = 500;
const unsigned long INTERVALO_PAGINA = 4000;
// ========================================================
void setup() {
Serial.begin(115200);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
while (true);
}
telaInicial();
}
// ========================================================
void loop() {
if (millis() - tempoLeitura >= INTERVALO_LEITURA) {
tempoLeitura = millis();
lerSensores();
alarme = verificarLimites();
digitalWrite(LED_VERDE, !alarme);
digitalWrite(LED_VERMELHO, alarme);
atualizarOLED();
}
if (millis() - tempoPagina >= INTERVALO_PAGINA) {
tempoPagina = millis();
pagina++;
if (pagina > 1)
pagina = 0;
}
}
// ========================================================
void lerSensores() {
ph = analogRead(PINO_PH) * 14.0 / 4095.0;
turbidez = analogRead(PINO_TURB) * 3000.0 / 4095.0;
tds = analogRead(PINO_TDS) * 2000.0 / 4095.0;
salinidade = analogRead(PINO_SAL) * 5000.0 / 4095.0;
Serial.print("pH: ");
Serial.print(ph);
Serial.print(" Turbidity: ");
Serial.print(turbidez);
Serial.print(" TDS: ");
Serial.print(tds);
Serial.print(" Salt: ");
Serial.println(salinidade);
}
// ========================================================
bool verificarLimites() {
if (ph < PH_MIN || ph > PH_MAX)
return true;
if (turbidez > NTU_MAX)
return true;
if (tds > TDS_MAX)
return true;
if (salinidade > SAL_MAX)
return true;
return false;
}
// ========================================================
void atualizarOLED() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
if (pagina == 0)
paginaQuimica();
else
paginaMinerais();
oled.display();
}
// ========================================================
void paginaQuimica() {
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("Chemstry");
oled.setCursor(92,0);
oled.print("[1/2]");
oled.drawLine(0,10,127,10,SSD1306_WHITE);
oled.setTextSize(2);
oled.setCursor(0,15);
oled.print("pH");
oled.setCursor(40,15);
oled.print(ph,1);
oled.setTextSize(1);
oled.setCursor(108,18);
oled.print((ph>=PH_MIN && ph<=PH_MAX) ? "OK":" ");
oled.drawLine(0,38,127,38,SSD1306_WHITE);
oled.setCursor(0,45);
oled.print("Turb:");
oled.print(turbidez,1);
oled.print(" NTU");
oled.setCursor(108,45);
oled.print(turbidez<=NTU_MAX ? "OK":" ");
}
// ========================================================
void paginaMinerais() {
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("Minerals");
oled.setCursor(92,0);
oled.print("[2/2]");
oled.drawLine(0,10,127,10,SSD1306_WHITE);
oled.setCursor(0,16);
oled.print("TDS:");
oled.print(tds,0);
oled.print(" ppm");
oled.setCursor(108,16);
oled.print(tds<=TDS_MAX ? "OK":" ");
oled.setCursor(0,30);
oled.print("Sal:");
oled.print(salinidade,0);
oled.print(" uS");
oled.setCursor(108,30);
oled.print(salinidade<=SAL_MAX ? "OK":" ");
oled.drawLine(0,45,127,45,SSD1306_WHITE);
oled.setCursor(0,54);
if(alarme)
oled.print("DRINKING WATER");
else
oled.print("UNFIT WATER");
}
// ========================================================
void telaInicial() {
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(37,28);
oled.println("AkwiSense");
oled.setCursor(37,30);
oled.println("---------");
oled.setCursor(0,54);
oled.println("Inicializing...");
oled.display();
delay(3000);
}(click to edit)
(click to edit)
(click to edit)
(click to edit)