sábado, 7 de dezembro de 2013

DataLogger com PIC18F

DataLogger com PIC18F


DataLogger é um equipamento destinado a coletar dados durante um certo tempo. Esses dados são fornecidos por sensores e seus valores são armazenados numa memória.

Este projeto trata-se de um datalogger que faz a medição de temperatura utilizando o sensor LM35, e armazena seus valores num cartão SD, junto com a hora atual. O relógio utlizado é o RTC DS1307.

O arquivo será salvo no formato ".csv" para poder ser aberto no Excel. Para cada vez que reiniciar o microcontrolador, será criado um novo arquivo.


No caso utilizei o microcontrolador PIC18F4620, mas pode ser utilizado por qualquer PIC da família 18F em diante.

O cartão SD deve estar formatado como FAT16.

Veja também que como o DS1307, comunica-se via I2C e o cartão SD comunica-se via SPI, ambas comunicações utilizam o mesmo pino no microcontrolador. Para facilitar o código, optei por utilizar a função SOFTWARE I2C. Software i2c, é uma emulação da comunicação i2c, utlizando qualquer pino do microcontrolador para essa comunicação.

A imagem do cartão SD para poder simular no Proteus está no formato ".ima". Baixe o programa UltraISO, ou outro semelhante, para poder abrir este arquivo.

Estou incluindo este arquivo no download abaixo.

DOWNLOAD:
Projeto DataLoggerdatalogger.rar;


Caso você queira montar esse projeto, não se esqueça que o cartão SD é alimentado com 3.3V, e também os pinos CLK, DI e CS, deve receber tensões de 3.3V.



CóDIGO-FONTE:
MikroC PRO PIC v6.0

  1. sbit Mmc_Chip_Select at LATC0_bit;
  2. sbit Mmc_Chip_Select_Direction at TRISC0_bit;
  3. sbit Soft_I2C_Scl at RC1_bit;
  4. sbit Soft_I2C_Sda at RC2_bit;
  5. sbit Soft_I2C_Scl_Direction at TRISC1_bit;
  6. sbit Soft_I2C_Sda_Direction at TRISC2_bit;
  7. char temp[16] = "00:00:00;000,0\r";
  8. short segundos, minutos, horas, dia, date, mes, ano;
  9. unsigned long adc;
  10. char filename[11] = "DataXX.csv";//o array nao pode ser maior que 14
  11. //define os segundos, minutos.. para o ds1307
  12. void ds1307_write(){
  13. Soft_i2c_stop();
  14. Soft_i2c_start();
  15. Soft_i2c_write(0xD0);
  16. Soft_i2c_write(0x00);
  17. Soft_i2c_write(Dec2Bcd(0));//segundos
  18. Soft_i2c_write(Dec2Bcd(0));//minutos
  19. Soft_i2c_write(Dec2Bcd(12));//horas
  20. Soft_i2c_write(Dec2Bcd(1));//dia da semana
  21. Soft_i2c_write(Dec2Bcd(12));//data
  22. Soft_i2c_write(Dec2Bcd(3));//mes
  23. Soft_i2c_write(Dec2Bcd(13));//ano
  24. Soft_i2c_stop();
  25. }
  26. //faz a leitura do ds1307
  27. void ds1307_read(){
  28. Soft_i2c_start();
  29. Soft_i2c_write(0xD0);
  30. Soft_i2c_write(0x00);
  31. Soft_i2c_Start();
  32. Soft_i2c_write(0xD1);
  33. segundos = Bcd2Dec(Soft_i2c_read(1));
  34. minutos = Bcd2Dec(Soft_i2c_read(1));
  35. horas = Bcd2Dec(Soft_i2c_read(1));
  36. dia = Bcd2Dec(Soft_i2c_read(1));
  37. date = Bcd2Dec(Soft_i2c_read(1));
  38. mes = Bcd2Dec(Soft_i2c_read(1));
  39. ano = Bcd2Dec(Soft_i2c_read(0));
  40. Soft_i2c_stop();
  41. }
  42. //Esta funcao cria um novo arquivo
  43. void Create_New_File() {
  44. //cria o arquivo(caso nao exista) com atributo de arquivo e abre-o
  45. Mmc_Fat_Assign(&filename, 0xA0);
  46. //define a data de criação do arquivo
  47. Mmc_Fat_Set_File_Date(ano+2000, mes, date, horas, minutos, segundos);
  48. Mmc_Fat_Append();//prepara o arquivo para gravação
  49. Mmc_Fat_Write(temp, 15);//escreve no arquivo
  50. }
  51. //Esta função deleta o arquivo
  52. void Delete_File() {
  53. Mmc_Fat_Assign(&filename, 0);
  54. Mmc_Fat_Delete();
  55. }
  56. short Test_File_Exist() {
  57. //como nao definiu nenhum atributo de criação, caso o arquivo exista
  58. //retorna 1, caso contrario retorna 0
  59. return Mmc_Fat_Assign("DATA00.csv", 0);
  60. }
  61. //abre o arquivo(caso não exista, nao ira ler) e inicia a leitura.
  62. void Open_File_Read() {
  63. unsigned long i, size;
  64. char caracter;
  65. Mmc_Fat_Assign(&filename, 0);
  66. Mmc_Fat_Reset(&size);//recupera o numero de caracteres do arquivo
  67. for (i = 1; i <= size; i++) {
  68. Mmc_Fat_Read(&caracter);// le um caracter do arquivo
  69. UART1_Write(caracter);
  70. }
  71. }
  72. void main()
  73. {
  74. short i;
  75. ADC_Init();//inicia o modulo ADC
  76. ADCON1 = 0B00001110; //define o canal 0 como analogico, o restante como digital.
  77. Soft_i2c_init();//inicia a comunicação software i2c
  78. //inicia a comunicação SPI
  79. SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
  80. //inicia a comunicaçao com cartão SD
  81. MMc_Fat_Init();
  82. //verifica-se se o arquivo ja existe. caso exista cria um novo arquivo com um nome diferente
  83. for(i=0;i<100;i++)
  84. {
  85. filename[4] = (i/10) + 48;
  86. filename[5] = (i%10) + 48;
  87. if(Mmc_Fat_Assign(&filename, 0)==0)
  88. {
  89. break;
  90. }
  91. }
  92. while(1)
  93. {
  94. adc = ADC_Read(0);
  95. adc = adc * 1000/204;
  96. temp[9] = (adc/1000) + 48;
  97. temp[10] = ((adc%1000)/100) + 48;
  98. temp[11] = (((adc%1000)%100)/10) + 48;
  99. temp[13] = (((adc%1000)%100)%10) + 48;
  100. ds1307_read();
  101. temp[0] = horas/10 + 48;
  102. temp[1] = horas%10 + 48;
  103. temp[3] = minutos/10 + 48;
  104. temp[4] = minutos%10 + 48;
  105. temp[6] = segundos/10 + 48;
  106. temp[7] = segundos%10 + 48;
  107. Create_New_File();
  108. delay_ms(500);
  109. }
  110. }

0 comentários:

Postar um comentário