Pages: [1]   Go Down
Author Topic: Verdadero delay con millis y while?  (Read 163 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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? smiley-lol
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.

Code:
#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);
}


Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 343
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo que quieres es reemplazar while x if?
Logged

Maracaibo
Offline Offline
Full Member
***
Karma: 7
Posts: 164
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos
Explicanos que quieres que tu programa haga?
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola y gracias por vuestro interés
Si quiero reemplazar while por if porque supongo que el problema que expongo de que no hace otra cosa a la vez se deriva de aquí. O eso o saber si con while se puede hacer y entender entonces en que me equivoco.
Mi programa me gusta pensar que hará maravillas: Guardara a las horas que le indique un registro en la SD, como cadena de texto, con la fecha, hora, temperatura,humedad y numero de linea que servirá para tener indexadas cada entrada. Al sacar la SD para pasar datos a otro dispositivo (pc o no) si coincide con la hora de guardar un registro lo tendrá que hacer en la eeprom y luego deberá saber por donde iba en la SD y grabarlo entonces a continuación. Aunque yo soy un urbanita de toda la vida al casarme acabe viviendo en una zona rural. La familia de mi mujer tiene tierra y ganado y es en este ámbito donde tengo intención de darle uso al invento. Lo que explico es el núcleo de todo, a partir de aquí sera portable o no, dependiendo de las lecturas actuara sobre salidas o no, tendrá pantalla para motorizar datos o no... depende del uso.
Todo esta por hacer, de momento controlo los elementos que intervendrán pero falta desarrollar el código para ligarlo todo. Pero hay que ir paso a paso y en el primero ya estoy con los morros en el suelo,  fallan los fundamentos. Esa es la ayuda que pedía de momento, multitarea con millis. Tal como avance y me atasque recurriré a vuestra buena voluntad, me gustaría desarrollarlo yo con vuestro apoyo y no limitarme a copiar y pegar.
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 343
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Disculpa pero sigo sin entender.
Porque no haces un esquema del conexionado electrico que incluye los sensores y los 595 y todo lo demas alrededor del arduino.
Logged

Pages: [1]   Go Up
Jump to: