quarta-feira, 29 de junho de 2011

Programação Sensor de Luz


     Nessa programação vamos usar a programação if só, mas podemos também usar a programação do switch / case. Ambos são simples de usar, mas as pessoas que tem dificuldade nessa programação é bom fazer um fluxograma do que pretende fazer na programação, ajuda muito a ter a ideia de como monta-la.

Primeiramente vamos entender as funções:
-If: Expressa uma condição, para usa-la precisa usar também o conjunto de operação de comparação.

-Operação de Comparação:
 x == y (x é igual a y)
 x! = y (x não é igual a y)
 x <y (x é menor que y) 
 x> y (x é maior que y)
 x <= y (x é menor ou igual a y)
 x> = y (x é maior ou igual a y)

-Operações Booleanas:
 && (AND, é verdade quando x E y é maior que 0)
 ||     (OR, é verdade quando x OU y é maior que 0)
!       (NOT é verdade quando x é igual a 0)

-Switch / Case: Permiti controlar o fluxo do programa para que os programadores especifique o código diferente que deve ser executado em varias condições. Criamos vários casos, ai o arduino vai olhar cada caso e ver qual irá se encaixar na condição que declarou.

-Break: Serve para sair de cada case, isso serve para que se a condição for falsa passe para a próxima condição até chegar à verdadeira.

     Geralmente essas estruturas de controle são usadas para programar sensores, mas também pode programar qualquer coisa que não seja sensor.

Programação if:
     Vou fazer a programação do seguidor de linha como exemplo dessa programação:
int ldr1= 0; //Porta Analógica do Arduino
int valor1 = 850; //Variável qualquer que utilizei para o ldr1
int ldr2 = 1; //Porta Analógica do Arduino
int valor2 = 900; Variável qualquer que usei para o ldr2
void setup()
{
  
Serial.begin(9600); //Taxa de transmissão de dados 9600bps
}
void loop()
{
  valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
  valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
  //Ambos os sensores veem branco
  if(valor1>920 && valor2>920) //Condição 1
  {
   //Faz algo, anda, para ou o que quiser
  }
  //Ambos os sensores veem preto
 if(valor1<920 && valor2<920) //Condição 2
  {
   //Faz algo diferente da primeira, anda, para ou o que quiser
  }
}
     Vamos por parte, no setup() perceberam que eu não declarei os sensores, isso porque eu coloquei nas portas analógicas do arduino, por que se fosse às portas digitais eu deveria declarar.
     Agora vimos mais uma nova função Serial.begin(9600), que define a taxa de dados de bits por segundo, o padrão que geralmente sempre usamos e de 9600 bps.
     No loop() eu só precisei preparar os sensores apenas 1 vez e só fiz 2 condições (apesar de que para o que pretendo fazer seriam 4 condições [preto & preto; branco & branco; preto & branco; branco & preto])
     Na hora que preparei os sensores, declarei que cada valor1 pertence ao sensor ao ldr1 e o valor2 pertence ao sensor ldr2. Mas quando se "prepara" um sensor só escreve analogRead(pino) se for à porta analógica do arduino ou digitalRead(pino) se for à porta digital da placa.

Programação switch / case:
     Nessa programação vai ter coisas da programação anterior. Vamos ter que preparar o sensor para cada caso. Mas vou direto ao loop() porque antes disso é o mesmo a diferença vai ser pouca também.

void loop()
{
  switch(int Estado = 1)
  {
    case 1:
    valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
    valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
    //Ambos os sensores veem branco
    if(valor1>920 && valor2>920) //Condição 1
    {
      //Faz algo, anda, para ou o que quiser
    }
    else
    {
      Estado = 2;
    }
    case 2:
    valor1=analogRead(ldr1); //Preparei o sensor1 e declarei que o valor1 pertence ao ldr1
    valor2=analogRead(ldr2);  //Preparei o sensor1 e declarei que o valor2 pertence ao ldr2
    //Ambos os sensores veem preto
    if(valor1<920 && valor2<920) Condição 2
    {
      //Faz algo diferente da primeira, anda, para ou o que quiser
    }
    else
    {
      Estado = x; // x seria o próximo estado
    } 
}
     Como viram também vimos à função else, que nada mais é o contrario de if. SE (if) for verdade faz isso, SE NÃO (else) faz aquilo. Mas no if precisa declarar a condição, falar os valores e no else não precisa disso.
     Também tive que cria um estado (mas poderia ter colocado outro nome), isso entende que cada case é um Estado diferente e com isso da para passar para o próximo case.
     Em relação aos valores (valor1 e valor2) eu tive que verificar antes os valores de cada sensor... ex.: Cada sensor não vão dar o mesmos valores e fica variando. Eu peguei o menor valor de branco e o maior valor de preto e tirei a media deles, essa media é o valor1 ou o valor2. Precisa fazer isso em cada sensor e de preferência toda vez que usar, como os sensores foram montados com o tempo o componente vai ficando fraco e os valores vai mudando muito.

     Os valores 920 eu chutei, vi que acima disso o LDR detectava que era branco e a baixo disso detectava preto. Mas esse valor podemos mudar também. Outro exemplo seria comprar a média com o menor valor de branco ou maior valor de preto (ex.: o branco variava de 915 a 945 e preto de 810 a 860... logo tirei a media x e quando comparei ficou; if(valor de x > 860) quer dizer que está vendo branco; if(valor de x < 915) quer dizer que está vendo preto.
     Outra diferença entre essas programações if e switch é que no switch o arduino vai verificar caso por caso para ver qual vai ser a verdadeira (se tiver 500 casos, o arduino irá olhar um por um até achar a sentença verdadeira). Na if não vai ter esse problema, porque quando detecta o valor, o arduino vai direto à sentença verdadeira e não vai ficar detectando cada sentença. para ver se é falsa ou não.


Vídeo:


Espero que isso ajude muito vocês,
Até mais....


0 comentários:

Postar um comentário

 
Blogger Templates