segunda-feira, 11 de novembro de 2013

Chegamos ao fim

Esse é o último post referente ao nosso projeto onde o intuito era entender melhor os sensores e  explicar como foi possível realizar o trabalho.Com nosso projeto de controle de iluminação, análise de temperatura e manipulação por controle remoto, pudemos aprofundar o conhecimento referente à alguns sensores, abrindo assim a mente de todos da equipe, nos permitindo uma visão mais ampla da utilização e aplicação do nosso projeto.
Após essa longa busca por conhecimento podemos afirmar que conseguimos alcançar nossas metas e ainda acrescentar, nossa busca está só no começo pois grandes ideias estão por vir! Obrigado á todos !





Circuito Impresso

Vamos fazer o circuito impresso para nosso projeto ficar bem apresentável para o grande dia...

1° Passo criar a Placa

Podemos fazer de varias formas, tanto a mão quanto através de software específicos para isso, nos iremos usar o Fritzing já citado anteriormente, hoje vamos aprender a função para criar a PCB(placa de circuito impresso).

PCB


Criando a placa

por padrão o software vai fazer 100 rotas alternativas antes de chegar a rota final.

Gerando o PDF


Final

Agora já criado a placa podemos passar para o próximo passo.


2° Imprimir a placa

Nosso processo vai ser em gravar a placa para corroer através de processo térmico, onde iremos utilizar uma impressora laser e uma folha de impressão de foto.
podemos melhor entender através desse vídeo:





 retocando alguns pontos

 cuidado para não esquentar demais a placa e o cobre descolar do fonolite 


3° Corroendo a placa

Agora vamos utilizar de percloreto de ferro para fazer a corrosão da placa onde o produto ira atacar o material q não tiver a película de tinta em cima.


percloreto de ferro

 Placa de molho mais ou menos 20 minutos

Com uma palha de aço tiramos a marca da tinta  



4° Furando a placa

Nesse processo podemos utilizar de uma furadeira ou um furador de PCB proprio para o serviço.




  5° Soldar os componentes

Agora só soldar os componentes e pronto.

Sensores adicionais


Como o intuito inicial do projeto era trabalhar com sensores vamos adicionar mais dois sensores um de temperatura e um para comandar o circuito através de controle remoto, então nosso projeto conta com um sensor LDR já explicado em postagem anteriores e agora vamos adicionar o LM35( sensor de temperatura) e um Receptor decodificador de sinal infra vermelho a uma faixa de frequência de 38KHz.

LM35

Entre os sensores de temperatura o LM35 é o mais simples, usamos os sensores de temperatura em grande escala para processos industriais ou comerciais onde existe a necessidade de controlar ou monitorar a temperatura. O LM35 é fabricado pela National Semicondutores, fabricado na forma de um transistor tem como finalidade fornecer uma saida de tensão proporcional a  temperatura absoluta que age sobre ele, este tipo de sensor de temperatura pode trabalhar e fornecer temperaturas entre -55 a 150°C.

  • Fornece tensões de 10mV/ °C
  • Precisão de 0,5°C
  • Opera entre 4 a 30 volts
  • Baixa impedancia de saida 0,1ohm para cargas de 1mA


Receiver IR TSOP4838

O receiver IR trabalha em uma fequencia especifica de varredura de 38KHz uma varredura padrão para televisores e rádios o que nos possibilita usar diversos controles de fácil acesso. Muito fácil de utilizar o receptor pode ser implementado no arduino sem muitos problemas, e o o que torna mais fácil é descobrir qual o código de cada tecla do nosso controle remoto, para isso o Arduíno ira nos ajudar muito.


Para descobrir o código de cada teclado controle remoto através do arduino, veja:


Projeto Final

Programação

Toda a programação esta comentada.
Nossa programação teve algumas mudanças para melhor atender a parte física como por exemplo mudança dos pinos de sinal do LCD e outros sensores, e uma mudança no software para melhorar o processamento.

//*******************************************************************************
//
//    Software V1.7(Final)    Hardware V1.4(Final)
//
//      - Sensor de temperatura LM35
//      - Sensor de iluminação LDR       
//      - Sensor de receptor Infra vermelho para controle remoto   
//
//*******************************************************************************
#include <LiquidCrystal.h>
#include <IRremote.h> 

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);// Define os pinos do LCD

