#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 8 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Variáveis globais
float valor = 0;
float tensao = 0;
float tensao_grafico = 0;
float porcentagem = 0.0;
//variáveis para o buffer
int x[128];
int y[128];
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicia a comunicação com o display OLED
//display.setRotation(0); //orientação horizontal do display
//display.dim(true); //brilho no máximo
//display.setTextColor(WHITE);
//display.setTextSize(1); // Tamanho da fonte no mínimo
// preenchimento dos arrays com um valor fora da faixa de medição, maior que 1023
for(int i=127;i>=0;i--){
x[i]=9999;
}
for(int i=127;i>=0;i--){
y[i]=9999;
}
}
void loop() {
display.clearDisplay(); //Limpa o display
//sensorBar();
sensorBar1();
//fillSensor();
valor = analogRead(A0); //leitura do potenciômetro em A0
tensao=(valor*5)/1024; //cálculo para valor de tensão
//tensao_grafico=map(valor,0,1023,10,128); //dimensiona o valor analógico para um pixel imprimível no limite da tela
tensao_grafico=map(valor,0,1023,1,128); //dimensiona o valor analógico para um pixel imprimível no limite da tela
porcentagem=map(valor,0,1023,0,1000); //dimensiona o valor analógico para um pixel imprimível no limite da tela
porcentagem=(porcentagem/10.0);
Serial.println(porcentagem, 1); // a adição de ", 1" define a qte de casas decimais
//Por algum motivo essas condicionais não funcionam no meio do código
if(tensao > 4.50) {
tela_Exceed_Volt();
}
if(tensao < 0.50) {
tela_Under_Volt();
}
}
// fim do Loop
//===========================================================================
// Funções avulsas chamadas dentro do código
void tela_Exceed_Volt() {
display.clearDisplay();
for(int i=0; i<=2; i++) {
// The INVERSE color is used so round-rects alternate white/black
display.fillRoundRect(0, 0, 127, 63, 10, SSD1306_WHITE);
display.fillRoundRect(4, 4, 119, 55, 8, SSD1306_INVERSE);
display.setTextSize(2); // Normal 1:1 pixel scale
//display.setTextColor(SSD1306_WHITE); // Draw white text
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.setCursor(15,24); // Start at top-left corner
display.print(F("OVERLOAD"));
display.display();
delay(200);
display.clearDisplay();
display.display();
delay(100);
}
}
void tela_Under_Volt() {
display.clearDisplay();
for(int i=0; i<=2; i++) {
// The INVERSE color is used so round-rects alternate white/black
display.fillRoundRect(0, 0, 127, 63, 10, SSD1306_WHITE);
display.fillRoundRect(4, 4, 119, 55, 8, SSD1306_INVERSE);
display.setTextSize(2); // Normal 1:1 pixel scale
//display.setTextColor(SSD1306_WHITE); // Draw white text
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.setCursor(9,24); // Start at top-left corner
display.print(F("UNDERLOAD"));
display.display();
delay(200);
display.clearDisplay();
display.display();
delay(100);
}
}
void sensorBar() { // função que imprime a barra de preenchimento tipo retangulo arredondado
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2); // Tamanho da fonte no mínimo
//Texto da escala vertical
display.setCursor(35, 2);
display.print("VAZAO");
for(int16_t i=0; i<2; i++) {
display.drawRoundRect(i, 19+i, display.width()-2*i, 30-2*i,10, SSD1306_WHITE);
}
display.fillRoundRect(1, 21, tensao_grafico, 26, 10, SSD1306_WHITE);
display.setTextSize(2); // Normal 1:1 pixel scale
display.setCursor(24,51); // Start at top-left corner
display.print(porcentagem, 1);
display.print(F(" %"));
display.display();
}
void sensorBar1() { // função que imprime a barra de preenchimento tipo retangulo reto
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2); // Tamanho da fonte no mínimo
//Texto da escala vertical
display.setCursor(35, 2);
display.print("VAZAO");
for(int16_t i=0; i<2; i++) {
display.drawRect(i, 19+i, display.width()-2*i, 30-2*i, SSD1306_WHITE);
}
display.fillRect(1, 21, tensao_grafico, 26, SSD1306_WHITE);
display.setTextSize(2); // Normal 1:1 pixel scale
display.setCursor(24,51); // Start at top-left corner
display.print(porcentagem, 1);
display.print(F(" %"));
display.display();
}
void fillSensor() {
//display.clearDisplay();
// The INVERSE color is used so round-rects alternate white/black
display.fillRoundRect(1, 21, tensao_grafico, 28, 10, SSD1306_WHITE);
display.display();
delay(1);
}