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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy