Boa tarde amigos estou com um problema na linguagem relacionado a delay, o arduino não esta conseguindo processar e esta ficando travado o sistema, preciso tirar isso mas sou iniciante e estou em duvida de qual comando poderia utilizar para corrigir este erro estou postando a linguagem se alguem tiver uma ideia manda ai


#include "DHT.h"

#define DHTPIN A0 // Pino de entrado de sinal de leitura

// Descomente que tipo você está usando!
#define DHTTYPE DHT11 // DHT 11
//define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);
boolean SO=12; //Variavel que indica sereno
float PO;//Ponto de orvalho
float a = 17.271;
float b = 237.7;
float temp;


int ledliga=0;
int sistema=1;
int fc1=3;
int fc2=4;
int fc3=5;
int fc4=6;
int bj=7;
int bv=8;
int m1a=9;
int m1f=10;
int m2e=11;
int m2r=12;
int var=0;
int var2=0;
int estado=0;
int m1a1=0;
int m2e1=0;

//variaveis anemometro
volatile int CanalA = 0;
unsigned long tempo;
unsigned long intervalomillis = 1000;
float intervaloseg = 1.0;
float velocidade = 0.0;
float v;

void setup ()
{
attachInterrupt(0,cont_interrupcaoA, RISING); //Quando o pino 2 passa de 0 para 1 o programa chama a funcao
tempo = millis();
pinMode(ledliga,OUTPUT);
pinMode(sistema,INPUT);
pinMode(fc1,INPUT);
pinMode(fc2,INPUT);
pinMode(fc3,INPUT);
pinMode(fc4,INPUT);
pinMode(bj,INPUT_PULLUP);
pinMode(bv,INPUT_PULLUP);
pinMode(m1a,OUTPUT);
pinMode(m1f,OUTPUT);
pinMode(m2e,OUTPUT);
pinMode(m2r,OUTPUT);
Serial.begin(9600);
dht.begin();
pinMode(SO,OUTPUT);
}

void loop()
{
//comando para ligar o sistema no automatico
var=digitalRead(sistema);
if((var==HIGH)&&(var2==LOW))
{
estado=1-estado;
delay(1000); // de-bouncing
}
var2=var;
if(estado == 1)
{
digitalWrite(ledliga,HIGH); // liga o led
}
else
{
digitalWrite(ledliga,LOW); // desliga o led
}
//LOGICA DAS FINS DE CURSO E SISTEMA

//LOGICA FIM DE CURSO ABRE JANELA
if(digitalRead(ledliga)==1&digitalRead(fc2)==0&digitalRead(fc3)==0&digitalRead(fc4)==1&digitalRead(SO)==0)
{
digitalWrite(m1a,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
if (digitalRead(ledliga)==0||digitalRead(fc2)==1||digitalRead(fc3)==1||digitalRead(fc4)==0||digitalRead(SO)==1)
{
digitalWrite(m1a,LOW);
}

//LOGICA FIM DE CURSO ESTENDE VARAL

if(digitalRead(ledliga)==1&digitalRead(fc2)==1&digitalRead(fc3)==0&digitalRead(fc1)==0&digitalRead(SO)==0)
{
digitalWrite(m2e,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
if (digitalRead(ledliga)==0||digitalRead(fc2)==0||digitalRead(fc3)==1||digitalRead(fc1)==1||digitalRead(SO)==1)
{
digitalWrite(m2e,LOW);
}

//LOGICA FIM DE CURSO RECOLHE VARAL

if(digitalRead(ledliga)==1&digitalRead(fc2)==1&digitalRead(fc4)==0&digitalRead(SO)==1)
{
digitalWrite(m2r,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
if (digitalRead(ledliga)==0||digitalRead(fc2)==0||digitalRead(fc4)==1||digitalRead(SO)==0)
{
digitalWrite(m2r,LOW);
}

//LOGICA FIM DE CURSO FECHA JANELA

if(digitalRead(ledliga)==1&digitalRead(fc1)==0&digitalRead(fc4)==1&digitalRead(SO)==1)
{
digitalWrite(m1f,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
if (digitalRead(ledliga)==0||digitalRead(fc1)==1||digitalRead(fc4)==0||digitalRead(SO)==0)
{
digitalWrite(m1f,LOW);
}

//LOGICA DO ABRE/FECHA JANELA MANUAL

if (digitalRead(bj)==LOW&&m1a1==0&&digitalRead(fc2)==0&&digitalRead(fc4)==1)
{
digitalWrite(m1a,HIGH);
digitalWrite(m1f,LOW);
m1a1=1;
delay(500);
}
if (digitalRead(bj)==LOW&&m1a1==1&&digitalRead(fc1)==0&&digitalRead(fc3)==0)
{
digitalWrite(m1f,HIGH);
digitalWrite(m1a,LOW);
m1a1=0;
delay(500);
}
//LOGICA ESTENDE/RECOLHE VARAL MANUAL
if (digitalRead(bv)==LOW&&m2e1==0&&digitalRead(fc2)==1&&digitalRead(fc3)==0)
{
digitalWrite(m2e,HIGH);
digitalWrite(m2r,LOW);
m2e1=1;
delay(500);
}
if (digitalRead(bv)==LOW&&m1a1==1&&digitalRead(fc2)==1&&digitalRead(fc4)==0)
{
digitalWrite(m2r,HIGH);
digitalWrite(m2e,LOW);
m2e1=0;
delay(500);
}


//Codigos de programação dos sensores
{
float h = dht.readHumidity();
float t = dht.readTemperature();
temp = (a * t) / (b + t) + log(h / 100);
float PO = (b * temp) / (a - temp);


if (isnan(t) || isnan(h))
{
Serial.println("Falha na leitura do DHT");
}
else
Serial.print("Umidade: ");
Serial.print(h);
Serial.println("%");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println("C");
Serial.print("Ponto de Orvalho:");
Serial.print(PO);
Serial.println("C");
delay(3000);

if

(float(t)<=float(PO))

digitalWrite(SO,HIGH);

if
(float(t)>=float(PO))
digitalWrite(SO,LOW);

}
// anemometro
if ((millis()-tempo) >= intervalomillis) {
cli();
//calculo da velocidade
velocidade = (CanalA/50.0)/intervaloseg; // voltas/seg
CanalA = 0;
// dados de calibração: Cada 4,08 voltas/s é igual a 3,7 m/s
v = (velocidade * 0.91); // velocidade em m/s
sei();
tempo = millis();
}

Serial.println(v);
delay(300);
}


void cont_interrupcaoA() //Aqui eu posso contar quantas interrupcoes eu tenho
{
CanalA++;
}

Exibições: 726

Responder esta

Respostas a este tópico

Acho que o problema está na logica.

Acontece que existe uma precedencia entre as instruçoes. Alguns compiladores podem ser diferentes de outros, mas é feito primeiro o que houver de logica e depois as comparações, assim como fazemos primeiro as multiplicações e depois as somas.

Recomendo vc colocar parentesis separando cada bloco e rever onde tem que por "&" ou "&&".

Ex:

digitalRead(ledliga)==1&digitalRead(fc2)==1&digitalRead(fc4)==0&digitalRead(SO)==1 é intendido assim:

digitalRead(ledliga)==(1&digitalRead(fc2))==(1&digitalRead(fc4))==(0&digitalRead(SO))==1 

Pq o "&" é uma operação logica binaria.

O correto seria:

(digitalRead(ledliga)==1) && (digitalRead(fc2)==1) && (digitalRead(fc4)==0) && (digitalRead(SO)==1)

Os espaços não tem função logica mas ajudam muito na leitura.

blz fiz o teste que falou realmente a a logica funcionou direitinho ficou organizado a ligação dos motores porem ainda ficou com o maldito delay, comentaram comigo sobre o uso do millis mas tive usando e não adiantou muito talvez possa ter usado de forma errada a linguagem ficou nesta forma agora.

#include "DHT.h"

#define DHTPIN A0 // Pino de entrado de sinal de leitura

// Descomente que tipo você está usando!
#define DHTTYPE DHT11 // DHT 11
//define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);
boolean SO=12; //Variavel que indica sereno
float PO;//Ponto de orvalho
float a = 17.271;
float b = 237.7;
float temp;


int ledliga=0;
int sistema=1;
int fc1=3;
int fc2=4;
int fc3=5;
int fc4=6;
int bj=7;
int bv=8;
int m1a=9;
int m1f=10;
int m2e=11;
int m2r=12;
int var=0;
int var2=0;
int estado=0;
int m1a1=0;
int m2e1=0;

//variaveis anemometro
volatile int CanalA = 0;
unsigned long tempo;
unsigned long intervalomillis = 1000;
float intervaloseg = 1.0;
float velocidade = 0.0;
float v;

void setup ()
{
attachInterrupt(0,cont_interrupcaoA, RISING); //Quando o pino 2 passa de 0 para 1 o programa chama a funcao
tempo = millis();
pinMode(ledliga,OUTPUT);
pinMode(sistema,INPUT);
pinMode(fc1,INPUT);
pinMode(fc2,INPUT);
pinMode(fc3,INPUT);
pinMode(fc4,INPUT);
pinMode(bj,INPUT_PULLUP);
pinMode(bv,INPUT_PULLUP);
pinMode(m1a,OUTPUT);
pinMode(m1f,OUTPUT);
pinMode(m2e,OUTPUT);
pinMode(m2r,OUTPUT);
Serial.begin(9600);
dht.begin();
pinMode(SO,OUTPUT);
}

void loop()
{
{
//comando para ligar o sistema no automatico
var=digitalRead(sistema);
if((var==HIGH)&&(var2==LOW))
{
estado=1-estado;
delay(1000); // de-bouncing
}
var2=var;
if(estado == 1)
{
digitalWrite(ledliga,HIGH); // liga o led
}
else
{
digitalWrite(ledliga,LOW); // desliga o led
}
}
//LOGICA DAS FINS DE CURSO E SISTEMA

//LOGICA FIM DE CURSO ABRE JANELA
{
if(digitalRead(ledliga)==1&&digitalRead(fc2)==0&&digitalRead(fc3)==0&&digitalRead(fc4)==1&&digitalRead(SO)==0)
{
digitalWrite(m1a,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
if (digitalRead(ledliga)==0||digitalRead(fc2)==1||digitalRead(fc3)==1||digitalRead(fc4)==0||digitalRead(SO)==1)
{
digitalWrite(m1a,LOW);
}
}
//LOGICA FIM DE CURSO ESTENDE VARAL
{
if(digitalRead(ledliga)==1&&digitalRead(fc2)==1&&digitalRead(fc3)==0&&digitalRead(fc1)==0&&digitalRead(SO)==0)
{
digitalWrite(m2e,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
}
{
if (digitalRead(ledliga)==0||digitalRead(fc2)==0||digitalRead(fc3)==1||digitalRead(fc1)==1||digitalRead(SO)==1)
{
digitalWrite(m2e,LOW);
}
}
//LOGICA FIM DE CURSO RECOLHE VARAL
{
if(digitalRead(ledliga)==1&&digitalRead(fc2)==1&&digitalRead(fc4)==0&&digitalRead(SO)==1)
{
digitalWrite(m2r,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
}
{
if (digitalRead(ledliga)==0||digitalRead(fc2)==0||digitalRead(fc4)==1||digitalRead(SO)==0)
{
digitalWrite(m2r,LOW);
}
}
//LOGICA FIM DE CURSO FECHA JANELA
{
if(digitalRead(ledliga)==1&&digitalRead(fc1)==0&&digitalRead(fc4)==1&&digitalRead(SO)==1)
{
digitalWrite(m1f,HIGH); //SOMA SINAIS QUE CHEGAM DOS SENSORES METEREOLOGICOS
}
}
{
if (digitalRead(ledliga)==0||digitalRead(fc1)==1||digitalRead(fc4)==0||digitalRead(SO)==0)
{
digitalWrite(m1f,LOW);
}
}

//LOGICA DO ABRE/FECHA JANELA MANUAL
{
if (digitalRead(bj)==LOW&&m1a1==0&&digitalRead(fc2)==0&&digitalRead(fc4)==1)
{
digitalWrite(m1a,HIGH);
digitalWrite(m1f,LOW);
m1a1=1;
delay(500);
}
}
{
if (digitalRead(bj)==LOW&&m1a1==1&&digitalRead(fc1)==0&&digitalRead(fc3)==0)
{
digitalWrite(m1f,HIGH);
digitalWrite(m1a,LOW);
m1a1=0;
delay(500);
}
}

{ //LOGICA ESTENDE/RECOLHE VARAL MANUAL
if (digitalRead(bv)==LOW&&m2e1==0&&digitalRead(fc2)==1&&digitalRead(fc3)==0)
{
digitalWrite(m2e,HIGH);
digitalWrite(m2r,LOW);
m2e1=1;
delay(500);
}
}
{
if (digitalRead(bv)==LOW&&m1a1==1&&digitalRead(fc2)==1&&digitalRead(fc4)==0)
{
digitalWrite(m2r,HIGH);
digitalWrite(m2e,LOW);
m2e1=0;
delay(500);
}
}

//Codigos de programação dos sensores
{
float h = dht.readHumidity();
float t = dht.readTemperature();
temp = (a * t) / (b + t) + log(h / 100);
float PO = (b * temp) / (a - temp);


if (isnan(t) || isnan(h))
{
Serial.println("Falha na leitura do DHT");
}
else
Serial.print("Umidade: ");
Serial.print(h);
Serial.println("%");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println("C");
Serial.print("Ponto de Orvalho:");
Serial.print(PO);
Serial.println("C");
delay(3000);
{
if

(float(t)<=float(PO))

digitalWrite(SO,HIGH);
}
{
if
(float(t)>=float(PO))
digitalWrite(SO,LOW);
}
}
// anemometro
{
if ((millis()-tempo) >= intervalomillis)
{
cli();
//calculo da velocidade
velocidade = (CanalA/50.0)/intervaloseg; // voltas/seg
CanalA = 0;
// dados de calibração: Cada 4,08 voltas/s é igual a 3,7 m/s
v = (velocidade * 0.91); // velocidade em m/s
sei();
tempo = millis();
}

}

Serial.println(v);
delay(300);
}


void cont_interrupcaoA() //Aqui eu posso contar quantas interrupcoes eu tenho
{
CanalA++;
}

De fato vc usa bastante delay().

Agora, precisaria saber qual a necessidade deles, para entender como substituir.

Por ex, esse de 3000 na hora que escreve entendo que para o processamento para que o usuario possa ler.

Vc não precisa parar todo o processamento pra isso. Vc pode deixar rolar e escrever algumas vezes.

Pode ser com um contador do tipo:

contador++

if (contador==100) { contador=0; 

                                 escrevetudo(); }

Assim vc vai escrever a cada 100 ciclos.

Tb não sei a função desses delays() internos as funções, o ideal seria tentar primeiro resolver esse maior e se ainda ficar paradão vc diminui eles pela metade ou coisa assim.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço