Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?
16/04/2016 #21


Nuyel, el código se carga compiló bien (solamente unas comas faltantes y la librería del reloj se quedó perdida), pero fácil de encontrar y corregir. Sin embargo, al cargarlo no me ha generado ningún registro de datos, y creo que se debe que a que deberán pasar 4 horas, antes de que se registre el primer dato, y esto debido a que el timeAlarms está definido para que registre un dato cada 120 segundos, lo que creo que sucederá es que deberán pasar 120/60=2 horas para que se de el primer registro de datos, si estoy en lo correcto, el código está tomando lecturas cada 2 minutos (y no cada segundo como se necesita) y no las presentará hasta que tenga un total de 120 lecturas, es decir 2 horas. La pregunta que me hago, es si después de estas dos horas, los registros serán cada 2 minutos o cada 2 horas. Eso lo creo porque algo me pasó hace un tiempo con algo similar. Que crees tu?
Voy a dejar el código corriendo a ver si tengo una lectura dentro de 2 horas.

Este es el código tal cual lo pasaste solamente con las correcciones de los errores de comas y la librería, en lo personal creo que si es así como funciona, pero voy a intentar buscar como hacer que no tarde tanto para los registros, lo malo es que no tengo otra placa, y quiero saber si hay un registro a las 2 horas, o es otra cosa lo que anda mal...

Código:
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>   


#include "DHT.h"       
#define DHTTYPE DHT21  
#define DHTPIN 4       
DHT dht(DHTPIN, DHTTYPE);

#define muestras 120
#define tMaxVal (100.0)
#define tMinVal (0.0)
#define hMaxVal (100.0)
#define hMinVal (0.0)

float t, h, tmax = tMinVal, tmin = tMaxVal, hmax = hMinVal, hmin = hMaxVal;
float sigmaT = 0.0, sigmaH = 0.0, tavg = 0.0, havg = 0.0;
int numReadings = muestras;

void setup() {
   Serial.begin(9600);
  
  setSyncProvider (RTC.get); 
  //setTime(2,22,0,15,04,16); 

 if (timeStatus()!=timeSet){
  Serial.println ("No está el reloj");
  }else{
  Serial.println ("El reloj se sincronizo");
  }
 dht.begin();

 int horas = hour();
 int minutos = (minute()/2)*2+2; // Intervalos de registros cada 2 minutos.

  if (minutos == 60) {
     minutos = 0;
     horas   = hour()+1;
  }  

 Alarm.alarmOnce(horas, minutos, 0, AlarmStart);

 

  
}
void resetValues() {
  tmax = tMinVal;
  tmin = tMaxVal;
  hmax = hMinVal;
  hmin = hMaxVal;
  numReadings = muestras;    //reinicar cuenta de muestras
  sigmaT = 0.0;               //reiniciar suma de T
  sigmaH = 0.0;               //reiniciar suma de H
}

void loop() {
   Alarm.delay(1); // wait one second between clock display
}
void Registros(){   
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (t > tmax) tmax = t; //dado a que tMax inicia en cero, cualquier valor que sea superior al anterior lo sustituirá
  if (t < tmin) tmin = t; //dado a que tMin inicia en el valor más alto, cualquier valor inferior sustituye al ultimo registrado
  if (h > hmax) hmax = h;
  if (h < hmin) hmin = h;
  sigmaT += t;            //sumatoria de T
  sigmaH += h;            //sumatoria de H
  --numReadings;

if (numReadings == 0){ //esto solo deberia ejecutarse cuando se tenga todas las muestras
tavg = sigmaT/muestras;   //promedio de temperatura
havg = sigmaH/muestras;   //promedio de humedad

String dataString= "";
  
  dataString+= String (day());
  dataString+= ("/");
  dataString+= String (month());
  dataString+= ("/");
  dataString+= String (year());
  dataString+= ("  ");
  dataString+= String (hour());
  dataString+= String (":");
  dataString+= String (minute());
  dataString+= String (":");
  dataString+= String (second());
  dataString+= ("  ");
  dataString+= String (t);
  dataString+= ("  ");
  dataString+= String (tmax);
  dataString+= ("  ");
  dataString+= String (tmin);
  dataString+= ("  ");
  dataString+= String (h);
  dataString+= ("  ");
  dataString+= String (hmax);
  dataString+= ("  ");
  dataString+= String (hmin);
  dataString+= ("  ");
  dataString+= String (tavg);
  dataString+= ("  ");
  dataString+= String (havg);
  dataString+= ("  ");
  dataString+= String (muestras);
  Serial.println(dataString);

  resetValues(); //reiniciar los registros para el siguiente periodo.
}
}