const int SensorLDR = A0; // Entrada do sensor LDR em porta analogica      
const int LedLCD = 6; // Pino de saida Led do LCD com saida PWM
const int LM35= A5; // Pino de entrada LM35
float temperatura; //Variavel para armazenar 
float temperaturafinal; //Variavel para armazenar valor final
int SensorValorLDR = 0; // Variavel que armazena o valor do LDR
int SaidaValorLDR = 0; //Variavel  que armazena o valor para colocar na saida  
int SaidaLedLCD = 0; //Variavel  que armazena o valor para colocar na saida 
int AC_LOAD = 3;    // Pino de saida para o Optoacoplador >> TRIAC
int dimming = 120;  // valor inicial de Dimming
int countsala = 1; // Valor para contragem da nossa chave 
const int AtivaOptoZero = 5; // Declara q no pino 13 sera para o Opto 
int SensorIR = A4; //Entrada sensor infra vermelho
float armazenavalor; // Armazena valor IR
IRrecv irrecv(RECV_PIN);// Analise do IR
decode_results results; //decodificador do sinal do IR

void setup()
{
  lcd.begin(16, 2); // Inicia o LCD 16x2
  pinMode(13, OUTPUT); // Defino o pino 13 como saida
  Serial.begin(9600); // Inicia comunicação com a serial
  irrecv.enableIRIn(); // Inicializa o receptor IR   
  pinMode(AC_LOAD, OUTPUT);// Declara AC_LOAD como saida
  attachInterrupt(0, zero_crosss_int,RISING);// Ativa interrupção para passagem por zero da senoide
  pinMode(AtivaOptoZero, OUTPUT); // declara AtivaOptoZero como saida
  pinMode(LedLCD, OUTPUT);// declara LedLCD como saida
  digitalWrite(LedLCD, HIGH);// declara LedLCD como "1"
  lcd.setCursor(0, 0);// seta cursor do LCD linha e coluna zero
  lcd.print("LumenClass "); // Escreve "LumenClass "
  lcd.setCursor(0, 1);// seta coluna zero linha um
  lcd.print("Eng.Eletrica ");// Escreve "Eng.Eletrica "
//== Efeito para correr o letreiro==================================================   
            for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
              lcd.scrollDisplayLeft(); 
              delay(180);
            }
            for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
              lcd.scrollDisplayRight(); 
              delay(180);
            }
            for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
              lcd.scrollDisplayLeft(); 
              delay(180);
            }
            delay(5000);
//==================================================================================
}

void zero_crosss_int(){  // Função da passagem por zero
  // Calculo do angulo da senoide :: 60Hz-> 8.33ms (1/2 Ciclo)
  // (8333us - 8.33us) / 128 = 65 (aproximado)
  int dimtime = (65*dimming);      
  delayMicroseconds(dimtime); 
  digitalWrite(AC_LOAD, HIGH);// Disparo TRIAC
  delayMicroseconds(8.33);// Triac ligado em 8.33us, atraves da nossa base de calculo
  digitalWrite(AC_LOAD, LOW);// Corte do TRIAC
}

