Go Down

Topic: Fotocélula acende led errado (Read 1 time) previous topic - next topic

Geek Ionizado

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!  :)

Geek Ionizado

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);
 }

Radames

#2
Jul 04, 2010, 03:31 pm Last Edit: Jul 04, 2010, 03:33 pm by radames Reason: 1
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!

Geek Ionizado

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?

Radames

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: [Select]



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);
}

}


Geek Ionizado

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

Radames

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.

Geek Ionizado

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

O que pode ser?

Go Up