Boa tarde a todos, to com um problemão, se alguem puder me ajudar ficarei agradecido, e o seguinte, tenho um programa que mostra a temperatura a luminosidade do ambiente controla saidas, funciona tudo ok, so que resolvi adicionar um alarme no meu codigo, funciona bem ate que o alarme e acionado, dai trava as rotinas de luminosidade voltando ao normal so quando reconheço o alarme, ficando no aguardo do reconhecimento e ai volta a funcionar, pergunta como poderei resolver isso, agradeço a ajudar.
Tags:
coloque o código para podemos lhe ajudar.
Eis o codigo.
#include <IRremote.h>
#include <IRremoteInt.h>
#include <SPI.h>
#include <Ethernet.h>
IRsend irsend; //-------ENVIO DO IR------
///----VARIAVEIS DO SENSOR DE LUMINOSIDADE-----
boolean incoming = 0;
int sensor = A8; // LE PINO DO SENSOR LDR
int valorSensor = 0;
const int ledVerde = 22; // DEFINE PORTA 22 COMO SAIDA LUMINOSIDADE ALTA
const int ledAmarelo = 24; // DEFINE PORTA 24 COMO SAIDA LUMINOSIDADE MEDIA
const int ledVermelho = 26; // DEFINE PORTA 26 COMO SAIDA LUMINOSIDADE ALTA
//------Alarme ============
int ledVermelhoAlarme = 38;//Pino para o LED vermelho(RED)
int ledVerdeAlarme = 40; //Pino para o LED verde(Green)
int piezoPin = 42; // Pino para o + do PIEZO
int PIRPin = 46; //Pino OUT do SENSOR
int botaoPin = 48; //Pino de leitura da entrada do Botão
int PIR = 0; //Variável que representa o valor fornecido pelo sensor PIR
int Bot = 0; //Variável que representa o valor fornecido pelo Botão
//--------VARIAVEIS DO SENSOR DE TEMPERATURA----------
#define LED_R 28 //DEFINE PORTA 28 COMO INDICAÇÃO DE TEMPERATURA ALTA
#define BUZZER 30 // DEFINE PORTA 30 COMO ALARME SONORO
#define LIMITE 32 // DEFINE PORTA 32 COMO INDICACÃO DE TEMPERATURA MAXIMA 32 GRAUS
//--DEFINE VARIAVEIS DE ACIONAMENTO DOS RELES ANALOGICOS E DIGITAIS--
int pin_rly2 = 2; // LAMPADA
int pin_rlya0 = A0; //ACIONA POTAO GARAGEM
byte mac[] = {0xDC, 0x0E, 0xA1, 0xC6, 0x8D, 0x29};
byte ip[] = { 192, 168, 0, 177 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 255, 0 }; //mascara
EthernetServer server(80); //porta usada para comunicação
void setup()
{
//-------------DEFINE SAIDA DO SINAI DO LDR-----------------------------
pinMode(ledVerde,OUTPUT); //LUMINOSIDADE ALTA
pinMode(ledAmarelo,OUTPUT); //LUMINOSIDADE MEDIA
pinMode(ledVermelho,OUTPUT); //LUMINOSIDADE BAIXA
pinMode(9,OUTPUT); //SAIDA IR tv
digitalWrite(9,LOW);
//------------------------------------------------
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
//----DEFINEAS PORTAS QUE SERAO USADAS E QUAIS AS FUNCOES INPUT/OUTPUT-----
pinMode(pin_rly2,OUTPUT); // define como saida porta 2 sala//
pinMode(pin_rlya0,OUTPUT); // define com saida A0 portao da frente//
//------Declara LEDs e Alarme como pinos de Saída. Sensor e Botão como Entrada
pinMode(piezoPin, OUTPUT);
pinMode(ledVermelhoAlarme, OUTPUT);
pinMode(ledVerdeAlarme, OUTPUT);
pinMode(PIRPin, INPUT);
pinMode(botaoPin, INPUT);
}
//Função de nome: "somAlerta" que gera sinal sonoro
void somAlerta()
{
digitalWrite(piezoPin, HIGH);
delayMicroseconds(600);
digitalWrite(piezoPin, LOW);
delayMicroseconds(600);
}
// Função de nome: "piscaLED" que gera sinal visual
void piscaLED()
{
digitalWrite(ledVerdeAlarme, LOW); // Pino do ledVerde será o Terra
digitalWrite(ledVermelhoAlarme, HIGH); // Led Vermelho ON
delay(100);
digitalWrite(ledVermelhoAlarme,LOW); // Led Vermelho OFF
delay(100);
}
void loop(){
//--------------------------------------------------------------------
PIR = digitalRead(PIRPin); // Faz leitura do OUT sensor e joga o valor lido na variável: "sensor"
if (PIR == HIGH) // Testa se a variável "PIR" é alta(5v), caso SIM: executa uma tarefa Caso NÃO pular para else{
{
do//Faça essa tarefa e testar em while
{
digitalWrite(ledVermelhoAlarme, HIGH); // Liga led Vermelho
digitalWrite(ledVerdeAlarme, LOW); // Pino do led Verde torna-se o GND(terra) do led Vermelho
somAlerta(); //chama função que emite um som de alerta
Bot = digitalRead(botaoPin); //Faz leiturado do Botão e joga o valor na variálvel "Bot"
}
while(Bot==0); //Enquanto a variável Bot for zero(Botão não pressionado) continuar executando
}
else// SENSOR não está HIGH então executa as tarefas que estão no else{
{
if(Bot==1){ // caso o botão for pressionado após o alarme disparar fazer uma tarefa
for(int i=0; i<5 ;i++){ // Temporiza(alguns segundo) a função que será chamada "piscaLED()"
piscaLED(); //chama função que pisca o LED vermelho
}
digitalWrite(ledVermelhoAlarme, LOW);
digitalWrite(ledVerdeAlarme, HIGH); // Liga Led verde para
delay(10000); // Aguarda 10s (impede um novo alarme de imediato)
Bot=0; //Após o temporizador chamar e executar a função pescaLED declara que a variável "BOT" é zero
}
digitalWrite(ledVermelhoAlarme, LOW); // Mantem o pino Vermelho como GND(terra) para o led VERDE
digitalWrite(ledVerdeAlarme, HIGH); // Led Verde ON
//-----LEITURA DO LM35 (SENSOR DE TEMPERATURA)-------
int pinoSensor = A15; //LE PINO DO SENSOR LM35
int valorLido = 0;
float temperatura = 0;
//-----CALCULO (SENSOR DE TEMPERATURA)-------
valorLido = analogRead(pinoSensor);
temperatura = (valorLido * 0.00488); // AQUI SAO FEITO OS CALCULOS PARA O SENSOR DE TEMPERATURA-----
temperatura = temperatura * 100;
Serial.println(temperatura);
//----------------------------------
EthernetClient client = server.available();
if (client)
{
boolean currentLineIsBlank = true;
String str;
while (client.connected())
{
if (client.available())
{
char c = client.read();
str.concat(c);
if(str.endsWith("/2on"))
{
digitalWrite(pin_rly2,HIGH);}
if(str.endsWith("/2off"))
{
digitalWrite(pin_rly2,LOW);
}
if(str.endsWith("/temperatura"))
{
client.print("A temperatura ambiente e de: ");
client.print(temperatura); // IMPRIME NA WEB A TEMPERATURA DO SENSOR LM35
}
//------CONTROLE DA TELEVISAO--------------//
if(str.endsWith("/tvon"))
{
irsend.sendRC5(0x0C, 12); // TV liga
}
if(str.endsWith("/tvoff"))
{
irsend.sendRC5(0x80C, 12); // TV Desliga
}
if(str.endsWith("/vup"))
//----ACIONAMENTO DOS PORTOES---
if(str.endsWith("/a0on"))
{
digitalWrite(pin_rlya0,HIGH); // ACIONA PORTAO DA GARAGEM
delay(200);
digitalWrite(pin_rlya0,LOW);
}
if (c == '\n' && currentLineIsBlank)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.print("<body style=background-color:aquamarine>");
client.println("<font color='black;' size='4'>");
client.println();
client.print ("A temperatura ambiente e de: ");
client.println (temperatura);
client.print ("O Valor de Luminosidade e: ");
client.println (sensor);
break;
}
if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}
delay(10);
client.stop();
}
//--------------LEITUTA SENSOR LDR--------------------------------
int valorSensor = analogRead(sensor);
digitalWrite(ledVerde,LOW);
digitalWrite(ledAmarelo,LOW);
digitalWrite(ledVermelho,LOW);
if (valorSensor < 300){
digitalWrite(ledVermelho,HIGH);
}
if (valorSensor >= 300 && valorSensor <= 400){
digitalWrite(ledAmarelo,HIGH);
}
if (valorSensor > 430) {
digitalWrite(ledVerde,HIGH);
}
delay(1000);
}
}
Acredito que seja isso:
em:
Bot = digitalRead(botaoPin); //Faz leiturado do Botão e joga o valor na variálvel "Bot"
}
while(Bot==0); //Enquanto a variável Bot for zero(Botão não pressionado) continuar executando
}
Vc le bot apenas uma vez.
precisa reler para testar:
}
while(Bot==0) Bot = digitalRead(botaoPin); //Enquanto a variável Bot for zero(Botão não pressionado) continuar executando
}
Minha sugestão seria resumir os comentários ao realmente importante e identar. A posição dos colchetes ajuda muito na compreensão.
Muito obrigado pela atenção, vou testar e te dou um retorno, valeu.
Boa tarde, fiz o teste e nao funcionou, quando aciono o alarme a cirene toca e nao consegui resetar a mesma, e o resto fica travado aguardando o reconhecimento....
Caro Luiz Carlos. Ainda não é sua solução esperada mas algumas coisas me chamam atenção
no seu código talvez para um AtMega2560, acredito, pela quantidade de portas ou um Max32?
Vejamos?
1. Colocação de um relê numa entrada analógica é muito estranho pois com tantas portas disponíveis para que arriscar?
int pin_rlya0 = A0; //ACIONA POTAO GARAGEM
2. As saídas não podem drenar muita corrente do microcontrolador pois existe limite para tal.
Em geral 100mA. Para resolver isto coloque leds em configuração de anodo comum, se possível, isto é acione-os com LOW e não HIGH.
3. As botoeiras, conforme a velha guarda, são acionadas em LOW e não no HIGH.
4. Você usa muitos delays e microDelays. Pela complexidade de seu código não seria a hora de se usar o controle de tempo por interrupção? Com certeza seu chip tem muitos timers (temporizadores). Controles em tempo real devem estar imunes às travadas advindas de delays, espera de mudança de status de botôes, etc.
5. Finalmente o teste do botão após o primeiro if está feito sem a leitura deste
else// SENSOR não está HIGH então executa as tarefas que estão no else{
{
if(Bot==1){ // caso o botão for pressionado após o alarme disparar fazer uma tarefa
for(int i=0; i<5 ;i++){ // Temporiza(alguns segundo) a função que será chamada "piscaLED()"
piscaLED(); //chama função que pisca o LED vermelho
}
Para resolver isto no seu código, acrescente a linha
Bot = digitalRead(botaoPin);
após o else
else //
{
Bot = digitalRead(botaoPin);
if(Bot==1)
etc
}
6. Se você me permite dar uma última sugestão:
MODULARIZE SEU PROGRAMA, USANDO MAIS FUNÇÕES NO loop()!
Assim o código fica mais claro.
Vou tentar posteriormente dar outras dicas, caso você esteja receptivo para tal.
Obrigado,
Professor Almir
Almir, obrigado pelas dicas, com certeza vou precisar delas, pois sou iniciante e quero muito aprender, irei testar e te dou um retorno, valeu mesmo.
Almir, fiz o que voce disse, continua o mesmo problema, acho que to fazendo algo errado, poderia me orientar melhor, obrigado.
Olá amigo...
Ví seu código... está perdendo bastante tempo com delays, sempre utilize os Serial.print quando desconfia de algum método, coloque na entrada e na saída, ai saberá por onde seu programa esta travando...
Substitua parte do seu código por este abaixo que conseguirá identificar por onde está passando e travando utilizando o Serial Monitor.
if (PIR == HIGH)
{
Serial.println("PIR está em Alta");
do
{
digitalWrite(ledVermelhoAlarme, HIGH);
digitalWrite(ledVerdeAlarme, LOW);
Serial.println("Disparando Som por 1.2 segundos");
somAlerta(); //chama função que emite um som de alerta
Bot = digitalRead(botaoPin);
Serial.print("Bot é igual a : ");
Serial.println(Bot);
}
while(Bot==0); //Enquanto a variável Bot for zero
} else{
if(Bot==1){ // caso o botão for pressionado após o alarme
Serial.println("Iniciei PiscaLED perdi 1 segundo");
for(int i=0; i<5 ;i++){
piscaLED(); //chama função que pisca o LED vermelho
}
Serial.println("Sai do Pisca LED");
digitalWrite(ledVermelhoAlarme, LOW);
digitalWrite(ledVerdeAlarme, HIGH); // Liga Led verde para
Serial.println("Vou precisar Aguardar 10 segundos");
delay(10000); // Aguarda 10s (impede um novo alarme de imediato)
Serial.println("Até que enfim saiu...");
Bot=0; //Após o temporizador chamar e executar
}
... continua o restante igual até fechar o else
No final do código você também tem um delay de 1 segundo, acredito que pode ser reduzido.
Espero ter ajudado.
Um abraço
Carlos Freitas
Obrigado pela atenção Carlos, na realidade nao a travas e sim verificação de botao, ou seja, quando a alarme e acionado, a rotina fica em loop, aguardando normalizar o sensor que antes estava fechado, preciso que o fluxo do programa nao pare, ou seja, quando o sensor for acionado, acenda o led vermelho e toque a buzina, e continue a executar as outras funcoes sem ficar preso nesta rotina.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por