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 IR

int 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 Diminui

LiquidCrystal 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 temperatura

int 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:

http://youtu.be/objSfIWvZN8

Abraço pessoal

Exibições: 3202

Anexos

Responder esta

Respostas a este tópico

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

Imhugo, cara meu ar também é Carrier, dai tem usar a IRremote passando o codigo RAW que pode se ser obtido pelo exemplo que vem na própria biblioteca senão me engano chama IRrecvDump.

Obrigado.
Qualquer dúvida, da um toque que se conseguir ajudar faço com certeza.

Abraço.

Michael,

Você poderia dizer para que serve o array 'atalho'?

Obg

Fala Rodolfo,
Cara o 'atalho' é aquele botão programável do A/C tipo um botão rápido, onde é possível memorizar algumas configs tipo, temperatura, posição da pás, tempo de desligar esse tipo de coisa. Eu deixei comentando por que no código de ligar já está pré acertado isso coloquei o ar condições. em 19 graus e apertei o botão de ligar, dai ele me retornou essa string.
Grande abraço

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

Exato, o importante no meu caso foi ter o código de ligar e desligar. Você pode deixar o a/c na temperatura que desejar ligar por exemplo e pegar o código dessa forma. No Springer, que é o meu caso, eu posso ajustar tudo que preciso via controle remoto sem apontar para o aparelho, e depois simplesmente apertar o botão ligar na direção do aparelho e ele vai ligar de acordo com a config que selecionei. Dessa forma forma não precisei do botão de atalho. Convém fazer o teste no seu aparelho e ver se ele funciona dessa forma também.
Qualquer coisa me de um toque.
Abraço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço