Autor Tema: Guardar datos en eeprom/SD y leer con Excel  (Leído 1700 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Guardar datos en eeprom/SD y leer con Excel
« en: 19 de Noviembre de 2020, 16:37:27 »
Hola gente.. necesito guardar unos datos en una memoria externa, ya sea una eeprom o una SD, con un formato que luego lo pueda abrir con Excel. Nunca lo hice y no se con que extensión debería guardarlo para que lo abra Excel.  Uso 16f877a y CCS.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 941
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #1 en: 19 de Noviembre de 2020, 17:37:05 »
Una pregunta de este estilo se respondió ayer.
Grabalo en formato .CSV  , que es texto plano separado por coma o punto y coma.   Ah!  También por tabulador (ascii 0x9)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #2 en: 19 de Noviembre de 2020, 19:08:08 »
Ademas una EEPROM es muy distinto a una SD...

Si planteas la EEPROM es que lo vas a estar leyendo con el PIC, por lo tanto no te preocupa como almacenarlo, sino como transmitirlo.
Si planteas la SD, y queres que sea un archivo para luego llevarlo a la PC, entonces como se te dijo mejor un CSV, pero eso significa que vas a tener que un sistema de archivos FAT seguramente en la SD y en el PIC el controlador como para leerlo y poder grabarlo.

Considero que son totalmente dos cosas distintas uno de otro.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #3 en: 19 de Noviembre de 2020, 19:23:29 »
Cual seria el método menos engorroso, es un pluviómetro, el cual necesitaría guardar los datos con fecha y hora y luego levantarlos, si es de una manera inalambrica mejor. 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #4 en: 19 de Noviembre de 2020, 19:42:12 »
Creo que no estas pensando ni siquiera con que queres leerlo, ni tampoco como comunicarse.

Si queres que sea inalambrico, tenes las siguientes opciones:

- Wifi, y podes crear un programa en una PC que tome los datos. O un servidor MQTT. Si tiene alcance a un router
- Algun otro protocolo de radio, el cual vas a necesitar un receptor en algun lado, y si lo queres debería estar conectado a la PC, sea por USB o red cableada, o wifi.
- SD implica que tenes que ir a buscarlo. PERO también necesitas un RTC para mantener la hora. y así grabar fecha y hora conjunto con los datos. También necesitas como escribir la hora y actualizarla.

Si el pluviometro lo único que hace es enviar datos, entonces no te preocupas por la hora, ya que es el servidor quien debe recibirlo.
Ahora si pensas que el servidor puede caerse (se apaga la PC) y necesitas mantener los datos con su hora, si o si vas a necesitar un RTC, el cual vas a poder actualizar pidiendo la hora por internet o directamente al servidor. Así mantener los datos en alguna EEPROM y luego enviarlo cuando este arriba el servidor.

En fin.. Lo pensaste bastante poco al tema, pensa en los requisitos que queres que tenga, pensa como queres comunicarte, las posibilidades, etc
Engorroso puede ser tanto como vos quieras, según las funcionalidades que vos desees agregarle. Esto ya depende únicamente de vos y tus requisitos.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #5 en: 19 de Noviembre de 2020, 20:16:52 »
El lugar de aplicación del pluviómetro es en medio del campo donde no tengo ningún tipo de señal. pensaba guardarlo en una memoria externa y luego levantar los datos, ya sea extrayendo la memoria o no se si puede levantarlos a través de BlueTooth.

Para grabarlos los grabo con fecha y hora de un RTC.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #6 en: 19 de Noviembre de 2020, 22:11:05 »
Si pensas usar bluetooth entonces solo necesitas almacenarlo en una EEPROM. Uno al lado de otro a los datos.
Los envias con algún formato que vos le quieras dar (Fecha-Cantidad de lluvia) y dejas que la App sea la encargada de almacenarlo en el celular. No es necesario que sea almacenado en un archivo XLS, simplemente lo que te resulte mas cómodo en la aplicación.
Luego podes dar la opción de "exportar" los datos a Excel o CSV como vos quieras. Y ahí si lo transformas a un formato para abrirlo en una PC.

Acá lo mas complicado no es el pluviometro (que va a tener su complicación por supuesto - batería o panel solar, etc), no es la transmisión bluetooth, sino la App del celular, su instalación por parte de personas idóneas, y también la compatibilidad con distintos celulares. El éxito depende mucho de la UI de la aplicación, si es fácil y eficaz en mostrar la información. Si lo tenes que explicar, no es simple tu UI.

Al emparejarse, podrías intercambiar el horario del teléfono para sincronizar los horarios (Suponiendo que no se erren tanto),

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #7 en: 20 de Noviembre de 2020, 09:03:04 »
Ahh ok ok.. voy a intentar grabar en la eeprom y levantarlos por BT. muchas gracias KILLERJC.
Subiré los avances.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5470
    • Electrónica Didacta
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #8 en: 20 de Noviembre de 2020, 13:00:05 »
El lugar de aplicación del pluviómetro es en medio del campo donde no tengo ningún tipo de señal. pensaba guardarlo en una memoria externa y luego levantar los datos, ya sea extrayendo la memoria o no se si puede levantarlos a través de BlueTooth.

Para grabarlos los grabo con fecha y hora de un RTC.

respecto a la primera opción, existen modulos como el OpenLog que resuelven por completo el requerimiento.
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #9 en: 25 de Noviembre de 2020, 11:43:39 »
Hola buenos dias, bueno, ya logre hacer una app android con appinventor, levantar datos del pic y hacer una planilla excel. Lo que estoy intentando hacer ahora es guardar datos en la memoria eeprom del pic, pero algo me esta pasando que se me cuelga. Realizo la grabación en la eeprom cada 1 minuto. Paso el código.
Código: C++
  1. #include <16f877a.h>
  2. #fuses hs,nowdt,noprotect,noput
  3. #use delay (clock=4M)
  4. int8 cont=0;
  5. int8 n=0,m=0;
  6. int8 temperatura,humedad;
  7.  
  8. #int_timer0
  9. void timer0()
  10. {
  11.  set_timer0(6);
  12.  cont=cont++;
  13. }
  14.  
  15. void guardar_dato_eeprom()
  16. {
  17.      
  18.       WRITE_EEPROM(n,temperatura);
  19.         m=n++;
  20.         WRITE_EEPROM(n,humedad);
  21.         n=m++;
  22.            
  23. }
  24.  
  25. void main()
  26. {
  27.   setup_timer_0(rtcc_internal|rtcc_div_256);
  28.   set_timer0(6);
  29.   enable_interrupts(int_timer0);
  30.   enable_interrupts(global);
  31.  
  32.     while(true)
  33.     {
  34.    
  35.       if (cont==937) //Cada 1 minuto
  36.        {
  37.         guardar_dato_eeprom();
  38.         cont=0;
  39.        }
  40.    
  41.    
  42.     }
  43.  
  44.  
  45. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #10 en: 25 de Noviembre de 2020, 12:06:05 »
No creo que se lleven muy bien:

Código: C
  1. int8 cont=0;
  2.  
  3. cont==937


- ¿Por que n y m ? Supongo que máximo tenes 256 posiciones de memoria. Así te protejes con el overflow de los índices que son de 8 bits.
- ¿Por que no usar un solo índice?
- Si se resetea. Comienza a borrar todo lo guardado
- No tenes referencia temporal, asi que no sabes que dato pertenece a cierto dia.
- ¿Para que guardar datos sin sentido? Es decir realmente necesitas una actualización de 1min para una lluvia?
Si, podes actualizar el mismo punto hasta que no llueva mas o cambie de fecha, supongamos. Si lo haces por día a las precipitaciones.
Si no cambia, que sentido tiene gastar 1 grabación de la EEPROM, reduciendo su vida util.
- Arma una estructura mejor con todos los datos
Código: C
  1. WRITE_EEPROM(n,temperatura);
  2.         m=n++;
  3.         WRITE_EEPROM(n,humedad);
  4.         n=m++;


- Reducí el reloj al máximo que puedas. Si usas uno de 32Khz y es suficiente para atender a las interrupciones del sensor que te indica la precipitación, entonces anda por eso.
Solo despertas en el momento que realmente es necesario, sino no tiene sentido estar despertando cada 1 minuto.
- Si se pierde la información de 1 minuto ¿es grande el error cometido al no guardarlo?

Son preguntas que necesitas hacerte.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #11 en: 25 de Noviembre de 2020, 13:20:02 »
sii ahi cambie la declaracion de la variable "cont" y utilice una sola variable para ir cambiando la posición de la memoria. Pero sigo con el mismo problema..
Por ahora lo que quiero hacer es grabar valores de temperatura y humedad en la memoria y levantar esos datos con la aplicación. Sin importar el tiempo por ahora, el propósito es poder guardar los valores que me dan los sensores de temp y hr. Pongo el código completo.
Lo que hace este programa es mediante los sensores de temperatura y humedad, mostrar los datos en un LCD. El problema que tengo que cuando arranca los muestra y se queda tildado, ya que si le pongo temperatura al sensor no se actualiza en el display. Si yo desactivo la interrupción del timer0, el programa funciona lo mas bien. Por eso mi duda es que se tilda al entrar a esa interrupción.


Código: C++
  1. #include <16F877a.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP    
  6. #use delay(clock=4M)
  7. #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
  8. #define DQ   PIN_E1    //sensor temp
  9. #include <lcd.c>
  10. int8 BT=0, temp, hr;
  11. int16 cont=0;
  12. int8 n=0;
  13. #include "DHT11.c"
  14.  
  15.  
  16.  
  17. //////////////////////  Interrupcion Timer 0 ///////////////////////////////////
  18. #INT_TIMER0
  19. void interruption()
  20.    {
  21.     set_timer0(6);
  22.     cont++;
  23.    }
  24. ///////////////////////////////////////////////////////////////////////////////
  25.  
  26.  
  27. ////////////////////////////////  Sensor Temperatura  /////////////////////////
  28.  
  29. void ow_reset(void)
  30. {
  31. output_low(DQ);
  32. delay_us(500);          
  33. output_float(DQ);
  34. delay_us(500);          
  35. }
  36.  
  37.  
  38. int8 read_bit(void)
  39. {
  40. output_low(DQ);
  41. delay_us(1);          
  42. output_float(DQ);
  43. delay_us(12);        
  44. return(input(DQ));    
  45. }                        
  46.  
  47.  
  48. int8 read_byte(void)
  49. {
  50. int8 i;
  51. int8 val = 0;
  52.  
  53. for(i=0 ; i<8 ; i++)
  54.    {
  55.     if(read_bit()) val |= (0x01 << i);
  56.        delay_us(120);  
  57.    }
  58.  
  59. return val;
  60. }
  61.  
  62.  
  63. void write_byte(int8 val, int8 power_on)
  64. {
  65. int i;
  66.  
  67. for(i=0; i<8; i++)
  68.    {
  69.     output_low(DQ);
  70.     delay_us( 2 );  
  71.     output_bit(DQ, shift_right(&val,1,0));  
  72.  
  73.     delay_us(60);
  74.  
  75.     if((i == 7) && (power_on == 1))
  76.       {
  77.        output_high(DQ);
  78.       }
  79.     else
  80.       {
  81.        output_float(DQ);
  82.        delay_us( 2 );  
  83.       }
  84.    }
  85.  
  86. }
  87.  
  88. //////////////////////////  Interrupcion BT  //////////////////////////////////
  89.  
  90. #int_rda                      //Vector de interrupcion de la recepcion de datos
  91. void interrupcion_rx()  
  92. {
  93.         char respaldo;
  94.         respaldo = getc();
  95.        
  96.         if(respaldo == 'x')
  97.                 {BT=1;
  98.                 }
  99. }
  100. /////////////////////////////// Guardado Eeprom ////////////////////////////////
  101.  
  102. void guardar_dato_eeprom()
  103. {
  104.       WRITE_EEPROM(n,temp);
  105.         n=n++;
  106.         WRITE_EEPROM(n,hr);
  107.          n=n++;  
  108. }
  109. //////////////////////////////////////////////////////////////////////////////
  110.  
  111. /////////////////////////////////  LCD  ///////////////////////////////////////
  112.  
  113. Void Lcd_()
  114. {
  115.  //     ******************************************************************
  116.             lcd_gotoxy(11, 1);                                          
  117.             printf(lcd_putc,"Hr=  %%");      // %% -> simbolo %                          
  118.             lcd_gotoxy(1,1);                                            
  119.             printf(lcd_putc,"Temp:  \337C"); //  \337 -> simbolo °      
  120.  //     ******************************************************************
  121. }
  122.  
  123. ///////////////////////////////////////////////////////////////////////////////
  124.  
  125. void main()
  126. {
  127.    setup_timer_0(rtcc_internal|rtcc_div_256);
  128.    set_timer0(1);
  129.    enable_interrupts(GLOBAL);
  130.    enable_interrupts(INT_TIMER0);
  131.    enable_interrupts(int_rda);
  132.    
  133.    
  134.    lcd_init();      
  135.    lcd_gotoxy(1,1);
  136.    printf(LCD_PUTC, "  BIENVENIDOS  ");
  137.    delay_ms(3000);
  138.    printf(lcd_putc,"\f");
  139.    lcd_gotoxy(1,2);
  140.    printf(lcd_putc, "  Iniciando    ");
  141.    delay_ms(1000);    
  142.    lcd_gotoxy(1,2);
  143.    printf(lcd_putc, "  Iniciando.   ");
  144.    delay_ms(1000);
  145.    lcd_gotoxy(1,2);
  146.    printf(lcd_putc, "  Iniciando..  ");
  147.    delay_ms(1000);
  148.    lcd_gotoxy(1,2);
  149.    printf(lcd_putc, "  Iniciando... ");
  150.    delay_ms(1000);
  151.    printf(lcd_putc,"\f");
  152.  
  153.    lcd_();
  154.    DHT11_init();
  155.    
  156.  while(true)
  157. {
  158.  
  159. ///////////////////////////  Sensor Temperatura   /////////////////////////////
  160.    
  161.    int8 i;
  162.    signed int16 temperature;
  163.    int8 scratch[9];
  164.    
  165.    output_float(DQ);
  166.    ow_reset();
  167.    write_byte(0xCC, 0);
  168.    write_byte(0x44, 1);
  169.  
  170.    delay_ms(750);    
  171.    
  172.    ow_reset();
  173.    write_byte(0xCC, 0);
  174.    write_byte(0xBE, 0);  
  175.    
  176.  
  177.    for(i=0; i < 8; i++)
  178.       {
  179.        scratch[i] = read_byte();  
  180.       }
  181.    
  182.    ow_reset();
  183.      
  184.    temperature = (signed int16) make16(scratch[1],scratch[0]);
  185.          
  186.    if(temperature >= 0)
  187.       temperature = (temperature + 8)/16;
  188.    else
  189.       temperature = (temperature - 8)/16;
  190.          
  191.    lcd_gotoxy(6,1);        
  192.    printf(lcd_putc,"%2ld",temperature);
  193.    temp=temperature;
  194.    
  195. //////////////////////////////////////////////////////////////////////////////
  196. ///////////////////////// Sensor Hr //////////////////////////////////////////
  197.    unsigned char state = 0;
  198.  
  199.    state = get_data();  
  200.    lcd_gotoxy(14,1);  
  201.    printf(lcd_putc,"%2u", values[0]);
  202.    hr=values[0];
  203.      
  204. //////////////////////// Envio a la App  ////////////////////////////////////////
  205.    
  206.    if(BT==1)
  207.    {
  208.    int temperatura,humedad,j=0;  
  209.  
  210.        temperatura=read_eeprom(j);
  211.        humedad=read_eeprom(j);
  212.        printf("%i,%i",temperatura, humedad);
  213.        printf("\n");
  214.        delay_ms(500);
  215.    BT=0;
  216.    }
  217.    
  218. /////////////////////////////////////// Timer0 ///////////////////////////////
  219.       if (cont==200) //
  220.       {
  221.         guardar_dato_eeprom();
  222.         cont=0;
  223.       }
  224. ////////////////////////////////////////////////////////////////////////////////      
  225.  
  226.  
  227. }
  228.  
  229. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #12 en: 25 de Noviembre de 2020, 15:14:25 »
Citar
Por eso mi duda es que se tilda al entrar a esa interrupción.

Probaste limpiando el flag de interrupción también ?. O tal ves el tiempo es demasiado corto el de la interrupción. Ya que lo comentas es por el tema de la interrupcion.

Mucho mas sencillo
Código: C
  1. void guardar_dato_eeprom()
  2. {
  3.       WRITE_EEPROM(n++,temp);
  4.       WRITE_EEPROM(n++,hr);
  5. }

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #13 en: 25 de Noviembre de 2020, 16:02:51 »
Ahi probe limpiando la bandera con
Código: C++
  1. clear_interrupt(INT_TIMER0);
y sigue haciendo lo mismo.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Guardar datos en eeprom/SD y leer con Excel
« Respuesta #14 en: 26 de Noviembre de 2020, 14:38:17 »
Listo lo pude solucionar, algo en la libreria del DHT11 estaba influyendo, la saque para probar y no se tilda. Ya me pondré a ver que es lo que hacer detener el programa.


 

anything