Fala pessoal,
Eu postei a algum tempo meu primeiro projeto usando Arduíno, para ver clique aqui, sabe o que foi legal? Muita gente comentou, deu idéias, sugeriu, fui até de chamado de incendiário (kkkk), ta valendo, esses são os estímulos para crescermos certo ?
Bom refiz meu projeto agora como deveria ser, usando emissor IR (sem risco de torrar o A/C), e tive a ajuda de uma colega nosso aqui do fórum o Alex Marola Barbosa (Valeu chefe!!!), dai melhorei o código, ele me deu um toque de como usar as funções de forma racional (as void's).
Vou postar então a versão 2.0 da coisa, fica aberto ai para opinar, falar se gostou se odiou, enfim é fazendo que se aprende.
O sistema ficou dessa forma:
1)- Gravei os códigos dos controles;
2)- Uso o LM35 para medir a temperatura do ambiente;
3)- Fiz uma lógica onde dependendo da temperatura do Ambiente o Arduíno manda sinal pelo IR para ligar ou desligar o Ar Condicionado;
4)- Acrescentei um LCD 16x2 para mostrar temperatura e fazer alguns ajustes, como, temperatura Máxima (ponto de ligar o AC), temperatura Mínima (ponto de Desligar o AC), ligar e desligar a Luz do LCD;
5)- Coloquei três botões para:
5.1)- O primeiro botão navega pelas funções, Tela inicial, Temp Máx, Temp Min, Luz de fundo, voltando para tela inicial;
5.2)- O Segundo botão é o botão " + " ou incrementa ou liga LCD;
5.3)- O Terceiro botão é o botão " - " ou decrementa ou desliga LCD.
O código eu peguei em algum lugar, mas tive que refazer e só usei como base para estudar a melhor de faze-lo novamente.
O código:
#include <LiquidCrystal.h>
#include <IRremote.h>//funcoes das teclas do controle remoto
unsigned int ligar[200] = {4300,4400,600,1550,600,500,550,1650,550,1600,550,550,550,500,600,1600,550,500,600,500,550,1600,600,500,550,550,550,1600,550,1600,600,500,550,1600,600,500,600,500,550,550,550,1600,550,1600,600,1550,600,1600,550,1600,550,1600,600,1600,550,1600,550,550,550,550,550,500,600,500,550,550,550,500,600,1600,550,550,550,1600,550,1600,600,500,550,550,550,500,600,1600,550,500,600,1600,550,550,550,500,600,1550,600,1600,550,1600,500,5250,4400,4300,600,1600,550,500,600,1600,550,1600,550,550,550,500,600,1600,550,500,600,500,550,1650,550,500,600,500,550,1650,550,1550,600,500,600,1600,550,500,600,500,550,550,550,1600,550,1600,600,1600,550,1600,550,1600,600,1600,550,1600,550,1600,550,550,550,550,550,500,600,500,550,550,550,550,550,1600,550,550,550,1600,550,1600,600,500,550,550,550,500,600,1600,550,550,550,1600,550,550,550,500,600,1600,550,1600,550,1600,500,};
unsigned int desligar[200] = {4400,4350,550,1600,550,550,550,1600,550,1600,550,550,550,550,550,1600,550,550,550,550,500,1650,550,550,550,550,500,1650,550,1600,550,550,550,1600,550,550,550,1600,550,1650,500,1650,550,1600,550,550,550,1600,550,1600,550,1650,550,550,500,550,550,550,550,550,550,1600,550,550,550,550,500,1650,550,1600,550,1600,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,500,550,1650,550,1600,550,1600,600,1600,500,1650,500,5250,4350,4350,550,1600,600,500,550,1600,600,1600,500,600,500,550,550,1600,600,500,550,550,550,1600,600,500,550,550,550,1600,550,1600,550,550,550,1650,500,550,550,1650,500,1650,550,1600,550,1600,550,550,550,1600,550,1650,550,1600,550,550,550,550,500,550,550,550,550,1600,550,550,550,550,550,1600,550,1650,550,1600,500,600,500,550,550,550,550,550,500,550,550,550,550,550,550,550,500,1650,550,1600,550,1650,500,1650,550,1600,500,};
unsigned int atalho[200] = {4400,4300,600,1600,550,500,600,1600,550,1600,550,550,550,500,600,1600,550,500,600,500,550,1650,550,500,550,550,550,1600,550,1600,600,500,550,1650,550,500,600,500,550,550,550,1600,550,1600,600,1600,550,1600,550,1600,550,1650,550,1600,550,1600,550,550,550,550,550,500,550,550,550,550,550,550,550,500,600,1600,550,1600,550,1600,550,550,550,550,550,500,600,1600,550,1600,550,550,550,500,600,500,550,1600,600,1600,550,1600,500,5200,4400,4350,550,1600,550,550,550,1600,550,1600,600,500,550,550,550,1600,550,550,550,550,550,1600,550,550,550,500,600,1600,550,1600,550,550,550,1600,550,550,550,500,600,500,550,1600,600,1600,550,1600,550,1600,600,1600,550,1600,550,1600,600,1550,600,500,550,550,550,550,550,500,600,500,550,550,550,550,550,1600,550,1600,550,1600,600,500,550,550,550,550,550,1600,550,1600,550,550,550,550,550,500,600,1600,550,1600,550,1600,500,};IRsend irsend;
int contador=0;
int inicialTempMax = 24; // Temperatura Máxima padrão
int inicialTempMin = 19; // Temperatura Minima padrão
int inicialTempo = 10; // Tempo Padrão
int estado = 1; // estado da luz de fundo
int contaMax = 0; // conta 0 ou 1 para nao ficar mandando pulso no IR
int contaMin = 1; // conta 0 ou 1 para nao ficar mandando pulso no IRint luzFundo = 7;
const int buttonMenu = 11; // Pino Botão Menu
const int buttonPinMais = 12; // Pino Botão Aumenta
const int buttonPinMenos = 13; // Pino Botão DiminuiLiquidCrystal lcd(10, 6, 5, 4, 3, 2);
int pinoSensor = 0; //pino que está ligado o terminal central do LM35 (porta analogica 0)
int valorLido = 0; //valor lido na entrada analogica
float temperatura = 0; //valorLido convertido para temperaturaint tempoEntreAcao = 1000; // tempo à esperar entre ligar o ac e acionar a tecla atalho
// VOID SETUP
void setup(){lcd.begin(16, 2);
pinMode(buttonMenu, INPUT);
pinMode(buttonPinMais, INPUT);
pinMode(buttonPinMenos, INPUT);
pinMode(luzFundo, OUTPUT);
digitalWrite(luzFundo, HIGH);
Serial.begin(9600);
}//VOID LOOP
void loop(){
// 1.A #### LENDO A TEMPERATURA E CONVERTENDO #####
valorLido = analogRead(pinoSensor);
temperatura = (valorLido * 0.00488); // (5V / 1023) = 0.00488 (precisão do A/D) OBS: USANDO LM35
temperatura = temperatura * 100; //Converte milivolts para graus celcius, lembrando que a cada 10mV equivalem a 1 grau celcius
// botao que seleciona a funcao do menu
if (digitalRead(buttonMenu) == HIGH) {
delay(250);
contador=contador+1;
}
if (contador>3){ // zera o contador para voltar ao inicio tenho tres opcoes apenas
contador=0;
}
// switch para puxar a funcao de cada opcao do menu
switch(contador){
case 0:
inicio();
break;
case 1:
tempMaxAjuste();
break;
case 2:
tempMinAjuste();
break;
case 3:
luz();
break;
}
delay (tempoEntreAcao);;
ligarDesligar();
} // FIM DO LOOP// SECAO DAS FUNCOES
//funcao da tela inicial
void inicio()
{
lcd.setCursor(0,0);
lcd.print("MAX MIN TEMP ");
lcd.setCursor(0,1);
lcd.print(inicialTempMax);
lcd.print(" ");
lcd.print(inicialTempMin);
lcd.print(" ");
lcd.print(temperatura);
lcd.print("C");
}// Funcao de ajuste da temperatura Maxima
void tempMaxAjuste()
{
if(digitalRead(buttonPinMais) == HIGH && contador == 1){
inicialTempMax = inicialTempMax ++;
}
if(digitalRead(buttonPinMenos) == HIGH && contador == 1){
inicialTempMax = inicialTempMax --;
}
// imprime no LCD
lcd.setCursor(0,0);
lcd.print("Temp. Max (Liga)");
lcd.setCursor(0,1);
lcd.print(inicialTempMax);
lcd.print(" ");
}// Funcao de Ajuste da Temperatura Minima
void tempMinAjuste()
{
if(digitalRead(buttonPinMais) == HIGH && contador == 2){
inicialTempMin = inicialTempMin ++;
}
if(digitalRead(buttonPinMenos) == HIGH && contador == 2){
inicialTempMin = inicialTempMin --;
}
// imprime no LCD
lcd.setCursor(0,0);
lcd.print("Temp. Min (Desl)");
lcd.setCursor(0,1);
lcd.print(inicialTempMin);
lcd.print(" ");
}// Funcao de ajuste do tempo de leitura da temperatura
void luz()
{
if(digitalRead(buttonPinMais) == HIGH && contador == 3){
digitalWrite(luzFundo, HIGH);
estado = 1;
}
if(digitalRead(buttonPinMenos) == HIGH && contador == 3){
digitalWrite(luzFundo, LOW);
estado = 0;
}
// imprime no LCD
lcd.setCursor(0,0);
lcd.print("Luz de Fundo ");
lcd.setCursor(0,1);
if(estado == 1){
lcd.print("Ligado ");
}
lcd.setCursor(0,1);
if(estado == 0){
lcd.print("Desligado ");
}
}// funcao que controla o A/C responsavel por medir a temperatura e ligar ou desligar o A/C
void ligarDesligar(){
if(temperatura > inicialTempMax && contaMax == 0){ // SE A TEMPERATURA ESTIVER MAIOR DO QUE A max DEFINIDA NO LCD LIGA O AR
irsend.sendRaw(ligar,200,38);
delay (tempoEntreAcao);
irsend.sendRaw(atalho,200,38);
contaMax = 1; // conta 0 ou 1 para nao ficar mandando pulso no IR
contaMin = 0; // conta 0 ou 1 para nao ficar mandando pulso no IR
delay (tempoEntreAcao);
}else if (temperatura < inicialTempMax && temperatura > inicialTempMin){
delay (tempoEntreAcao);
}else if(temperatura < inicialTempMin && contaMin == 0){ // SE A TEMPERATURA ESTIVER MENOR DO QUE A min DEFINIDA NO LCD DESLIGA O AR
irsend.sendRaw(desligar,200,38);
delay (tempoEntreAcao);
contaMax = 0; // conta 0 ou 1 para nao ficar mandando pulso no IR
contaMin = 1; // conta 0 ou 1 para nao ficar mandando pulso no IR
}else{
delay (tempoEntreAcao);
}}
Vídeo de como ficou:
Abraço pessoal
Tags:
Chique demais Michael, obrigado por compartilhar.
Meu ar é split da carrier (springer): vc sabe dizer se dá pra usar a técnica de clonagem do controle pra obter a sequencia de números pra comandar meu ar?
Boa Tarde Imhugo, da sim, mas tem que fazer as devidas modificações nas libs IRremote para poder ler o tamanho da array do controle
Michael,
Você poderia dizer para que serve o array 'atalho'?
Obg
No caso, tanto faz ter essa parte no código?
Desculpe até essas perguntas, mas estou iniciando agora essa parte de codificação e decodificação do controle.
Abraço
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2023 Criado por Marcelo Rodrigues.
Ativado por