//Bibliotecas
#include <LiquidCrystal_I2C.h>
#include "Wire.h"
// Modulo I2C display no endereco 0x27, comunicaçao com os pinos A4=SDA e A5=SCL.
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define SLC 0
#define LFT 1
#define RGH 2
#define ENT 3
byte menu();
void intro();
void tensao();
//Portas analogicas do voltimetro
int CH1 = A2;
int CH2 = A3;
int CH3 = A0;
int CH4 = A1;
//Variaveis que armazenam o valor de tensão de cada canal.
float VCH1;
float VCH2;
float VCH3;
float VCH4;
//Com auxilio de um multimetro, verifique a tensão fornecida na linha de 5V pela sua placa ARDUINO e digite no lugar do valor atual.
//ESSA ETAPA É FUNDAMELTAL PARA GARANTIR A PRECISÃO DO SEU VOLTIMETRO!
#define VREF 7.00
void setup() {
lcd.begin(27,4);
pinMode(SLC, INPUT_PULLUP);
pinMode(LFT, INPUT_PULLUP);
pinMode(RGH, INPUT_PULLUP);
pinMode(ENT, INPUT_PULLUP);
intro();
}
void loop() {
switch (menu()){
case 0:
while(digitalRead(ENT)){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CH1 (0-5V)=");
lcd.setCursor(0, 1);
lcd.print("CH2 (0-5V)=");
lcd.setCursor(0, 2);
lcd.print("CH3 (0-25V)=");
lcd.setCursor(0, 3);
lcd.print("CH4 (0-25V)=");
tensao();
while(!digitalRead(ENT)){
menu();
}
}
}
}
void tensao(){
//Função que chama a leitura analogica do ADC. Uma chamada por canal.
VCH1 = analogRead(CH1);
VCH2 = analogRead(CH2);
VCH3 = analogRead(CH3);
VCH4 = analogRead(CH4);
//Converte o valor ligo pela função analog Read(0 até 1023) em um valor de tensão.
VCH1 =(VCH1*(VREF/1023));
VCH2 =(VCH2*(VREF/1023));
VCH3 =(5*VCH3*(VREF/1023));
VCH4 =(5*VCH4*(VREF/1023));
//Escreve no display as tensões medidas por cada canal do voltimetro.
lcd.setCursor(11, 0);
lcd.print(VCH1,2);
lcd.setCursor(11, 1);
lcd.print(VCH2,2);
lcd.setCursor(12, 2);
lcd.print(" ");
lcd.setCursor(12, 2);
lcd.print(VCH3,2);
lcd.setCursor(12, 3);
lcd.print(" ");
lcd.setCursor(12, 3);
lcd.print(VCH4,2);
delay(500);
//taxa de atualização entre tomada de medidas.
}
byte menu (){
//Limitar as opções.
int opt = 0;
const int maxOpt = 4;
bool key = false;
lcd.clear();
//Subir e descer
while (digitalRead(SLC)){
lcd.setCursor(2,0);
lcd.print("> Menu Inicial <");
if(key && !digitalRead(RGH)){
lcd.clear();
opt++;
}
if(key && !digitalRead(LFT)){
lcd.clear();
opt--;
}
switch(opt){
case 0:
lcd.setCursor(4,1);
lcd.print("1.Pentra 60");
break;
case 1:
lcd.setCursor(4,1);
lcd.print("2.Pentra 80");
break;
case 2:
lcd.setCursor(4,1);
lcd.print("3.Ruby");
break;
case maxOpt:
opt = 0;
break;
case -1:
opt = maxOpt-1;
break;
}
//trava botoes
key = true;
if(!digitalRead(LFT) || !digitalRead(RGH)) key = false;
delay(90);
}
lcd.clear();
while(!digitalRead(SLC));
lcd.setCursor(0,3);
lcd.print("Executando...");
delay(800);
return opt;
}
//Introdução do programa.
void intro(){
lcd.setCursor(14,3);
lcd.print("by:DWL");
for(int i=0; i< 14; i++){
lcd.scrollDisplayLeft();
delay(70);
}
delay(1000);
lcd.clear();
lcd.setCursor(0,3);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
}