void AlarmStart() {
  
  Alarm.timerRepeat(120, Registros);        // Para un dato cada 2 minutos.
}
17/04/2016 #22

Avatar de Nuyel

pues. . . en realidad pasaría cada 4 horas por que la interrupción es cada 2 minutos y el código va a enviar el registro al pasar las 120 muestras, lo que serian después de 4 horas, cambia la interrupción a cada segundo y eso debería hacer la transmisión cada 2 minutos.
17/04/2016 #23


Excelente! problema resuelto!!!!
Mil gracias!!! Nuyel...
19/04/2016 #24


Hola, tengo otro problema con este mismo código,

Y Nuyel desde el post número 6, ya venía hablando sobre él, y lo volvió a mencionar en el post 12

Post 6
pero hay otro detalle, si usas delay se suspende X milisegundos, no te dará un tiempo preciso y a eso debes agregar la perdida de tiempo en transmitir los datos. al menos podrías usar millis() para generar una espera con un tiempo más constante.

Post 12
El problema aquí es que millis() sigue contando siempre y al transmitir los datos si estos no son enviados en menos de 1s se perdería la poca sincronía de este método, lo ideal es juntar los datos por eventos de interrupción del timer, esto se hace programando el chip directamente, no con lenguaje Arduino ya que no esta integrado, así que hay que saber que modelo estas usando debido a que hay que mover los registros directamente debajo de todo el maquillaje que tiene Arduino para hacerlo ver como si fuera tan fácil programar un microcontrolador.

Si usas ticks = millis() antes de entrar al while al menos te asegurarias de que el valor no se ha superado aun y volverías a reiniciar el cronometro para tomar las medidas, de lo contrario, las primeras medidas puede no ser con 1s de diferencia entre sí.

El problema tal como lo dice Nuyel es que la cantidad de datos a enviar está consumiendo tiempo, y eso hace que cada registro vaya desplazándose un poco, por ejemplo los datos comienza en el minuto 2 con cero segundos, se hacen aproximadamente 3 registros de esa manera, y posteriormente en el minuto 8 ya no se hace en el segundo cero sino en el segundo 1, así sucesivamente hasta que ya deja incluso de registrarse datos cada 2 minutos.

La pregunta aquí es:
Que parte del código es la que genera este problema, y creo que es la declaración:

#define muestras 120



Porque antes de registrar un dato, el sensor debe esperar tener 120 muestras (y no le "importa" que hora sea), por eso si se tarda aunque sea lo mínimo registrando los datos, llegará el momento que los registros se desplacen en el tiempo y ya los registros no se "verán" siempre registrados en el minuto correspondiente y en el SEGUNDO CERO. Anteriormente (antes de la mejora de Nuyel), lo que gobernaba el momento del registro era el tiempo (el reloj RTC para ser específico), por eso los registros eran siempre en el SEGUNDO CERO del minuto definido según el intervalo definido. Debo decir sin embargo, que despues de la mejora de Nuyel el código funciona muchísimo mejor que antes (pero si fuese posible además resolver este problemita del tiempo sería grandioso).

Lo que se me ocurre (a lógica), pero no se si es posible transformar esa lógica en código (y es aquí donde apelo a vuestra ayuda) es lo siguiente:

#define muestras 120 // Esta parte del código fue lo que se empleó para resolver el problema original.


Pero si hubiese una forma de modificarla de la siguiente forma:

#define muestras // No importa cuantas muestras. LAS QUE SE TENGAN al momento de registrar el dato de tal forma que el registro siempre sea al SEGUNDO CERO, del minuto definido según intervalo.


No se si logré explicarme? espero me comprendan y me den una idea....
19/04/2016 #25

Avatar de Scooter

Si quieres algo exacto usa un timer, el polling siempre se va desfasando.

Enviado desde mi fnac 5.7 mediante Tapatalk
19/04/2016 #26


Puede alguien dar un poco más de información?
20/04/2016 #27

Avatar de Nuyel

Según entendí, Alarm.delay() es lo que genera una revisión para ejecutar la tarea de ver las alarmas. Yo creí que era una interrupción pero aparentemente es polling. Creo que el problema con lo de usar Serial.println(dataString), la cadena es muy larga, el tiempo perdido depende de la velocidad de transmisión, y si nuestra aplicación se suspende en ese momento, no me sorprendería que tardara más de un segundo en realizar la transferencia y eso causara el retraso.

