Estoy teniendo un problema con este codigo que lee temperatura y humedad de un sensor dht 11mostrando llas mediciones en un display 16x2 y a la vez debe encenderse y apagarse el pin 9. Al poner el temporizado la pantalla deja de funcionar... Parece que el delay se sobrepone a la pantalla y por eso no hay imagen... Que debo modificar?
Hola @THEJULAITOR
Utilice millis () en lugar de retrasos
RV mineirin
Moderador:
Por favor lee las normas del foro y edita tu código usando etiquetas.
#include <LiquidCrystal.h>
#include <DHT.h>
int SENSOR = 8;
const int volteoPIN = 9;
int VO = 0;
int RS = 2;
int E = 3;
int D4 = 4;
int D5 = 5;
int D6 = 6;
int D7 = 7;
int temp;
int humedad;
DHT dht (SENSOR, DHT11);
LiquidCrystal lcd (RS, E, D4, D5 ,D6, D7);
void setup(){
dht.begin();
lcd.begin(16, 2);
analogWrite(VO, 50); //contraste
pinMode(volteoPIN , OUTPUT);
}
void loop(){
digitalWrite(volteoPIN , HIGH);
delay(1800000);
digitalWrite(volteoPIN , LOW);
delay(7200);
humedad = dht.readHumidity();
temp = dht.readTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humedad: ");
lcd.print(humedad);
lcd.print("%");
delay(5000);
}
Gracias ruilviana voy a probar así... Y cualquier cosa comento que pasa...
¿Sos consciente de que ese delay de 1800000 mseg equivale a 30 minutos con el micro "parado" sin hacer nada, pero nada de nada?
Saludos
Correcto soy consciente por eso quería cambiar el código a fin de que eso no pase... Y la función millis me lo permite... Ahora estoy tratando de implementarlo...
En Documentacíon tienes muy buenos tutoriales de mills
Cuéntanos cuál es la intención de poner el delay de 30 minutos.
O sea, sé más específico que en tu primer post.
Así como está, el pin 9 se pone en HIGH durante 30 minutos, luego se pone en LOW durante 12.2 (7.2 + 5) segundos y se repite el ciclo, 30 min - 12.2 seg , indefinidamente.
¿Esa es realmente tu intención?
Saludos
Ya quedo solucionado el problema con la función millis... Gracias por la sugerencia!
Mira tu ejemplo BlinkWithoutDelay.ino en el IDE y tienes tu respuesta.
Pero los tutoriales te darán el conocimiento general, y luego puedes aplicarlo a tu caso.
Tu código es francamente desproporcionado.
/* Comenta esto y verás que pasa
digitalWrite(volteoPIN , HIGH);
delay(1800000);
digitalWrite(volteoPIN , LOW);
delay(7200);
*/
humedad = dht.readHumidity();
temp = dht.readTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humedad: ");
lcd.print(humedad);
lcd.print("%");
delay(5000); // este delay tmb es grande, elimínalo.
siguen los problemas... ahora el pin 9 no apaga nunca salvo que use un tiempo de unos segundos. la idea es encender un motor con un relay de los que tienen que estar a 0v para encender para que este 7.250 segundos prendido y media hora apagado. no se puede usar millis para tanto tiempo?
#include <LiquidCrystal.h>
#include <DHT.h>
boolean estadoLed = true;
int intervaloEncendido = 1800000;
int IntervaloApagado = 7250;
unsigned long tiempoAnteriorEncendido = 0;
unsigned long tiempoAnteriorApagado = 0;
int SENSOR = 8;
int VO = 0;
int RS = 2;
int E = 3;
int D4 = 4;
int D5 = 5;
int D6 = 6;
int D7 = 7;
int temp;
int humedad;
DHT dht (SENSOR, DHT11);
LiquidCrystal lcd (RS, E, D4, D5 ,D6, D7);
void setup(){
dht.begin();
lcd.begin(16, 2);
pinMode(13,OUTPUT);
digitalWrite(13,estadoLed);
}
void loop(){
if((millis()-tiempoAnteriorEncendido>=intervaloEncendido)&&estadoLed==true){
estadoLed=false;
digitalWrite(13,estadoLed);
tiempoAnteriorApagado=millis();
}
if((millis()-tiempoAnteriorApagado>=IntervaloApagado)&&estadoLed==false){
estadoLed=true;
digitalWrite(13,estadoLed);
tiempoAnteriorEncendido=millis();
}
humedad = dht.readHumidity();
temp = dht.readTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humedad: ");
lcd.print(humedad);
lcd.print("%");
delay(500);
}
A ver ahora con estas correcciones?
#include <LiquidCrystal.h>
#include <DHT.h>
boolean estadoLed = true;
int intervaloEncendido = 1800000;
int IntervaloApagado = 7250;
unsigned long tiempoAnteriorEncendido;
unsigned long tiempoAnteriorApagado;
unsigned long tiempoPresento;
int SENSOR = 8;
int VO = 0;
int RS = 2;
int E = 3;
int D4 = 4;
int D5 = 5;
int D6 = 6;
int D7 = 7;
int temp;
int humedad;
DHT dht (SENSOR, DHT11);
LiquidCrystal lcd (RS, E, D4, D5 ,D6, D7);
void setup(){
dht.begin();
lcd.begin(16, 2);
pinMode(13,OUTPUT);
digitalWrite(13,estadoLed);
}
void loop(){
if ((millis()-tiempoAnteriorEncendido >= intervaloEncendido) && estadoLed){
estadoLed = false;
digitalWrite(13, estadoLed);
tiempoAnteriorEncendido = millis();
}
if (millis()-tiempoAnteriorApagado >= IntervaloApagado && !estadoLed){
estadoLed = true;
digitalWrite(13, estadoLed);
tiempoAnteriorApagado = millis();
}
if (millis()-tiempoPresento > 500UL) {
humedad = dht.readHumidity();
temp = dht.readTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humedad: ");
lcd.print(humedad);
lcd.print("%");
//delay(500);
}
}
Lamentablemente el problema sigue igual. Nunca queda el pin en low digamos... No se si hay algo mas que se puede hacer?
Prueba la parte de los leds y luego agrega lo demás
#include <Arduino.h>
boolean estadoLed = false;
int intervaloEncendido = 1000;
int IntervaloApagado = 3000;
unsigned long tiempoAnteriorEncendido;
unsigned long tiempoAnteriorApagado;
unsigned long tiempoPresento;
enum {ENCENDIDO, APAGADO};
void setup(){
pinMode(13,OUTPUT);
digitalWrite(13,estadoLed);
}
void loop(){
switch(estadoLed) {
case APAGADO: if ((millis()-tiempoAnteriorEncendido >= intervaloEncendido)){
estadoLed = ENCENDIDO;
digitalWrite(13, estadoLed);
tiempoAnteriorApagado = millis();
}
break;
case ENCENDIDO: if (millis()-tiempoAnteriorApagado >= IntervaloApagado){
estadoLed = APAGADO;
digitalWrite(13, estadoLed);
tiempoAnteriorEncendido = millis();
}
break;
}
}
Probado y funcionando.
Ahora respeta los tiempos de ON y OFF.
sigue fallando. no se si es mi arduino que esta roto... ya con un minuto falla. proba el codigo asi si es posible para saber si tambien te falla.
#include <Arduino.h>
boolean estadoLed = false;
int intervaloEncendido = 60000;
int IntervaloApagado = 10000;
unsigned long tiempoAnteriorEncendido;
unsigned long tiempoAnteriorApagado;
unsigned long tiempoPresento;
enum {ENCENDIDO, APAGADO};
void setup(){
pinMode(13,OUTPUT);
digitalWrite(13,estadoLed);
}
void loop(){
switch(estadoLed) {
case APAGADO: if ((millis()-tiempoAnteriorEncendido >= intervaloEncendido)){
estadoLed = ENCENDIDO;
digitalWrite(13, estadoLed);
tiempoAnteriorApagado = millis();
}
break;
case ENCENDIDO: if (millis()-tiempoAnteriorApagado >= IntervaloApagado){
estadoLed = APAGADO;
digitalWrite(13, estadoLed);
tiempoAnteriorEncendido = millis();
}
break;
}
}
Arranca apagado 10 segundos, eso esta bien. El problema es que despues no vuelve a apagar a los 60 segundos.
Lo acabo de probar y funciona bien.
Ojo que solo enciende y apaga el LED de la placa (pin 13).
Mas arriba dices que tienes el relé en el pin 9, conecta el relé al pin 13 o cambia 13 por 9 en el código.
Saludos