//******************************************************
//Instituto Federal Sul-rio-grandense - Campus Camaquã
//Disciplina: Linguagem de programação
//Curso Técnico Integrado em Automação Industrial
//Aluno: Gustavo Schmitz Bergmann
//******************************************************
#define LATCH_7SEG 4
#define CLOCK_7SEG 7
#define DATA_7SEG 8
// LED's
#define LED1 13
#define LED2 12
#define LED3 11
#define LED4 10
#define LIGAR LOW
#define DESLIGAR HIGH
// BUZER
#define BUZZER 3
// Botões
#define BTN_S1 A1
#define BTN_S2 A2
#define BTN_S3 A3
#define BTN_PRESSIONADO LOW
#define BTN_DESPRESSIONADO HIGH
// Sensor de temperatura
#define SENSOR_TEMPERATURA A4
// Potenciomentro
#define POTENCIOMETRO A0
#define VAL_SERIAL 5
#define REPETE_VALORES 2
//Variável de contagem
int count = 0;
//Vetor de armazenamento dos valores inseridos
int leituraSerial[VAL_SERIAL];
void setup()
{
int testePositivo;
//Inicializando do monitor serial
Serial.begin(9600);
Serial.setTimeout(100);
//Configurações de pinos
pinMode(LATCH_7SEG, OUTPUT);
pinMode(CLOCK_7SEG, OUTPUT);
pinMode(DATA_7SEG, OUTPUT);
//Configuração dos pinos
pinMode(BTN_S1, INPUT);
pinMode(BTN_S2, INPUT);
pinMode(BTN_S3, INPUT);
pinMode(POTENCIOMETRO, INPUT);
pinMode(SENSOR_TEMPERATURA, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
//Começando com LED's desligados
digitalWrite(LED1, DESLIGAR);
digitalWrite(LED2, DESLIGAR);
analogWrite(LED3, 255);
analogWrite(LED4, 255);
//Primeiras mensagens ao usuário
Serial.println("Ola, aqui eh o Arduino Uno R3!!!");
Serial.println("Minha inteligencia foi dada por: Gustavo Schmitz Bergmann");
Serial.println("Digite 5 valores positivos: ");
//Pede 5 valores ao usuário
Pedido_Valores(testePositivo);
delay(1000);
Serial.println("Digite um valor de potencia para ser enviado ao LED 3");
Serial.println("Alerta!!! O valor deve ser de 0 a 100%");
delay(1000);
}
//Hexadecimais indicando os números e o display
unsigned char Tabela_Numero[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90};
unsigned char Tabela_Display[4] = {0xF1, 0xF2, 0xF4, 0xF8};
//Função dígito a dígito do display
void Mostrar_Valor_Display(int valor, int disp, bool ponto = false){
digitalWrite(LATCH_7SEG, LOW);
//Ponto Opcional
if(ponto == true){
shiftOut(DATA_7SEG, CLOCK_7SEG, MSBFIRST, Tabela_Numero[valor] & 0x7F);
}
else{
shiftOut(DATA_7SEG, CLOCK_7SEG, MSBFIRST, Tabela_Numero[valor]);
}
shiftOut(DATA_7SEG, CLOCK_7SEG, MSBFIRST, Tabela_Display[disp]);
digitalWrite(LATCH_7SEG, HIGH);
}
//Função do Display
void Mostrar_Display(int numero){
int D0, D1, D2, D3;
//Dígito Display 0
if(numero < 1000){
D0 = 0;
}
else{
D0 = (numero % 10000) / 1000;
}
//Dígito Display 1
if(numero < 100){
D1 = 0;
}
else{
D1 = (numero % 1000) / 100;
}
//Dígito Display 2
if(numero < 10){
D2 = 0;
}
else{
D2 = (numero % 100) / 10;
}
//Dígito Display 3
if(numero < 1){
D3 = 0;
}
else{
D3 = numero % 10;
}
Mostrar_Valor_Display(D0, 0);
Mostrar_Valor_Display(D1, 1);
Mostrar_Valor_Display(D2, 2);
Mostrar_Valor_Display(D3, 3);
}
//Pede os valores a serem mostrados no display
void Pedido_Valores(int testeModulo){
//Enquanto não houver 5 valores
while(count < VAL_SERIAL){
testeModulo = 0;
//Se entrar um valor no serial
if(Serial.available() > 0){
testeModulo = Serial.parseInt();
//Se o valor for entre 0 e 9999
if((testeModulo >= 0) && (testeModulo <= 9999)){
leituraSerial[count] = testeModulo;
Serial.println(leituraSerial[count]);
count++;
}
}
//Mostra quantos valores foram inseridos até o momento
Mostrar_Display(count);
}
}
//Variáveis de controle de tempo
long tempoAnterior = 0, tempoAntPisca = 0, tempoAntTemp = 0;
//Repetições dos valores inseridos no início
int repeticoes = 0;
//Variável de estado do LED 1
bool controleLED = false;
//Variáveis de controle do pisca-pisca LED 2
int tempoLED = 500, controleTempoLED;
bool controlePisca = false;
//Mostra no display os valores digitados
void Valores_Display(){
count = 0;
//Enquanto for menor que 5
while(count < VAL_SERIAL){
long tempoAtual = millis();
Mostrar_Display(leituraSerial[count]);
//Temporizador
if(tempoAtual - tempoAnterior > 1000){
count++;
tempoAnterior = tempoAtual;
}
}
}
//Controle do LED 1 com o botão 1
int Controle_Unico(int buttonOne){
if(buttonOne == BTN_PRESSIONADO){
controleLED = !controleLED;
digitalWrite(LED1, controleLED);
delay(250);
}
}
//Pisca-pisca com o LED 2
void Pisca_Pisca(int buttonTwo, int buttonThree){
long tempoAtualPisca = millis();
//Temporizador controlado pelos botões
if(tempoAtualPisca - tempoAntPisca > tempoLED){
controlePisca = !controlePisca;
digitalWrite(LED2, controlePisca);
tempoAntPisca = tempoAtualPisca;
}
//Aumenta o intervalo do pisca-pisca
if(buttonTwo == BTN_PRESSIONADO){
tempoLED += 50;
delay(250);
}
//Diminui o intervalo do pisca-pisca
if(buttonThree == BTN_PRESSIONADO){
tempoLED -= 50;
delay(250);
}
//Mostra o intervalo na porta serial apenas se for mudado
if(controleTempoLED != tempoLED){
controleTempoLED = tempoLED;
Serial.println(tempoLED);
}
}
/* Controla a potencia do LED 3 a partir
de valores inseridos no monitor serial */
void PotenciaLED_Serial(){
//Se entrar um valor no serial
if(Serial.available() > 0){
//Variável de controle do LED 3 com monitor serial
int potSerial = Serial.parseInt();
int potLED3 = map(potSerial, 0, 100, 255, 0);
//Se o valor for entre 0 e 100
if((potSerial >= 0) && (potSerial <= 100)){
Serial.print(potSerial);
Serial.println("% da potencia do LED 3");
analogWrite(LED3, potLED3);
}
else{
Serial.println("O valor inserido deve ser de 0 a 100!!!");
}
}
}
//Controla a potência do LED 4 com o potenciometro
void PotenciaLED_Potenciometro(int potencia){
int potLED4 = map(potencia, 0, 1023, 0, 255);
int potenciaDisplay = map(potencia, 0, 1023, 100, 0);
analogWrite(LED4, potLED4);
//Mostra a potencia do LED 4 de 0 a 100%
Mostrar_Display(potenciaDisplay);
}
//Mostra a temperatura no monitor serial
void Mostrar_Temperatura(int celsius){
long tempoAtualTemp = millis();
//Temporizador
if(tempoAtualTemp - tempoAntTemp > 1000){
Serial.print(celsius);
Serial.println(" Graus Celsius");
tempoAntTemp = tempoAtualTemp;
}
}
void loop()
{
//Variáveis de leitura dos botões
int botaoUm = digitalRead(BTN_S1);
int botaoDois = digitalRead(BTN_S2);
int botaoTres = digitalRead(BTN_S3);
//Variável de leitura do potenciômetro
int potenciometro = analogRead(POTENCIOMETRO);
//Variável de leitura do sensor TMP36
int leituraSensor = analogRead(SENSOR_TEMPERATURA);
int temperatura = map(leituraSensor, 20, 358, -40, 125);
//Repete os valores inseridos 2 vezes
while(repeticoes < REPETE_VALORES){
Valores_Display();
repeticoes++;
}
//Função de controle do LED 1
Controle_Unico(botaoUm);
//Função de controle do LED 2
Pisca_Pisca(botaoDois, botaoTres);
//Função de controle do LED 3
PotenciaLED_Serial();
//Função de controle do LED 4
PotenciaLED_Potenciometro(potenciometro);
//Função de exibição de temperatura
Mostrar_Temperatura(temperatura);
}