Meterte con interrupciones es entrar a modificar los registros, debemos saber que chip estas usando para saber que temporizador están disponibles y los registros, lo demás se verá como en el primer post del tema, aquí ya toca leer la data sheet del microcontrolador que use tu Arduino (ATmega328, ATmega32u4, ATmega2560, . . .).

¿Hay limitante con la velocidad de transmisión? por que temporalmente el solo incrementar a Serial.begin(115200); (normalmente la más alta) podría acelerar los datos al punto en el que no cause el efecto de retraso.
20/04/2016 #28

Avatar de Scooter

No debería de importar. Se supone que usa un buffer fifo y lo que hace print es llenar el buffer

Enviado desde mi fnac 5.7 mediante Tapatalk
20/04/2016 #29

Avatar de Nuyel

No entendí Scooter, por que print detendría todo hasta que la línea se termine de transmitir, como se usa polling eso detendría también la captura de datos hasta que se verifique, si subimos la velocidad de transmisión podría darle tiempo de enviar los datos para que el programa pueda seguir.
20/04/2016 #30

Avatar de Scooter

No, de hecho no lo detiene. Lo he comprobado con un osciloscopio y no para.
Lo que pasa es que si se llena el buffer si que para, y el buffer sólo es de 64 bytes de salida y 64 de entrada.
Hice la prueba de poner un pin a ON, mandar una cadena y ponerlo off y no tarda ni muchísimo menos lo que tarda la cadena en ser transmitida.

Enviado desde mi fnac 5.7 mediante Tapatalk
20/04/2016 #31


Bueno yo si que estoy perdido, lo que tengo es una Atmega328 con Arduino UNO, pero una vez que esté lista planeo utilizarla en una MiniPro también Atmega 328 (no se si afecta?),

Pero volviendo al tema Nuyel y Scooter, no hay forma de hacer esto: (yo estoy seguro que eso eliminaría el problema, por lo menos para mis intereses...)

#define muestras 120 // Esta parte del código fue lo que se empleó para resolver el problema original.


Pero si hubiese una forma de modificarla de la siguiente forma:

#define muestras // No importa cuantas muestras. LAS QUE SE TENGAN al momento de registrar el dato de tal forma que el registro siempre sea al SEGUNDO CERO, del minuto definido según intervalo.
Gracias

---------- Actualizado después de 21 minutos ----------

Es decir, lo que he observado después de correr muchísimas veces el código, es que los atrazos se dan porque la orden de registrar los datos está condicionada a tener 120 muestras, pero si uno la condiciona a que no dependa del número de muestras sino (no importa cuantas), pero registre lo que tenga al momento del SEGUNDO CERO según intervalo definido, estoy seguro que eso resolvería el problema.

