Pages: [1]   Go Down
Author Topic: Fotocélula acende led errado  (Read 1180 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá pessoal, coloquei uma fotocélula e tá tudo ok com ela, testei o analógico e tudo e no serial dá de 0 a 1023 normal... Daí fiz um código pro pino 0 do analógico ler a fotocélula, e se a luminosidade for maior que 60, desligar o led, se for menor, ligar o LED.
Até que funcionou, mas eu queria saber se, já que com o código que eu fiz, ou o led está ligado ou desligado, por que o meu led acende com várias intensidades dependendo da iluminação?

Vejam o código:


const int ledPin =  13;
int valor = 0;
int analogico = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(analogico, INPUT);  
}

void loop(){
  valor = analogRead(analogico);
  int val = map(valor, 0, 1023, 0, 100);
  if (val >= 60) {      
    digitalWrite(ledPin, LOW);  
  }
  else {
    digitalWrite(ledPin, HIGH);
  }
}

Espero que possam me ajudar. Valeu!  smiley
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pessoal, resolvi o problema e espero que sirva para alguma pessoa.
As vezes a luz variava entre os valores mínimos pra ela acender e os valores máximos, então eu coloquei um espaço de 10 entre eles e funcionou, ou acende ou apaga.

Tá aí o novo código:

const int ledPin =  13;
int valor = 0;
int analogico = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(analogico, INPUT);  
}

void loop(){
  valor = analogRead(analogico);
  int val = map(valor, 0, 1023, 0, 100);
   if (val<50) {
     digitalWrite(ledPin, HIGH);
   } else if (val>60)
  digitalWrite(ledPin, LOW);
  }
Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Você não precisa, e não deve, usar pinMode( xxx ,INPUT) para as portas analógicas.
Quando você fez pinMode(0, INPUT), vc definiou o pino 0 do arduino que é o RX da transmissão como input.
Mas ao mesmo tempo isso funcionou pq você fez uma leitura analógica, analogRead(0), da porta 0 analógica, que é a porta número 14 se fosse digital.
Fique atento!
« Last Edit: July 04, 2010, 08:33:02 am by radames » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Então como devo fazer?
Apenas ler a porta, não preciso definir?

Obrigado.
A propósito, o problema do primeiro código era realmente o que eu falei?
Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

então,
antes de fazer o map, verifique qual o valor que o LDR esta lendo no seu estado natural, o mínimo quando o LDR não esta interrompido e o máximo quando ele esta totalmente coberto, chamo isso de MIN e de MAX, veja o seu código abaixo

Code:


const int ledPin =  13;
int valor = 0;
int analogico = 0;

void setup() {
 pinMode(ledPin, OUTPUT);
}

void loop(){
 valor = analogRead(analogico);
 int val = map(valor, MIN, MAX, 0, 100); //MIN, valor do ldr quando nada o interrompe
//MAX valor do LDR quando esta interrompido

 val = constraint(val,0,100); // limita o valor entre 0 e 100,

 if (val < 50) {
     digitalWrite(ledPin, HIGH);
  } else {
     digitalWrite(ledPin, LOW);
 }

}

Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, só não entendi o que é esse constraint, já que você já mapeou de 0 a 100 com o map, pra que usar ele?

Obrigado
Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

O map continua fazendo a conversão mesmo se os valores MIN e MAX estourem , portanto, o constraint garante que o valor final TOMIN e TOMAX não estourem, no caso do sua fotocélula isso não é um problema mas se for um PWM o valor deve estar limitado entre 0 e 255, literalmente.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Rapaz, só fui testar hoje esse código, e o led continua acendendo com intensidade proporcional a iluminação.

O que pode ser?
Logged

Pages: [1]   Go Up
Jump to: