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. (http://www.cncdesigner.com/wordpress/?p=3941)
#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);
}
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...
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?
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ı?
(http://www.cncdesigner.com/wordpress/wp-content/uploads/STM32F4.jpg)
http://www.direnc.net/ARDUINO-SD-CART-MODUL,PR-15543.html (http://www.direnc.net/ARDUINO-SD-CART-MODUL,PR-15543.html)
(http://www.direnc.net/modules/catalog/products/pr_01_15543_min.jpg?rev=1383144314)
Aceleniz yoksa 2 tanesi 1.77$ dan başlıyor...
http://www.ebay.com/sch/i.html?LH_FS=1&LH_BIN=1&_from=R40&_sacat=0&_nkw=sd+card+arduino+2+pcs&_sop=15 (http://www.ebay.com/sch/i.html?LH_FS=1&LH_BIN=1&_from=R40&_sacat=0&_nkw=sd+card+arduino+2+pcs&_sop=15)
Alternatif:
http://www.aremelektronik.net/SD-KART-MODUL,PR-848.html (http://www.aremelektronik.net/SD-KART-MODUL,PR-848.html)
Teşekkürler.
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