Go Down

Topic: DATA LOGGIN BOARD DEEK BOARD (Read 313 times) previous topic - next topic

encrone_90

Feb 09, 2018, 10:19 pm Last Edit: Feb 09, 2018, 10:28 pm by encrone_90
hola  buena tarde a todos,  compre este modulo  de data logger  deek board, me tope con este código en internet, que activa con 1 boton en el pin 7 la grabación de un dato analogico A0, y se detiene presionando ese botón guardando la hora y fecha con el dato, y te avisa con LEDS el estado de grabacion y STOP.
utilice primero el un modulo de micro SD y RTC DS3231 y funciona perfecto sin ningun problema.

pero al utilizar el modulo de data logger deek (que es mas pequeño que los modulos separados) este usa el RTC 1307,  investigue en internet y la libreria  RTClib y usa comandos de  now.day(), now.month, etc.
como no estoy familiarizado con esa libreria  y comandos.

en un inicio  pense que funcionaria con las mismas librerias del DS 3231  y funciona muy bien de  las 0 horas (12am) hasta las 16 horas (4pm) y despues  comienza a escribir 10 en lugar de 17 horas, 11 en lugar de 18, 12 horas en lugar de 19, y cuando llega a las 17 horas (como las 11pm)  se reinicia en 0 y continua con la toma de informacion.

MI GRAN PREGUNTA ES: ALGUIEN PODRIA AYUDARME A CORREGIR ESTE ERROR, Y QUE PUEDA ESCRIBIR LA HORA EN ESE FORMATO SENCILLO DE GET.CLOCK ( INFORMACION)  EN VEZ DE UTILIZAR LOS COMANDOS  now.day();

otra duda si alguien sabe que consumo en mAh  tiene el modulo  de data loggin ??

este es el codigo de data logger con ds3231:

Code: [Select]
#include <SPI.h>
#include <SD.h>
File myFile;
#include <DS3231.h>
#include <Wire.h>
#include <TimerOne.h>
DS3231 Clock;
#define FACTOR_VOLTAJE (5.0 / 1023.0)
byte year, month, date, DoW, hour, minute, second;
char linea[24];
char voltaje[5];

#define LED1    A1
#define LED2    A2
#define chipSelect      10
#define LED3    4
#define LED4    3
#define LED5    2
#define LED6    A3


void setup()
{
    TIMSK0 = 0;
  Wire.begin();
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);

  
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(chipSelect, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);

digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);


  if (!SD.begin(chipSelect))
  {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
    return;
  }
  
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);

  Timer1.initialize(2000);
}


void loop()
{
  if (!digitalRead(7)) grabar();
}

void grabar() {
  while (!digitalRead(7)); // Espera a que el botón se suelte

  myFile = SD.open("datalog1.txt", FILE_WRITE);//abrimos  el archivo
  if (!myFile) {
  
  return;}
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
 
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);

  Clock.getTime(year, month, date, DoW, hour, minute, second);
  myFile.write(linea, sprintf(linea, "Iniciado el %02d/%02d/20%02d, a las %02d:%02d:%02d\r\n", date, month, year, hour, minute, second));
   Timer1.attachInterrupt (timerIsr); // attach service
  while (digitalRead(7)){
     unsigned long tAnterior = 0;
    unsigned long tActual = millis();
    if (tActual >= tAnterior) { // Pide información nueva al RTC cada segundo
      tAnterior = tActual + 1000;
      Clock.getTime(year, month, date, DoW, hour, minute, second);
}
  }
  Timer1.detachInterrupt(); // detach service
  while (!digitalRead(7)); // Espera a que el botón se suelte

  Clock.getTime(year, month, date, DoW, hour, minute, second);
  myFile.write(linea, sprintf(linea, "Finalizado el %02d/%02d/20%02d, a las %02d:%02d:%02d\r\n", date, month, year, hour, minute, second)); // Pie
  myFile.close(); //cerramos el archivo
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
 
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, LOW);
}

void timerIsr()
{
      dtostrf(analogRead(A0) * FACTOR_VOLTAJE, 0, 2, voltaje);
    myFile.write(linea, sprintf(linea, "%s\t%02d:%02d:%02d\r\n", voltaje, hour, minute, second));
 }



este es el codigo de 1307: con comandos now
Code: [Select]

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC

//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)

Serial.begin(9600); // Establece la velocidad de datos del puerto serie
}

void loop(){
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
  
Serial.print(now.year(), DEC); // Año
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');

Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();

delay(3000); // La información se actualiza cada 1 seg.

}

Lucario448

Code: [Select]
void getTime(byte* year, byte* month, byte* date, byte* DoW, byte* hour, byte* minute, byte* second) {
  DateTime now = RTC.now();
  if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

  *year = now.year() - 2000;
  *month = now.month();
  *date = now.day();
  *DoW = now.dayOfTheWeek();
  *hour = now.hour();
  *minute = now.minute();
  *second = now.second();
}

Esta es la adaptación más cercana que puedo hacer. La diferencia es que para llamarlo correctamente, todos los nombres de las variables deben presidir con &. Ejemplo:

Code: [Select]
getTime(&year, &month, &date, &DoW, &hour, &minute, &second);

encrone_90

