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.

Exibições: 1485

Responder esta

Respostas a este tópico

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço