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