/*
Circuito esquemático para simular o Shield Multifunções
Curso de Integrado em Automação Industrial
Linguagem de Programação - TAI2V
Prof. Ricardo Prediger
*/
// Definições dos terminais
// Display
#define LATCH_7SEG 4
#define CLOCK_7SEG 7
#define DATA_7SEG 8
// LED's
#define LED_1 13
#define LED_2 12
#define LED_3 11
#define LED_4 10
// BUZZER
#define BUZZER 3
// Botões
#define BTN_S1 A1
#define BTN_S2 A2
#define BTN_S3 A3
// Sensor de temperatura
#define SENSOR_TEMPERATURA A4
// Potenciomentro
#define POTENCIOMETRO A0
#define LIGA LOW
#define DESLIGA HIGH
#define BTN_PRESSIONADO LOW
#define BTN_DESPRESSIONADO HIGH
#define VAL_INSERIDOS 5
#define REPETE_VAL 2
void Imprimir_Numero_Display(int Numero, int Display){
// Tabelas com os códigos dos numeros e display
static const byte Tabela_Numeros[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xD8, 0x80, 0x90};
static const byte Tabela_Display[] = {0xF1, 0xF2, 0xF4, 0xF8};
if ((Display < 4) && (Numero < 20))
{
digitalWrite(LATCH_7SEG, LOW); // Coloqua a porta ST_CP no nível baixo para que o chip esteja pronto
shiftOut(DATA_7SEG, CLOCK_7SEG, MSBFIRST, Tabela_Numeros[Numero]); // Envia o Numero
shiftOut(DATA_7SEG, CLOCK_7SEG, MSBFIRST, Tabela_Display[Display]); // Seleciona qual display deve ligar
digitalWrite(LATCH_7SEG, HIGH); //Retorne o pino ST_CP ao nÃvel alto
}
//delay(1); //Tempo minimo que o display ira ficar ligado
}
void Imprimir_Display(int Valor){
int D0, D1, D2, D3;
//Dígito Display 0
if(Valor < 1000){
D0 = 0;
}
else{
D0 = (Valor % 10000) / 1000;
}
//Dígito Display 1
if(Valor < 100){
D1 = 0;
}
else{
D1 = (Valor % 1000) / 100;
}
//Dígito Display 2
if(Valor < 10){
D2 = 0;
}
else{
D2 = (Valor % 100) / 10;
}
//Dígito Display 3
if(Valor < 1){
D3 = 0;
}
else{
D3 = Valor % 10;
}
Imprimir_Numero_Display(D0, 0);
Imprimir_Numero_Display(D1, 1);
Imprimir_Numero_Display(D2, 2);
Imprimir_Numero_Display(D3, 3);
}
//Variável que verifica se o valor inserido é positivo e contador
int Teste_Positivo, cont;
//Vetor que armazena os valores inseridos no Serial
int Valores_Inseridos[VAL_INSERIDOS];
void setup()
{
// Display 7 Segmentos
pinMode(LATCH_7SEG, OUTPUT);
pinMode(CLOCK_7SEG, OUTPUT);
pinMode(DATA_7SEG, OUTPUT);
// Led's
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
// Buzzer
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, DESLIGA); //Desligando o buzzer
// Botões
pinMode(BTN_S1, INPUT);
pinMode(BTN_S2, INPUT);
pinMode(BTN_S3, INPUT);
// Sensor Temperatura
pinMode(SENSOR_TEMPERATURA, INPUT);
// Potenciomentro
pinMode(POTENCIOMETRO, INPUT);
//Iniciando os LED's deligados
digitalWrite(LED_1, DESLIGA);
digitalWrite(LED_2, DESLIGA);
analogWrite(LED_3, 255);
analogWrite(LED_4, 255);
Serial.begin(9600);
Serial.println("OLA! Muito prazer, me chamo WALL-E e minha criadora chama-se Yasmin Silveira!");
Serial.println("Insira 5 numeros: ");
Insere_Numeros();
delay(1000);
Serial.println("Insira uma potencia a ser enviada ao LED 3");
Serial.println("ATENCAO!!! O valor deve ser uma porcentagem de 0 a 100");
delay(1000);
}
//Pede para inserir 5 valores
void Insere_Numeros(){
//Enquanto não houver 5 valores
while(cont < VAL_INSERIDOS){
Teste_Positivo = 0;
//Se o usuário inserir um valor na entrada Serial
if(Serial.available() > 0){
Teste_Positivo = Serial.parseInt();
//Se o valor for positivo e menor que 10000
if((Teste_Positivo > 0) && (Teste_Positivo < 10000)){
Valores_Inseridos[cont] = Teste_Positivo;
Serial.println(Valores_Inseridos[cont]);
cont++;
}
}
//Mostra a quantidade de valores inseridos no momento
Imprimir_Display(cont);
}
}
//Define se o LED está ligado ou desligado
bool Estado_LED = false;
//Variáveis de tempo para usar o millis()
unsigned long Tempo_Atual, Tempo_Anterior, Tempo_Anterior_Pisca,
Tempo_Anterior_Temperatura;
//Rapetições dos valores inseridos
int repeticao = 0;
//Variáveis da função do LED 2
int Tempo_LED = 500, Controle_Tempo_LED;
bool Controle_LED;
//Mostra no display os valores digitados
void Num_Inseridos_Display(){
//Faz com que repita os valores 2 vezes
while(repeticao < REPETE_VAL){
cont = 0;
//Enquanto for menor que 5
while(cont < VAL_INSERIDOS){
Tempo_Atual = millis();
Imprimir_Display(Valores_Inseridos[cont]);
//Temporizador
if(Tempo_Atual - Tempo_Anterior > 1000){
cont++;
Tempo_Anterior = Tempo_Atual;
}
}
repeticao++;
}
}
//Função com argumento
//Liga ou desliga o LED 1 quando o botão 1 é pressionado
void Controle_LED1(int Botao_Um){
if(Botao_Um == BTN_PRESSIONADO){
Estado_LED = !Estado_LED;
digitalWrite(LED_1, Estado_LED);
delay(250);
}
}
void Controle_LED2(int Estado_Botao_Dois, int Estado_Botao_Tres){
Tempo_Atual = millis();
//Botões controlando o temporizador
if(Tempo_Atual - Tempo_Anterior_Pisca > Tempo_LED){
Controle_LED = !Controle_LED;
digitalWrite(LED_2, Controle_LED);
Tempo_Anterior_Pisca = Tempo_Atual;
}
//Aumenta o tempo que o LED fica ligado/desligado
if(Estado_Botao_Dois == BTN_PRESSIONADO){
Tempo_LED += 50;
delay(250);
if(Tempo_LED > 1000){
Tempo_LED = 1000;
}
}
//Diminui o tempo que o LED fica ligado/desligado
if(Estado_Botao_Tres == BTN_PRESSIONADO){
Tempo_LED -= 50;
delay(250);
}
//Mostra o intervalo na porta serial apenas se for mudado
if(Controle_Tempo_LED != Tempo_LED){
Controle_Tempo_LED = Tempo_LED;
Serial.print(Tempo_LED);
Serial.println(" ms - LED 2");
}
}
/* Controla a potencia do LED 3 a partir
de valores inseridos no monitor serial */
void Controle_LED3(){
//Se entrar um valor no serial
if(Serial.available() > 0){
//Controlam o LED 3 usando o monitor serial
int Potencia_Serial = Serial.parseInt();
int Potencia_LED3 = map(Potencia_Serial, 0, 100, 255, 0);
//Se o valor for entre 0 e 100
if((Potencia_Serial >= 0) && (Potencia_Serial <= 100)){
Serial.print(Potencia_Serial);
Serial.println("% da potencia do LED 3");
analogWrite(LED_3, Potencia_LED3);
}
else{
Serial.println("O valor inserido deve ser de 0 a 100!!!");
}
}
}
//Controla a potência do LED 4 com o potenciometro
void Controle_LED4(int Potencia){
int Potencia_LED4 = map(Potencia, 0, 1023, 0, 255);
int Potencia_Display = map(Potencia, 0, 1023, 100, 0);
//Escreve o valor de potência no LED 4
analogWrite(LED_4, Potencia_LED4);
//Mostra a potencia do LED 4 de 0 a 100%
Imprimir_Display(Potencia_Display);
}
//Mostra a temperatura no monitor serial
void Imprimir_Temperatura(int Celsius){
Tempo_Atual = millis();
//Temporizador
if(Tempo_Atual - Tempo_Anterior_Temperatura > 1000){
Serial.print(Celsius);
Serial.println(" Graus Celsius");
Tempo_Anterior_Temperatura = Tempo_Atual;
}
}
void loop()
{
//Leitura dos botoes
int Estado_Botao_Um = digitalRead(BTN_S1);
int Estado_Botao_Dois = digitalRead(BTN_S2);
int Estado_Botao_Tres = digitalRead(BTN_S3);
//Leitura do potenciometro
int Potenciometro = analogRead(POTENCIOMETRO);
//Variável de leitura do sensor TMP36
int Leitura_Sensor = analogRead(SENSOR_TEMPERATURA);
int Temperatura = map(Leitura_Sensor, 20, 358, -40, 125);
//Chamando as funções
Num_Inseridos_Display();
Controle_LED1(Estado_Botao_Um);
Controle_LED2(Estado_Botao_Dois, Estado_Botao_Tres);
Controle_LED3();
Controle_LED4(Potenciometro);
Imprimir_Temperatura(Temperatura);
}