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);
}
}
}
}
Tags:
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'
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por