Hola a todos.
Pues eso, que estoy intentando utilizar millis para evitar delay y no soy capaz. Lo utilizo con while y por lo que veo el efecto es el mismo que con delay.
Tengo montados y en funcionamiento un LCD 1602 via I2c, un DHT22, un RTC DS1302 y un pulsador que hará actuar un display led (7 segmentos, 4 dígitos) que están funcionando con el esquema y las funciones que aparecen en la web tronixstuff.com. Falta montar un modulo SD para guardar datos y programarlo todo. No todo trabajara junto, tengo pensadas algunas variantes, pero como se puede intuir siempre sera un sistema basado en control de temperatura y humedad con histórico de datos con el que se podrá interactuar sobre el terreno o llevarlos a otro dispositivo para hacerlo allí. Es un proyecto bastante ambicioso para mi nivel, pero tampoco lo veo precisamente una cosa impensable ni inalcanzable. El tiempo dirá.
Me planteaba como primer paso una cosa sencilla, un montaje portable basado en un mini pro alimentado a pilas y que por tanto debería reducirse a su mínima expresión para economizar consumo eléctrico. La DHT22, el DS1302, la SD y el display led que seria la única fuente de información visible y que a petición del usuario y respondiendo al pulsador mostraría los parámetros actuales. Haciendo solo esto y los registros de datos en la SD lo podría solucionar con delay, pero como la intención es irlo complicando con mas procesos lo quiero hacer con millis. Para probar si lo hacia bien y aprovechando que lo tengo todo montado en la board he programado el código del pulsador para que me muestre la información y simultáneamente que el LCD me muestre los segundos del RTC. Solo he conseguido hacerlo funcionar con while y el problema es que realmente mientras (while) no se cumplen las condiciones solo está por la labor del display y el LCD no actualiza información, por lo que acaba siendo un delay. La información que busco me lleva a otros códigos de ejemplo pero también mayormente a Blink WithOut Delay, incluso yo mismo tengo un hilo en el foro donde se me ayudo con el código y en el se utiliza la función millis. En todos los casos veo que se utiliza if pero no soy capaz de extrapolar lo que quiero hacer y encajarle con if.
Alguien me puede iluminar un pelín? XD
Por cierto que lo del display es muy facil con las funciones de aquella página, son 100% recomendables.
Gracias y perdón por el rollo que os he metido. Ahí va el código tal como me funciona.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DS1302.h>
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
DS1302 rtc(2, 3, 4);
Time t;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
float h;
float temper;
int boton = 6;
byte val = 0;
byte val2 = 0;
int latchpin = 8; // connect to pin 12 on the '595
int clockpin = 7; // connect to pin 11 on the '595
int datapin = 10; // connect to pin 14 on the '595
//Copiado todo (tronixstuff)
int segdisp[10] = {
238,72,214,220,120,188,190,200,254,252}; // base 10 equivalents for digits 0~9
int posdisp[4] = {
1,2,4,8}; // base 10 equivalents to close cathodes on display 0~3 on module
void setup() {
lcd.begin(16,2);
dht.begin();
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(datapin, OUTPUT);
pinMode(boton, INPUT);
}
void loop()
{
t = rtc.getTime();
h = dht.readHumidity();
temper = dht.readTemperature();
lcd.setCursor(2,0);
lcd.print(t.sec);
val = digitalRead(boton);
if (val != val2) {
if (val == LOW)
{
char temperatura[5];
int graus = temper*100; //Sin decimales para guardarlo en un int
sprintf( temperatura, "%.4d", graus);
// La representamos por 3 segundos
unsigned long inicio = millis();
unsigned long T_Ciclo=3000;
while (millis()<(inicio+T_Ciclo))
{
//La informacion de pasar de char a int(casting?) en c/c++ sale de aqui:
//http://www.programacionenc.net/index.php?option=com_content&view=article&id=91:como-convertir-un-char-en-int&catid=31:general&Itemid=41
char aux1 = temperatura[0];
int numAux = aux1 - '0';
digitdisplay(numAux,0);
aux1 = temperatura[1];
numAux = aux1 - '0';
digitpointdisplay(numAux,1);
aux1 = temperatura[2];
numAux = aux1 - '0';
digitdisplay(numAux,2);
aux1 = temperatura[3];
numAux = aux1 - '0';
digitdisplay(numAux,3);
}
//Puntos decimales para separar un parametro del otro(1 seg)
T_Ciclo=1000;
inicio = millis();
while (millis()<(inicio+T_Ciclo))
{
decpointdisplay(0);
decpointdisplay(1);
decpointdisplay(2);
decpointdisplay(3);
}
// Humedad a cadena de caracteres
char humedad[5];
int humd = h*100;
sprintf( humedad, "%.4d", humd);
// La representamos durante 3 seg
T_Ciclo=3000;
inicio = millis();
while (millis()<(inicio+T_Ciclo))
{
char aux1 = humedad[0];
int numAux = aux1 - '0';
digitdisplay(numAux,0);
aux1 = humedad[1];
numAux = aux1 - '0';
digitpointdisplay(numAux,1);
aux1 = humedad[2];
numAux = aux1 - '0';
digitdisplay(numAux,2);
aux1 = humedad[3];
numAux = aux1 - '0';
digitdisplay(numAux,3);
}
}
cleardisplay();
val2=val;
}
}
void cleardisplay()
// turns off all segments of all digits
{
for (int aa=0; aa<4; aa++)
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, posdisp[aa]); // sets the digit to address
shiftOut(datapin, clockpin, MSBFIRST, 0); // clears the digit
digitalWrite(latchpin, HIGH);
}
}
void digitdisplay(int digit, int location)
// displays "digit" on display "location" 0~3
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, posdisp[location]); // sets the digit to address
shiftOut(datapin, clockpin, MSBFIRST, segdisp[digit]); // clears the digit
digitalWrite(latchpin, HIGH);
}
void digitpointdisplay(int digit, int location)
// displays "digit" on display "location" 0~3 with the decimal point
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, posdisp[location]); // sets the digit to address
shiftOut(datapin, clockpin, MSBFIRST, segdisp[digit]+1); // clears the digit
digitalWrite(latchpin, HIGH);
}
void decpointdisplay(int location)
// displays "digit" on display "location" 0~3 with the decimal point
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, posdisp[location]); // sets the digit to address
shiftOut(datapin, clockpin, MSBFIRST, 1); // clears the digit
digitalWrite(latchpin, HIGH);
}