gracias! una pregunta ese void debe ir en el primer boceto??

y lo de llamar  con un & tambien aplica a la hora de imprimir los datos???

dejo  la libreria de RTClib o las de DS3231??

fijate que marco estos errores:

Code: [Select]

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_662991\sketch_feb09b.ino: In function 'void getTime(byte*, byte*, byte*, byte*, byte*, byte*, byte*)':

sketch_feb09b:76: error: no match for 'operator!' (operand type is 'DateTime')

   if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

       ^

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_662991\sketch_feb09b.ino:76:7: note: candidate is:

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_662991\sketch_feb09b.ino:76:7: note: operator!(bool) <built-in>

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_662991\sketch_feb09b.ino:76:7: note:   no known conversion for argument 1 from 'DateTime' to 'bool'

sketch_feb09b:81: error: 'class DateTime' has no member named 'dayOfTheWeek'

   *DoW = now.dayOfTheWeek();

              ^

exit status 1
no match for 'operator!' (operand type is 'DateTime')

encrone_90

creo que el error de dayOfTheWeek, era que en la libreria RTC, aparece como dayOfWeek, sin el "The" pero aun me sigue marcando el error este de:

Code: [Select]

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino: In function 'void getTime(byte*, byte*, byte*, byte*, byte*, byte*, byte*)':

sketch_feb09c:76: error: no match for 'operator!' (operand type is 'DateTime')

   if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

       ^

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: candidate is:

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: operator!(bool) <built-in>

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note:   no known conversion for argument 1 from 'DateTime' to 'bool'

exit status 1
no match for 'operator!' (operand type is 'DateTime')


surbyte

Este parece ser el consumo

Quote
16MHz, 5 volt, 36mA draw current, 14 digital pins, ATmega32U4 MCU - Deek-Robot Pro Micro
por otro lado mira este hilo Deek robot SD shield y verás posibles respuestas a tu problema

Lucario448

#5
Feb 10, 2018, 05:23 am Last Edit: Feb 10, 2018, 05:24 am by Lucario448
Code: [Select]

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino: In function 'void getTime(byte*, byte*, byte*, byte*, byte*, byte*, byte*)':

sketch_feb09c:76: error: no match for 'operator!' (operand type is 'DateTime')

   if (!now) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

       ^

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: candidate is:

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note: operator!(bool) <built-in>

C:\Users\Usuario\AppData\Local\Temp\arduino_modified_sketch_5819\sketch_feb09c.ino:76:7: note:   no known conversion for argument 1 from 'DateTime' to 'bool'

exit status 1
no match for 'operator!' (operand type is 'DateTime')

No sé si colocar otro paréntesis bastará:
Code: [Select]
if (!(now))

El detalle es que no sé cómo maneja la función now() un error como que el RTC no responda a la petición del Arduino. No vaya a ser que la fecha y hora se actualize con valores fuera de serie.

una pregunta ese void debe ir en el primer boceto??
Fuera de cualquier función; como se declara setup y loop (excepto que tiene parámetros).


y lo de llamar  con un & tambien aplica a la hora de imprimir los datos???
No. La idea de esta adaptación es para que puedas hacer exactamente lo mismo que en código viejo, pero con la librería nueva (recuerda que no tiene la función getTime, así que básicamente la "reinventé").

encrone_90

sigue marcando el mismo error, pero de curioso omití esa linea,  y funciona.
pero no se  si  eso implique algún error, lo deje corriendo para ver que no presente algún error.
o se coma tiempo en la mediciones

tu que opinas???

Lucario448

pero de curioso omití esa linea,  y funciona.
Era obvio. El compilador decía que la clase DateTime no tenía operador ! definido.

Además, según la implementación de dicha función:
Code: [Select]
DateTime RTC_DS1307::now() {
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire._I2C_WRITE((byte)0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);
  uint8_t ss = bcd2bin(Wire._I2C_READ() & 0x7F);
  uint8_t mm = bcd2bin(Wire._I2C_READ());
  uint8_t hh = bcd2bin(Wire._I2C_READ());
  Wire._I2C_READ();
  uint8_t d = bcd2bin(Wire._I2C_READ());
  uint8_t m = bcd2bin(Wire._I2C_READ());
  uint16_t y = bcd2bin(Wire._I2C_READ()) + 2000;
  
  return DateTime (y, m, d, hh, mm, ss);
}

El objeto se crea de todas formas, INDEPENDIENTEMENTE DE SI EL MÓDULO RESPONDE O NO.

Eso es lo que me temía: cuando por algún motivo suceda, la fecha y hora aparecerá con valores fuera de lo normal (165/165/2165 - 165:165:165).

Por lo tanto, se puede corregir de la siguiente manera:
Code: [Select]
void getTime(byte* year, byte* month, byte* date, byte* DoW, byte* hour, byte* minute, byte* second) {
  DateTime now = RTC.now();
  if (now.second() > 59) return; // No actualiza si por alguna razón no puede obtener los datos nuevos

  *year = now.year() - 2000;
  *month = now.month();
  *date = now.day();
  *DoW = now.dayOfTheWeek();
  *hour = now.hour();
  *minute = now.minute();
  *second = now.second();
}

Go Up