//Projeto N.Dágua - Sensor ultrassonico AJ-SR04M/HC-SR04 - SERVER/CLIENT -display16x2
// Desenvolvimento - Elias codigo server
//Obs: Não use a alimentanção do esp para alimentar display e os sensores, use fonte externa 5v
//#include <ESP8266WiFi.h> // Retire a barra para gravar no esp8266
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Incluindo os arquivos de imagem
#include "Frame0.h"
#include "Frame1.h"
#include "Frame2.h"
#include "Frame3.h"
#include "Frame4.h"
#include "Frame5.h"
#include "Frame6.h"
#include "Frame7.h"
#include "Frame8.h"
#include "Frame9.h"
#include "Frame10.h"
#include "Frame11.h"
#include "Frame12.h"
//definições de posição da imagem e intervalo de transição
#define posX 70
#define posY 0
#define intervalo 500
//#define TRANSPARENT_BACKGROUND 0xC0 // Isso representa uma cor semitransparente (50% transparente)
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Definições do sensor AJ-SR04M/HC-SR04
const int TRIGGER_PIN = 16; // Pino de trigger do sensor AJ-SR04M esp8266 (D3)
const int ECHO_PIN = 17; // Pino de eco do sensor AJ-SR04M esp8266 (D4)
const int RELAY_PIN = 2; // Pino do relé ESP8266 (D5)
const int MAX_DISTANCE = 72; // Distância máxima a ser medida em centímetros sensor AJ-SR04M
const int MIN_DISTANCE = 22; // Distância mínima a ser medida em centímetros sensor AJ-SR04M
long duration; // Variável para a duração da onda sonora
int distance_cm; // Variável para a medição da distância
unsigned long previousMillis = 0;
const long INTERVAL = 5000; // Intervalo de leitura do sensor (em milissegundos)
void setup() {
Serial.begin(9600);
Serial.println();
Wire.begin(21, 22);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(SSD1306_WHITE);
display.clearDisplay(); // Limpa a tela
display.display();
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
/*Escolha o valor que corresponde à rotação que deseja aplicar ao seu display.
(0) Orientação padrão, (1) Rotaciona 90 graus no sentido horário
(2) Rotaciona 180 graus, (3) Rotaciona 90 graus no sentido anti - horário*/
display.setRotation(0);
// displayAnimation(); //faz a inicialização do void displayAnimation() {}
// display.invertDisplay(BLACK); //muda a cor da tela para branco
}
float readWaterLevel() {
// Limpa a condição do pino de TRIGGER_PIN
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
// Define o TRIGGER_PIN como HIGH (ATIVO) por 10 microssegundos
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Lê o ECHO_PIN, retorna o tempo de viagem da onda sonora em microssegundos
duration = pulseIn(ECHO_PIN, HIGH);
// Calcula a distância
distance_cm = duration * 0.034 / 2; // Velocidade da onda sonora dividida por 2 (ida e volta)
Serial.print("Distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
// Mapeia a distância medida para a porcentagem de água restante
float percentage = map(distance_cm, MIN_DISTANCE, MAX_DISTANCE, 100, 0);
// Limita a porcentagem entre 0% e 100%
if (percentage < 0) {
percentage = 0;
} else if (percentage > 100) {
percentage = 100;
}
return percentage;
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= INTERVAL) {
// Atualiza o nível de água e controla o relé
float percentage = readWaterLevel();
// Limpa o display antes de atualizar a leitura do sensor
display.clearDisplay();
// Exibe a leitura do sensor no display
display.setTextSize(1);
display.setCursor(0, 5);
display.print("Nivel de");
display.setCursor(10, 15);
display.print("Agua");
display.drawBitmap(posX, posY, Frame1_bits, Frame1_width, Frame1_height, WHITE);
display.setTextSize(2);
// Exibe a porcentagem do nível de água
display.setCursor(5, 30);
//display.print("Porcentagem: ");
display.print(int(round(percentage)));
display.println("%");
if (percentage < 0) {
percentage = 0;
} else if (percentage > 100) {
percentage = 100;
}
else if (percentage <= 4) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
display.setTextSize(1);
display.setCursor(0, 50);
display.print(" Vazio ");
display.display();
}
else if (percentage >= 6 && percentage <= 15) {
digitalWrite(RELAY_PIN, HIGH);
delay(3000);
display.setCursor(5, 30);
//display.print("Porcentagem: ");
display.print(int(round(percentage)));
display.println("%");
display.display();/////////
displayAnimation(); //faz a inicialização do void displayAnimation() {}
display.setTextSize(1);
display.setCursor(0, 50);
display.print(" Ench. ");
display.display();
}
else if (percentage >= 100) {
digitalWrite(RELAY_PIN, LOW);
delay(3000);
display.setTextSize(1);
display.setCursor(0, 50); // Limpa apenas o local onde os carecteres vai ser escrito
display.print(" Cheio ");
display.display();
}
// Atualiza o display
display.display();
}
}
//executa fora do void loop
void displayAnimation() {
// faz repetição while(true) { }
//while (true) {
display.clearDisplay(); //limpa a tela
//carrega para o buffer o frame 0
//usando as posições iniciais posX e posY
//informa o tamanho da imagem com Frame0_width e Frame0_height
//informa o nome da matriz que contem os bits da imagem, no caso Frame0_bits
// Exibe a leitura do sensor no display
//display.drawBitmap(posX, posY, Frame0_bits, Frame0_width, Frame0_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame0_bits, Frame0_width, Frame0_height, WHITE);
display.display(); //mostra o buffer no display
//delay(intervalo);//aguarda um intervalo antes de mostrar o próximo frame
delay(10);
//repete o processo para todos os outros frames
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame1_bits, Frame1_width, Frame1_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame1_bits, Frame1_width, Frame1_height, WHITE);
display.display();
// delay(intervalo);
delay(10);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame2_bits, Frame2_width, Frame2_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame2_bits, Frame2_width, Frame2_height, WHITE);
display.display();
// delay(intervalo);
delay(10);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame3_bits, Frame3_width, Frame3_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame3_bits, Frame3_width, Frame3_height, WHITE);
display.display();
//delay(intervalo);
delay(10);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame4_bits, Frame4_width, Frame4_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame4_bits, Frame4_width, Frame4_height, WHITE);
display.display();
//delay(intervalo);
delay(200);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame5_bits, Frame5_width, Frame5_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame5_bits, Frame5_width, Frame5_height, WHITE);
display.display();
//delay(intervalo);
delay(200);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame6_bits, Frame6_width, Frame6_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame6_bits, Frame6_width, Frame6_height, WHITE);
display.display();
//delay(intervalo);
delay(200);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame7_bits, Frame7_width, Frame7_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame7_bits, Frame7_width, Frame7_height, WHITE);
display.display();
//delay(intervalo);
delay(300);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame8_bits, Frame8_width, Frame8_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame8_bits, Frame8_width, Frame8_height, WHITE);
display.display();
// delay(intervalo);
delay(100);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame9_bits, Frame9_width, Frame9_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame9_bits, Frame9_width, Frame9_height, WHITE);
display.display();
// delay(intervalo);
delay(400);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame10_bits, Frame10_width, Frame10_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame10_bits, Frame10_width, Frame10_height, WHITE);
display.display();
//delay(intervalo);
delay(500);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame11_bits, Frame11_width, Frame11_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame11_bits, Frame11_width, Frame11_height, WHITE);
display.display();
// delay(intervalo);
delay(500);
display.clearDisplay(); //limpa a tela
//display.drawBitmap(posX, posY, Frame12_bits, Frame12_width, Frame12_height, TRANSPARENT_BACKGROUND);
display.drawBitmap(posX, posY, Frame12_bits, Frame12_width, Frame12_height, WHITE);
display.display();
// delay(intervalo);
delay(500);
// }
}