DataLogger com PIC18F
Autor: Eletroautomação | Publicado: 2013-12-07T18:03:00-08:00


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&nbsp;UltraISO, ou outro semelhante, para poder abrir este arquivo.



Estou incluindo este arquivo no download abaixo.
DOWNLOAD:Projeto DataLogger:&nbsp;datalogger.rar;Caso você queira montar esse projeto, não se esqueça que o cartão SD é alimentado com&nbsp;3.3V, e também os pinos&nbsp;CLK, DI e CS, deve receber tensões de&nbsp;3.3V.CóDIGO-FONTE:
MikroC PRO PIC v6.0






sbit Mmc_Chip_Select at LATC0_bit;
sbit Mmc_Chip_Select_Direction at TRISC0_bit;
sbit Soft_I2C_Scl at RC1_bit;
sbit Soft_I2C_Sda at RC2_bit;
sbit Soft_I2C_Scl_Direction at TRISC1_bit;
sbit Soft_I2C_Sda_Direction at TRISC2_bit;

char temp[16] = "00:00:00;000,0\r";
short segundos, minutos, horas, dia, date, mes, ano;
unsigned long adc;
char filename[11] = "DataXX.csv";//o array nao pode ser maior que 14

//define os segundos, minutos.. para o ds1307
void ds1307_write(){
Soft_i2c_stop();
Soft_i2c_start();
Soft_i2c_write(0xD0);
Soft_i2c_write(0x00);
Soft_i2c_write(Dec2Bcd(0));//segundos
Soft_i2c_write(Dec2Bcd(0));//minutos
Soft_i2c_write(Dec2Bcd(12));//horas
Soft_i2c_write(Dec2Bcd(1));//dia da semana
Soft_i2c_write(Dec2Bcd(12));//data
Soft_i2c_write(Dec2Bcd(3));//mes
Soft_i2c_write(Dec2Bcd(13));//ano
Soft_i2c_stop();

}

//faz a leitura do ds1307
void ds1307_read(){
Soft_i2c_start();
Soft_i2c_write(0xD0);
Soft_i2c_write(0x00);
Soft_i2c_Start();
Soft_i2c_write(0xD1);
segundos = Bcd2Dec(Soft_i2c_read(1));
minutos = Bcd2Dec(Soft_i2c_read(1));
horas = Bcd2Dec(Soft_i2c_read(1));
dia = Bcd2Dec(Soft_i2c_read(1));
date = Bcd2Dec(Soft_i2c_read(1));
mes = Bcd2Dec(Soft_i2c_read(1));
ano = Bcd2Dec(Soft_i2c_read(0));
Soft_i2c_stop();
}

//Esta funcao cria um novo arquivo
void Create_New_File() {
  //cria o arquivo(caso nao exista) com atributo de arquivo e abre-o
  Mmc_Fat_Assign(&amp;filename, 0xA0);
  //define a data de criação do arquivo
  Mmc_Fat_Set_File_Date(ano+2000, mes, date, horas, minutos, segundos);
  Mmc_Fat_Append();//prepara o arquivo para gravação
  Mmc_Fat_Write(temp, 15);//escreve no arquivo
}

//Esta função deleta o arquivo
void Delete_File() {
  Mmc_Fat_Assign(&amp;filename, 0);
  Mmc_Fat_Delete();
}

short Test_File_Exist() {
  //como nao definiu nenhum atributo de criação, caso o arquivo exista 
  //retorna 1, caso contrario retorna 0
  return Mmc_Fat_Assign("DATA00.csv", 0);
}


//abre o arquivo(caso não exista, nao ira ler) e inicia a leitura.
void Open_File_Read() {
unsigned long i, size;
char caracter;
  Mmc_Fat_Assign(&amp;filename, 0);
  Mmc_Fat_Reset(&amp;size);//recupera o numero de caracteres do arquivo
  for (i = 1; i &lt;= size; i++) {
    Mmc_Fat_Read(&amp;caracter);// le um caracter do arquivo
    UART1_Write(caracter);
  }
}


void main()
{
short i;

ADC_Init();//inicia o modulo ADC
ADCON1 = 0B00001110; //define o canal 0 como analogico, o restante como digital.
Soft_i2c_init();//inicia a comunicação software i2c
//inicia a comunicação SPI
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
//inicia a comunicaçao com cartão SD
MMc_Fat_Init();

//verifica-se se o arquivo ja existe. caso exista cria um novo arquivo com um nome diferente
for(i=0;i&lt;100;i++)
{
 filename[4] = (i/10) + 48;
 filename[5] = (i%10) + 48;
 if(Mmc_Fat_Assign(&amp;filename, 0)==0)
 {
  break;
 }
}

while(1)
{
    adc = ADC_Read(0);
    adc = adc * 1000/204;
    temp[9] = (adc/1000) + 48;
    temp[10] = ((adc%1000)/100) + 48;
    temp[11] = (((adc%1000)%100)/10) + 48;
    temp[13] = (((adc%1000)%100)%10) + 48;

    ds1307_read();

    temp[0] = horas/10 + 48;
    temp[1] = horas%10 + 48;
    temp[3] = minutos/10 + 48;
    temp[4] = minutos%10 + 48;
    temp[6] = segundos/10 + 48;
    temp[7] = segundos%10 + 48;

    Create_New_File();
    
    delay_ms(500);
}
}