SD Card - Data Logger - Text File

Başlatan z, 22 Aralık 2013, 08:41:09

z

Asagidaki  program,  10 saniye araliklarla ADC olcumu yapip SD kart icinde olusturdugu OLCUMLER.TXT dosyasina 36 saatlik kayit yerlestiriyor. SD karti PC'ye taktiginizda notepad ile dogrudan dosyayi acabiliyorsunuz.

Detaylar ve  proje klasoru icin tiklayin.

#include "STM32F4xx.h" 
#include "Zystem.h"

int  Zaman, MaviZaman=0, KirmiziZaman=0, YesilZaman=0;
int  findex=0,KayitNo=0, sector=0;
char err, TimeFlag, FlashEnb=1;

//   Kirmizi Led hata oldugunu gosterir
//   Yesil Led, kayit yapilirken yanip soner
//   Mavi  Led, ADC olcumu yapildiginda yanip soner
//   Kavunici Led 36 saatlik kayidin bittigini gosterir

void BirMiliSaniye()
{
      Zaman++;                    // Her 10 sn de bir olcum yapilacak      
      if (Zaman==10000)           // 10000 milisaniyede bir sifirla          
        {
          Zaman=0;
          TimeFlag=1;
        }
        
      if (err) GPIOD->ODR=0x4000; // Kirmizi ledi yakarak hata oldugunu bildir  
      else 
        {   
          if(FlashEnb)
            {                     
              if (!YesilZaman){GPIOD->ODR^=0x1000; YesilZaman=250;} else YesilZaman--;
              if (MaviZaman)  {GPIOD->ODR|=0x8000; MaviZaman--;} else GPIOD->ODR&=~0x8000;
            }  
          else GPIOD->ODR&=~0x9000; // Islem bittiginde Yesil ve Mavi led sonuk kalsin
        }  
}

void Yaz(char Data)
{
int i;          
      File.Buffer[findex]=Data;
      findex++;
      if (findex==512)        // Ramdaki File Buffer alani 512 byte dir.
        {                     // 512 byte doldu ise verileri SD karta aktaralim 
          err=fwrite(&File,sector);
          sector++;                  
          findex=0;
          for(i=0;i<512;i++) File.Buffer[i]=0;        
        }
}

void CRLF() { Yaz(0x0D);Yaz(0x0A);}

void ASCIYaz(char Data) 
{
      Data&=0x0F; 
      if (Data<0xA) Data+=0x30; else Data+=0x37;
      Yaz(Data);    
}

void StringYaz(char* Text)
{
char *p;
          
     p=Text;
     CRLF();     
     while(*p) Yaz(*p++);
     CRLF();          
}

void DosyayaYaz(short Data)
{
      ASCIYaz(Data>>8);         
      ASCIYaz(Data>>4);         
      ASCIYaz(Data);         
      CRLF();    
      KayitNo++;                        // ADC den yapilan olcum sayaci          
}

int main()
{
          
//    SD kartin formatlanmasini istiyorsaniz SD kartta README.TXT dosyasini silin.
          
      if(fopen("README.TXT",&File,0)) err=format(&File); // 2 Gb SD kartinizi ilk kez kullanacaksaniz formatlanmali
      
      err=fopen("OLCUMLER.TXT",&File,1); // Olcumler.txt dosyasi yoksa yarat varsa ustune yazacagiz  
          
/*    Her bir ADC sonucu 0..FFF araliginda
      Fantazi olsun diye SD kartta bunu ASCI karakterlerle saklayalim.
      Her bir kayit 3 byte olur. CR-LF de ekleyince 5 byte olur.
      Tek bir dosyaya (64K alana) en fazla 13107 kayit sigdirabiliriz.
      10 sn de bir kayit yaparsak bu 131070 sn demektir. (36.4 saat)   
      36 saat boyunca yani 12960 kayit yapalim.*/                  

      while ((KayitNo<12960)&& (!err))    
        {
          TimeFlag=0;
          MaviZaman=50;                // Mavi led 50ms yansin
          DosyayaYaz(ADC1->DR);        // ADC den (PA1 ADCIN1) giris voltajini ogrenelim
          if(KayitNo==12960) StringYaz("Kayit islemi tamamlandi");                
          while(!TimeFlag)             // 10 saniyeyi beklerken kullanici mavi butona basarsa islemi bitirelim
            {
               if(GPIOA->IDR & 0x1)    // Mavi butona basilmismi?  
                 {
                   StringYaz("Kayit islemini durdurdunuz");        
                   KayitNo=12960;      // Ana donguyu kiralim
                   break;        
                 }          
            }                    
        } 

//    Islem bitti fakat Ramda kalmis veri varsa dosyaya yazalim
            
      if((!err)&&(findex)) err=fwrite(&File,sector);
            
      if(!err) GPIOD->ODR=0x2000;     // Kayit bitti, Kavunici ledi yakalim                 
      FlashEnb=0;
      while(1);                    
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

pisayisi

Hocam güzel çalışma olmuş teşekkürler. Özellikle adc nin ölçüm yapmadığı geniş zaman diliminde işlemciyi olabilcek en düşük güç moduna alıp ölçüm gerektiğinde uyandırmak ve sd cardı bu zaman diliminde beslemek batarya ile beslenecek sistemler için süper olur. Ancak discovery kit de bulunan stlink bölümünü devre dışı bırakarak o bölümün sürekligüç tüketmesini önlemek lazım.  Ben de usb otg özelliğinden dolayı flash diske datalog yapan bir alkalin pille en az bir sene çalışması garantili ,olabilcek en düşük güç modunu kullanan pekçok sensörden aldığı bilgiyi  log yapan bir proje üzerinde kafa yoruyorum bakalım ne olacak. Bu iş için aslında stm32l serisi çok daha uygun görünüyor , o kiti de bir ele geçirmek lazım...
Murat

z

#2
Aslinda amac "Data-Logger"dan ziyade file erisim isinin ne kadar kolaylastigini gostermek.

Bir de yazi yazdigim bir sitede bizim herzaman kullandigimiz SystemInit fonksiyonunu cok karmasik bulup begenmeyen birisi, insani ARM'dan ve C den sogutacaksin boyle fonksiyon mu yazilir seklinde yorum yapmisti. Kizmistim ama sonra da hak verip kutuphane kullanan orneklerimde SystemIniti kaldirip attim.

Program su haliyle daha sempatik gorunuyor. Ne dersin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Gökhan BEKEN

SD kart için modül önerisi olan var mı? Ben bir kaç yere baktım normal konnektörlerin hepsi farklı farklı, karar veremedim. Bu yüzden hazır modül almak istiyorum.
@z hocam bu modül Türkiye'de var mı?
Özel mesaj okumuyorum, lütfen göndermeyin.


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

blg_a

4 gb sd kart fat32 de kullandım, yeşil ışık yanıp yanıp sönüyor , dosya oluşturulmuyor sorun nereden olabilir?
yardımcı olursanız sevinirim