//Carrega a biblioteca do sensor
//#include <Ultrasonic.h>
#include <Wire.h> //Inclui a lib necessária para comunicação I2C
#include <LiquidCrystal_I2C.h> // Inclui a lib para controlar o display LCD
#include <SD.h> // Inclui a lib necessária para a comunicacao com o módulo SD
//Define os pinos
#define address 0x27 // Endereço I2C do display
#define col 16
#define row 2
#define pinTrigger 9
#define pinEcho 8
#define ledPin 7
// Definição da taxa de medição (em medições por segundo)
const float TAXA_DE_MEDICAO = 0.5; // 1 medição a cada 2 segundos
// Definição dos tempos de medição e espera (em milissegundos)
const unsigned long INTERVALO_DE_MEDICAO = 2000; // 2 segundos em milissegundos
const unsigned long DURACAO_TOTAL_DE_MEDICAO = 60000; // 5 minutos em milissegundos
const unsigned long DURACAO_TOTAL_DE_ESPERA = 120000; // 25 minutos em milissegundos
LiquidCrystal_I2C lcd(address, col, row); // Cria um obj
File dataFile;
//Inicializa o sensor nos pinos definidos
//Ultrasonic sensor(pinTrigger, pinEcho);
void setup() {
Serial.begin(9600); // Inicia a comunicação serial
pinMode(pinTrigger, OUTPUT);
pinMode(pinEcho, INPUT);
pinMode(ledPin, OUTPUT);
lcd.init(); //Inicializa o display LCD
lcd.backlight(); //Inicializa a luz de fundo
lcd.clear(); //Limpa o conteudo do display
lcd.setCursor(0,0); //Seta o cursor na primeira linha e coluna
lcd.print("Sensor de nivel");
delay(3000); //Aguarda 3 segundos
lcd.clear();
// Inicializa o cartao SD
if(!SD.begin(10)); { // Pino 10 é o pino CS do modulo SD
Serial.println("Falha na inicialização do cartão SD!");
return;
}
Serial.println("Cartao SD inicializado com sucesso!");
}
void loop() {
unsigned long tempoInicioMedicao = millis(); // Tempo de início da medição
while (millis() - tempoInicioMedicao < DURACAO_TOTAL_DE_MEDICAO) { // Loop de medição
realizarMedicao();
delay(INTERVALO_DE_MEDICAO); // Espera entre as medições
}
desligarDispositivoPorTempo(DURACAO_TOTAL_DE_ESPERA); // Desliga o dispositivo por um período de espera
}
void realizarMedicao() {
int numReadings = 2; // Número de leituras por medição
int totalDistance = 0;
// Faz várias leituras em rápida sucessão
for (int i = 0; i < numReadings; i++) {
long duration;
int distance;
digitalWrite(pinTrigger, LOW);
delayMicroseconds(2);
digitalWrite(pinTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrigger, LOW);
duration = pulseIn(pinEcho, HIGH);
distance = duration * 0.034 / 2;
totalDistance += distance;
delay(10); // Pequeno atraso entre as leituras para o modo burst sampling
}
int averageDistance = totalDistance / numReadings;
Serial.print("Distancia media: ");
Serial.print(averageDistance);
Serial.println(" cm");
lcd.setCursor(0,0);
lcd.print("Nivel de agua:");
lcd.setCursor(0, 1); // Define o cursor na segunda linha
lcd.print(" "); // Limpa a linha
lcd.setCursor(0, 1); // Define o cursor na segunda linha
lcd.print(averageDistance);
lcd.print(" cm");
delay(250);
salvarMedicaoSD(averageDistance); // Salvar medicao no cartao SD
if (averageDistance < 20) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
void salvarMedicaoSD(int distancia) {
// Abrir o arquivo para escrita
dataFile = SD.open("medicoes.csv", FILE_WRITE);
// Verifica se o arquivo foi aberto com sucesso
if(dataFile){
// Escreve a medicao no formato CSV
dataFile.print(distancia);
dataFile.println();
dataFile.close();
Serial.println("Medicao salva no cartao SD.");
} else {
Serial.println("Erro ao abrir o arquivo no cartao SD.");
}
}
void desligarDispositivoPorTempo(unsigned long duracao) {
Serial.println("Desligando o dispositivo por um tempo...");
// Desliga os componentes e entra em modo de espera ou desligamento
digitalWrite(ledPin, LOW); // Desliga o LED
lcd.clear(); // Limpa o display LCD
delay(duracao); // Aguarda o período de espera ou desligamento
// Ao final do período, reativa os componentes
Serial.println("Reiniciando o dispositivo...");
digitalWrite(ledPin, HIGH); // Liga o LED novamente
}