Lo que eso ocasionaría es que existan datos con promedios de 120 muestras, otros con 119, quizas otros con 121, pero eso no afecta para nada, pues, en el peor de los casos, se tendría un dato de un promedio con 118 datos y no con 120 (eso no afecta porque estamos hablando de valores muy similares, sobre todo que el valor que se "pierde" será al final.

El problema es que he buscado una expresión que me permita hacer eso y no doy con ella...

Claro, estoy seguro que la solución de la que ustedes hablan es una solución más ortodoxa, pero quería que supieran que esta otra vale para mi.

Gracias
22/04/2016 #32


Hola; encntré este código que sirve para hacer cálculos con fechas, entiendo que se podría llegar a un número int a partir de la resta de fechas.
Así que se me ocurrió preguntarles si ven razonable utilizar este método para resolver el asunto de las diferencias de tiempo en los registros? es para saber su opinión y si ven que no es muy inteligente, pues no gastarle neuronas tratando de organizar el código para mis intereses.


Código:
#include <Time.h>
time_t  T0, T1 ;         // Contenedores de fechas

void setup()
   {    Serial.begin(115200);  }

void loop()
   {    T0 = SetFecha(2014, 11, 6, 20, 17, 0);  // 6 nov 2014  20:17
        printFecha(T0) ;
        T1 = SetFecha(2014, 11, 13, 16, 45, 0);  // 13 nov 2014 16:45
        printFecha(T1) ;
        printFecha(T1 - T0);

        Serial.println("--------------------------------------------------");
        time_t H =  T1 - T0 ;

        Serial.print(String(year(H )- 1970)+" años,"  + String(month(H)-1 )+" meses,");
        Serial.println(String(day(H))+ " dias," + String(hour(H))+ " horas");
        Serial.println("---------------------------------------------------");
   }

void printFecha(time_t  t)
   {
       Serial.print(day(t)) ;    Serial.print(+ "/") ;   Serial.print(month(t));   Serial.print(+ "/") ;
       Serial.print(year(t));    Serial.print( " ") ;
       Serial.print(hour(t));   Serial.print(+ ":") ;   Serial.print(minute(t));   Serial.print(":") ;
       Serial.println(second(t));
       delay(1000);
   }

time_t SetFecha(int y, int m, int d, int h, int mi, int s  )
   {  tmElements_t Fecha ;
      Fecha.Second = s;
      Fecha.Minute = mi;
      Fecha.Hour = h;
      Fecha.Day = d ;
      Fecha.Month = m ;
      Fecha.Year = y -1970 ;
 
      return makeTime(Fecha);
   }
Se me ocurre que si en lugar de
#define muestras
, se utiliza una resta del valor (con base a fecha) del último registro y a dicho registro se le condiciona que cuando dicho valor mas otro (que seria por ejemplo 60 para un registro con intervalo de cada un minuto), de exactamente la fecha que necesitamos, esto reemplazaría a:

if (numReadings == 0){ //esto solo deberia ejecutarse cuando se tenga todas las muestras
Qie opinan creen que valga la pena intentarlo?
22/04/2016 #33

Avatar de Nuyel

pues reemplaza la condicional por otra que compare el tiempo calculado, pero también agrega otra variable que cuente cuantas muestras se tomaron ya que si esta será sustituida, también debe considerarse en calcular el promedio. Por otra parte, ¿ya probaste Serial.begin(115200);?
23/04/2016 #34


Sí, probé serial 115200 y el problema sigue, y estoy usando serial 250000.

Pero crear esas variables que mencionas, podrían hacerse usando fechas' (con el código que pasé en el post 32)

o estas pensando en otra forma.


Por ejemplo intenté con 3 if, pensando en que las salidas se hagan siempre en en segundo cero, pero no me dio resultado, el código compila, pero nunca se cumple que:.

Primer if
Código:
if ( numReading==0)
La cantidad de muestras siempre sean las definidas.
con Segundo if
Código:
minute()==0||2||4||6||8||10||12||14||16||18||20||22||24||26||28||30||32||34||36||38||40||42||44||46||48||50||52||54||56||58)
Cuando el intervalo de minutos es el definido.
y con Tercer if
Código:
second()==0
cuando los segundos son igual a cero.
23/04/2016 #35

Avatar de Nuyel

creo que mejor un primero registrar next = minute() + 2; y luego el if lo cambias a if(next >= minute()){. . . }
06/05/2016 #36


Estimados gracias a ambos por su ayuda (Nuyel y Scooter), los problemas de registros para que se dieran siempre en el segundo cero, los resolví de la siguiente forma:

Este era el código original:
Código:
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>   


#include "DHT.h"       
#define DHTTYPE DHT21  
#define DHTPIN 4       
DHT dht(DHTPIN, DHTTYPE);

#define muestras 120
#define tMaxVal (100.0)
#define tMinVal (0.0)
#define hMaxVal (100.0)
#define hMinVal (0.0)

float t, h, tmax = tMinVal, tmin = tMaxVal, hmax = hMinVal, hmin = hMaxVal;
float sigmaT = 0.0, sigmaH = 0.0, tavg = 0.0, havg = 0.0;
int numReadings = muestras;

void setup() {
   Serial.begin(9600);
  
  setSyncProvider (RTC.get); 
  //setTime(2,22,0,15,04,16); 

 if (timeStatus()!=timeSet){
  Serial.println ("No está el reloj");
  }else{
  Serial.println ("El reloj se sincronizo");
  }
 dht.begin();

 int horas = hour();
 int minutos = (minute()/2)*2+2; // Intervalos de registros cada 2 minutos.

  if (minutos == 60) {
     minutos = 0;
     horas   = hour()+1;
  }  

 Alarm.alarmOnce(horas, minutos, 0, AlarmStart);

 

  
}
void resetValues() {
  tmax = tMinVal;
  tmin = tMaxVal;
  hmax = hMinVal;
  hmin = hMaxVal;
  numReadings = muestras;    //reinicar cuenta de muestras
  sigmaT = 0.0;               //reiniciar suma de T
  sigmaH = 0.0;               //reiniciar suma de H
}

void loop() {
   Alarm.delay(1); // wait one second between clock display
}
void Registros(){   
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (t > tmax) tmax = t; //dado a que tMax inicia en cero, cualquier valor que sea superior al anterior lo sustituirá
  if (t < tmin) tmin = t; //dado a que tMin inicia en el valor más alto, cualquier valor inferior sustituye al ultimo registrado
  if (h > hmax) hmax = h;
  if (h < hmin) hmin = h;
  sigmaT += t;            //sumatoria de T
  sigmaH += h;            //sumatoria de H
  --numReadings;

if (numReadings == 0){ //esto solo deberia ejecutarse cuando se tenga todas las muestras
tavg = sigmaT/muestras;   //promedio de temperatura
havg = sigmaH/muestras;   //promedio de humedad

String dataString= "";
  
  dataString+= String (day());
  dataString+= ("/");
  dataString+= String (month());
  dataString+= ("/");
  dataString+= String (year());
  dataString+= ("  ");
  dataString+= String (hour());
  dataString+= String (":");
  dataString+= String (minute());
  dataString+= String (":");
  dataString+= String (second());
  dataString+= ("  ");
  dataString+= String (t);
  dataString+= ("  ");
  dataString+= String (tmax);
  dataString+= ("  ");
  dataString+= String (tmin);
  dataString+= ("  ");
  dataString+= String (h);
  dataString+= ("  ");
  dataString+= String (hmax);
  dataString+= ("  ");
  dataString+= String (hmin);
  dataString+= ("  ");
  dataString+= String (tavg);
  dataString+= ("  ");
  dataString+= String (havg);
  dataString+= ("  ");
  dataString+= String (muestras);
  Serial.println(dataString);

  resetValues(); //reiniciar los registros para el siguiente periodo.
}
}


void AlarmStart() {
  
  Alarm.timerRepeat(120, Registros);        // Para un dato cada 2 minutos.
}
y este como lo resolví:

Código:
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>   


#include "DHT.h"       
#define DHTTYPE DHT21  
#define DHTPIN 4       
DHT dht(DHTPIN, DHTTYPE);

#define second() 120
#define tMaxVal (100.0)
#define tMinVal (0.0)
#define hMaxVal (100.0)
#define hMinVal (0.0)

float t, h, tmax = tMinVal, tmin = tMaxVal, hmax = hMinVal, hmin = hMaxVal;
float sigmaT = 0.0, sigmaH = 0.0, tavg = 0.0, havg = 0.0;
int numReadings = second();
int segundos= (second()-120);

void setup() {
   Serial.begin(9600);
  
  setSyncProvider (RTC.get); 
  //setTime(2,22,0,15,04,16); 

 if (timeStatus()!=timeSet){
  Serial.println ("No está el reloj");
  }else{
  Serial.println ("El reloj se sincronizo");
  }
 dht.begin();

 int horas = hour();
 int minutos = (minute()/2)*2+2; // Intervalos de registros cada 2 minutos.

  if (minutos == 60) {
     minutos = 0;
     horas   = hour()+1;
  }  

 Alarm.alarmOnce(horas, minutos, 0, AlarmStart);

 

  
}
void resetValues() {
  tmax = tMinVal;
  tmin = tMaxVal;
  hmax = hMinVal;
  hmin = hMaxVal;
  numReadings = second();    //reinicar cuenta de muestras
  sigmaT = 0.0;               //reiniciar suma de T
  sigmaH = 0.0;               //reiniciar suma de H
}

void loop() {
   Alarm.delay(1); // wait one second between clock display
}
void Registros(){   
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (t > tmax) tmax = t; //dado a que tMax inicia en cero, cualquier valor que sea superior al anterior lo sustituirá
  if (t < tmin) tmin = t; //dado a que tMin inicia en el valor más alto, cualquier valor inferior sustituye al ultimo registrado
  if (h > hmax) hmax = h;
  if (h < hmin) hmin = h;
  sigmaT += t;            //sumatoria de T
  sigmaH += h;            //sumatoria de H
  --numReadings;

if (numReadings == 0){ //esto solo deberia ejecutarse cuando se tenga todas las muestras
tavg = sigmaT/second();   //promedio de temperatura
havg = sigmaH/second();   //promedio de humedad

String dataString= "";
  
  dataString+= String (day());
  dataString+= ("/");
  dataString+= String (month());
  dataString+= ("/");
  dataString+= String (year());
  dataString+= ("  ");
  dataString+= String (hour());
  dataString+= String (":");
  dataString+= String (minute());
  dataString+= String (":");
  dataString+= String (segundos);
  dataString+= ("  ");
  dataString+= String (t);
  dataString+= ("  ");
  dataString+= String (tmax);
  dataString+= ("  ");
  dataString+= String (tmin);
  dataString+= ("  ");
  dataString+= String (h);
  dataString+= ("  ");
  dataString+= String (hmax);
  dataString+= ("  ");
  dataString+= String (hmin);
  dataString+= ("  ");
  dataString+= String (tavg);
  dataString+= ("  ");
  dataString+= String (havg);
  dataString+= ("  ");
  dataString+= String (second());
  Serial.println(dataString);

  resetValues(); //reiniciar los registros para el siguiente periodo.
}
}


void AlarmStart() {
  
  Alarm.timerRepeat(120, Registros);        // Para un dato cada 2 minutos.
}
INCREÍBLE: no sabía (o almenos así lo estoy interpretando, porque de lo contrario no funcionaría), que la librería Time los segundos no se reinícian en el segund 60, sino que continúan...
Me gustaría si alguno me podría explicar por qué razón esto funcionó, aunque no me importa realmente, pues el problema se resolvió... Me pareció justo compartir la solución despues de tanta ayuda recibida... gracias...
07/05/2016 #37


Me encuentro con otro problema:
Resulta que estas pruebas (que ya funcionan perfectamente) las tenía en la placa Arduino Uno, pero por ahorro de energía las necesito en Mini Pro 3.3V 8Mhz, sin embargo, el código carga bien, pero las mediciones de temperatura y humedad relativa registran ambas lecturas en cero, he revisado en google y las recomendaciones que dan es colocar unas resistencias 4,7K y en otros documentos de 10K entre el cable de lectura y el VCC sin embargo he hechgo ambas cosas pero no me ha funcionado.

Alguien tiene alguna idea de lo que puede estar sucediendo o la incompatibilidad del sensor AOSONG AM2301 y la placa Mini Pro Sparkfun 3.3v de 8Mhz?
Repito con la placa Arduino Uno no hay problema alguno...
Gracias
07/05/2016 #38

Avatar de Nuyel

El voltaje mínimo es 3,3V, debería funcionar. Pero si lo alimentas con 2 pilas AA. . . el voltaje seria menor al mínimo, las pilas CR2032 también bajan demasiado el voltaje.
07/05/2016 #39


Todavía no estoy alimentandolo con pilas, todavía me encuentro conectado al pc, y mido el voltaje en los postes donde tengo conectados los cables negativo y positivo y me mide 4,2 voltios, por lo que descarté que fuese un problema de voltaje, la hoja de datos del sensor AM2301 me indica que trabaja con voltajes de 3.3 a 5.2. No sé que más hacer???

---------- Actualizado después de 44 minutos ----------

Ya lo solucioné:

Aparentemente era un problema con la librería (lo extraño es que en Arduino Uno no daba problema). Pero lo documento en caso que alguien pase por lo mismo:

Sensor AM2301 es un DHT 21.

Con la librería: Humidity_Temperature_Sensor funciona perfectamente en Arduino Uno, pero no funciona con MiniPro de sparkfun.

Para MiniPro usé la librería: DHT-sensor-library-master, y funciona perfectamente.

este es el link para descargarla:


Y este es un código de ejemplo que encontré para probarla, me gusta mucho porque además de dar la temperatura en Celcius y Farenheit, ofrece adicionalmente el Heat Index, que es una variable muy importante. El código se puede utilizar con otros sensores es solo modificar la parte de la declaración de las variables y listo.



Código:
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 4     // what digital pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}
11/05/2016 #40


Lamentablemente al dejar por varias horas capturando datos, el problema se vuelve a presentar, es decir que esto no es del todo cierto:
INCREÍBLE: no sabía (o almenos así lo estoy interpretando, porque de lo contrario no funcionaría), que la librería Time los segundos no se reinícian en el segund 60, sino que continúan...
Me gustaría si alguno me podría explicar por qué razón esto funcionó, aunque no me importa realmente, pues el problema se resolvió... Me pareció justo compartir la solución despues de tanta ayuda recibida... gracias...
No explico como si el registro de datos está condicionado a la catura de 120 segundos (muestras) que se supone es la misma variable que define el cambio de minutos a los 60 segundos, puedan existir diferencias, entre la cantidad de muestras y el tiempo, si es la misma variable la que define ambas???

Alguna idea...????
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.