void loop(){
  lcd.clear();// Apaga LCD
  leitura();// Chama função 
  if (irrecv.decode(&results))// se receber sinal no IR... 
  { 
  Serial.print("Valor lido : "); //Escreve na serial "Valor lido : "
  Serial.println(results.value, DEC);//Escreve na serial o valor do IR
  armazenavalor = (results.value);// Armazena o valor do IR na variavel "armazenavalor"
  if (armazenavalor == 233  ) //Verifica se a tecla 1 foi pressionada 
  { 
  countsala++; //soma mais uma unidade "+1"
  delay(100);// espera de 100 mili segundos
  }
  irrecv.resume(); //Le o próximo valor 
  } 

switch (countsala) {
  case 1:    //1° opção do menu
    lcd.setCursor(0, 0);//seta o LCD 
    lcd.print("LAMPADA");//Escreve
    lcd.setCursor(0, 1);//seta o LCD
    lcd.print("Desligada");//Escreve
    digitalWrite(AtivaOptoZero, LOW); // Liga o pino 13 : AtivaOptoZero
    delay(100);// espera de 100 mili segundos
    lcd.clear();// apaga o LCD 
break;

case 2:    //2° opção do menu
    lcd.setCursor(0, 0);//seta o LCD 
    lcd.print("LAMPADA");//Escreve
    lcd.setCursor(0, 1);//seta o LCD 
    lcd.print("ligada");//Escreve
    dimming= 10;// lampada no maximo
    digitalWrite(AtivaOptoZero, HIGH); // Liga o pino 13 : AtivaOptoZer
    delay(100);// espera de 100 mili segundos
    lcd.clear();// apaga o LCD 
break;

case 3:    //3° opção do menu
    digitalWrite(AtivaOptoZero, HIGH); // Liga o pino 13 : AtivaOptoZer
    lcd.setCursor(0, 0); //seta o lcd na linha zero coluna zero
    lcd.print("AUTO "); // e escreve 
    SensorValorLDR = analogRead(SensorLDR);// Lê o valor do LDR e salva em SensorValorLDR   
    SaidaValorLDR = map(SensorValorLDR, 0, 1023, 0, 100); //Pega o valor de SensorValorLDR cria um map de 0 a 100 e salva na SaidaValorLDR 
    lcd.print(SaidaValorLDR); //escreve SaidaValorLDR no LCD  
    lcd.print(char(37)); // escreve o caracter % no LCD
    SaidaValorLDR = SensorValorLDR; // Pega o valor do SensorValorLDR novamente e salva em SaidaValorLDR
    SaidaLedLCD = map(SaidaValorLDR , 0, 1023, 0, 110); //min=0 max=128 // Cria um map de 0 a 110 << para melhor ajustar a lampada  
    dimming = SaidaLedLCD; //Pega o valor do map SaidaLedLCD e salva em dimming
    analogWrite(LedLCD, SaidaLedLCD); // Escreve o valor de SaidaLedLCD no LedLCD
          for(int i=0;i<50;i++)//for para ler 50 vezes para fazer media
          {
           temperatura=temperatura+analogRead(LM35);
          }
    temperatura=temperatura/50; ;//divide toda a soma por 50 para tirar a media                           
    temperaturafinal = (5.0 * temperatura * 100.0) / 1024;//formula para converter o sinal do LM35 
    lcd.setCursor(9,0);//seta o LCD 
    lcd.print(temperaturafinal,0);// ,0   sem nenhuma casa depois da virgula
    lcd.print(char(223));//escreve "º" no LCD
    lcd.print("C");//Escreve
    delay(50); // delay para não carregar o processamento
    lcd.clear();// apaga o LCD                
break;

case 4:    //4° opção do menu
    lcd.setCursor(0, 0);//seta o LCD 
    lcd.print("AJUSTE FIXO");//Escreve
    lcd.setCursor(0, 1);//seta o LCD 
    digitalWrite(AtivaOptoZero, HIGH); // Liga o pino 13 : AtivaOptoZer
    delay(100);// espera de 100 mili segundos
    lcd.clear();// apaga o LCD     
break;

case 5:    //5° opção do menu
    countsala = 1;// Chama a 1° opção do menu
break;
}
}

void leitura(){
  SensorValorLDR = analogRead(SensorLDR);// Lê o valor do LDR e salva em SensorValorLDR   
  SaidaValorLDR = map(SensorValorLDR, 0, 1023, 0, 100); //Pega o valor de SensorValorLDR cria um map de 0 a 100 e salva na SaidaValorLDR 
  SaidaValorLDR = SensorValorLDR; // Pega o valor do SensorValorLDR novamente e salva em SaidaValorLDR
  SaidaLedLCD = map(SaidaValorLDR , 0, 1023, 0, 110); //min=0 max=128 // Cria um map de 0 a 110 << para melhor ajustar a lampada  
  analogWrite(LedLCD, SaidaLedLCD); // Escreve o valor de SaidaLedLCD no LedLCD
}



Hardware

Montagem para prototipagem.


Esquema elétrico.