Olá, 

Estou com um pequeno problema para completar meu código, ele funciona assim:

Ao receber um caractere pela serial ele executa determinada função, mas estou com um problema na segunda função que seria de colocar luzes para fazer um acendimento automático com a falta de luz medida por um ldr, mas do modo que está no código apenas quando eu coloco para ele realizar a função ele a realiza, ou seja, mesmo escuro ele só acende se eu mandar ele ficar automático e não como deveria ser.

É só um probleminha na logica, mas probleminha que eu não consigo resolver

E se souberem poderiam me dar uma dica de como selecionar o tanto de casas após a virgula em uma variável flutuante (float).

Obrigado

 

#include<dht11.h>
dht11 sensor;
int ldr = 0;
int tcl;


void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
Serial.println("Digite o que vc deseja: ");
Serial.println("a - Ligar ou desligar a luz");
Serial.println("b - Luzes automaticas");
Serial.println("c - Exibir informacoes");
Serial.println("d - Ligar ou desligar o ventilador");
}

void loop() {
ldr = analogRead(A0);
ldr = map(ldr, 0, 1024, 0, 100);
if(Serial.available()>0){
tcl = Serial.read();
if (tcl == 'a'){
if (digitalRead(13) == 0){
digitalWrite(13, HIGH);
}
else if(digitalRead(13) == 1){
digitalWrite(13, LOW);
}
}

if (tcl == 'b'){
if (ldr <= 40){
digitalWrite(13, HIGH);
}
else if(ldr > 70) {
digitalWrite(13, LOW);
}
}
if(tcl == 'c'){
Serial.print("Luminosidade: ");
Serial.print(ldr);
Serial.println(" %");

int chk = sensor.read(3);

Serial.print("Umidade (%): ");
Serial.println((float)sensor.humidity, 3);
Serial.print("Temperatura (Celcius): ");
Serial.println((float)sensor.temperature, 3);
tcl = '-';
}
if(tcl == 'd'){
if (digitalRead(12) == 0){
digitalWrite(12, HIGH);
}
else if(digitalRead(13) == 1){
digitalWrite(12, LOW);
}
}
}
}

Exibições: 669

Anexos

Responder esta

Respostas a este tópico

Acende o led;

se valor é igual a 'a' E sensor >= 0 (apagado ? ou aceso ?);

Faça algo

if ((tcl=='a')&&(digitalRead(XXXX) <= 0)) //então tem alguma luz

{acenda led;};//acenda ou apaga

Se (condição)&&(condição){}   ou seja,Se ('a') E (valor) é relativo ao escuro,faça tal

Então, traduzindo para a linguagem de humanos é o seguinte, quando tcl for igual a 'a' e o valor do ldr for menor que o tanto definido para acender a luz a luz acende e quando essas condições não forem feitas ele apaga ficando assim:

if ((tcl == 'b') && (ldr <= 40)){

digitalWrite(13, HIGH);

else if ((tcl == 'b') && (ldr > 70)){

digitalWrite(13, LOW);

}

assim né?

Não funcionou, continuou com o mesmo problema só que escrito diferente

não use E use OU

tentei também, basicamente n funcionou

Verifique qual o valor da variável ldr...
faça um debug da seguinte forma:
Pode ser que ele não esteja com o valor que você espera

if (tcl == 'b'){

  Serial.println(ldr, DEC);     // debug do valor da variável LDR
  if (ldr <= 40){
    digitalWrite(13, HIGH);
  }
  else if(ldr > 70) {
    digitalWrite(13, LOW);
  }

}

os valores estão corretos, o problema é que esse código só funciona na vez que eu aperto b, então mesmo que esteja escuro e eu já tenha apertado o botão ele não funciona

Agora entendi seu problema...

Bom... como você sabe, esse " if (ldr <= 40)..." está dentro do "if(Serial.available()>0", ou seja, ele só irá executar quando receber 'b' pela serial.

Solução: retire o  "if (ldr <= 40)..." de dentro do  "if(Serial.available()>0". Então, dentro do  "if(Serial.available()>0", armazene em uma variável o valor lido.

Dentro do loop() vai ficar o "if (ldr <= 40)...", mas não com ldr e sim com a variável que armazenou o valor lido...

Conseguiu entender, ou será que me enrolei pra explicar? rs

Acho que o que você falou é para por assim: 

if (ldr <= 40){
digitalWrite(13, HIGH);
}
else if(ldr > 70) {
digitalWrite(13, LOW);
}

if(Serial.available()>0){
tcl = Serial.read(); 

e dai por diante, é isso?

Isso... assim a ligação das lampadas seria automática e independentes de qualquer comando da serial!

Fiz e surgiu outro problema, quando eu coloco para as luzes acenderem com a elas acendem e apagam porque está claro

faz sentido...

Do jeito que está o controle será sempre automático.

Tente o seguinte:

if(tlc=='b'){

  if (ldr <= 40){
     digitalWrite(13, HIGH);
  }
  else if(ldr > 70) {
    digitalWrite(13, LOW);
  }

}

assim ele só ira entrar no modo automático quando a ultima tecla apertada for 'b'

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço