Forum: Diğer Konular RSS
Erken uyarı tahmin sistemi verileri nasıl kaydedelim
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Erken uyarı tahmin sistemi verileri nasıl kaydedelim
Dışarıdaki sıcaklık, nem gibi verileri kaydeden bir devre yapıyorum. Buna elektronik rasat istasyonu ya da basitçe iklim istasyonu diyebilirsiniz.

Ne yaptığına gelince örneğin 01 Ocak 2014 tarihinden itibaren sıcaklık verilerini kaydetmeye başlayacak. Belki 6 - 7 ay kadar bir süre kaydedecek. Bu süre zarfında günlük en yüksek, en düşük ve etkili sıcaklıklar toplamını kaydetmesini istiyoruz.

http://en.wikipedia.org/wiki/Growing-degree_day

Etkili sıcaklığı da şu şekilde hesaplıyoruz.

EtkiliSıcaklık = [(SıcaklıkEnYüksek + SıcaklıkEnDüşük) / 2] - SıcaklıkTaban

Burada taban sıcaklık değerimiz 10 °C.

Örneğin bir gün içinde en yüksek sıcaklık 23 °C ve en düşük sıcaklık 12 °C ise etkili sıcaklık katkısı 7.5 derece/gün olacak.

ES = [(23 - 12) / 2] - 10 = 7.5

Amacımız  bu etkili sıcaklıklar toplamı 250 derece/gün olduğunda bir uyarı vermek. 800 derece/gün olduğunda bir ikinci uyarı vermek.

Şimdi asıl soru bu sıcaklıkları nasıl kaydedelim. Şu anda bir SD karta sicaklik.txt isimli bir kütüğe bu şekilde kaydediyorum.


8/8/2013 1:44:59 25.39
8/8/2013 1:45:4 24.90
8/8/2013 1:45:9 24.90
8/8/2013 1:45:14 24.90
8/8/2013 1:45:19 25.39
8/8/2013 1:49:42 25.39
8/8/2013 1:49:47 24.90
8/8/2013 1:49:53 25.39
8/8/2013 1:49:58 25.39
8/8/2013 1:50:3 24.90
8/8/2013 1:50:8 24.90
8/8/2013 1:50:13 24.90
8/8/2013 1:50:18 25.39
8/8/2013 1:50:23 25.39
8/8/2013 1:50:28 25.39
8/8/2013 1:50:33 25.39
8/8/2013 1:50:38 25.39
8/8/2013 1:50:43 24.90
8/8/2013 1:50:48 25.39
8/8/2013 1:50:53 25.39

Yoksa her gün için ayrı bir kütük oluşturup o şekilde mi kaydetsek. Örneğin 882013.txt 982013.txt şeklinde. Ayrıca her 24 saatte en yüksek, en düşük ve etkin sıcaklıkların hepsini ayrı birer kütüğe kaydetmek sanırım daha mantıklı.

Programın kaynak kodu şu şekilde.

https://github.com/erdemoncel/arduino/blob/master/sdkart/v…

Ayrıca eğer devre şemasını merak eden arkadaşlar olursa paylaşabilirim. Devrede bir tane LCD ekran, DS1307 gerçek zamanlı saat, SD kart, LM35DZ sıcaklık ölçer ve Arduino kullanılıyor.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Farklı dosyalar belirli aylara veya günlere hızlıca erişmek gerektiğinde yararlı olurlar. Ne olursa olsun, veriyi yedeklemeyi unutma. ;)

Ayrıca, tarih konusunda ben büyük birimden küçük birime doğru gitmeyi çok kullanışlı buluyorum. Yani, hem dosya içinde hem de dosya isminde yıl-ay-gün olarak, ve tabii 0'larla doldurulmalı:

2013-08-08 01:45:04 24.90

Dosya ismi de aynı:

2013-08-08.txt

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kodlara bakacak vakit henüz bulamadım ama genel önerilerde bulunabilirim...

Öncelikle tek bir dosya kesinlikle tutma. Bu sana neye malolursa olsun (işlem hızı, depolama alanı), oluşabilecek olağan'üstü bir durumda tüm veriler kaybetmen olası. Mümkünse RS232 ile geçitini (port) de aç ki, ortadam PC ve internet bağlantısı varsa, arada güncel veriyi başka ortama çekebilmen (fetch) mümkün olsun.

Ayrıca mutlaka Watch Dog kur, çünkü kaydı etkileyecek herhangi bir olağanüstü durumda her şey yeniden başlayabilmeli. Tabi donanım bozulması durumunda uzaktan veya bizzat bir test düğmesi ile kontrol etmek de gerekiyor.

Bunlar dışında Ali hocamın ve senin dediklerine katılıyorum. Veriler büyükten küçüğe olmalı ve farklı dosyalara erişim olmalı. Ayrıca istatistiki açıdan, (örn. Excel ile) ileride değerlendirme yapılabilmesi için araları noktalı virgül ile ayrılmış (CSV format) biçimde bir ana dosya kayıt et; sonra yapılan hesaplamaların sonuçlarını da başka dosyaya...

Uyarma, her gün sonu yapılacağı için, o güne kadar kayıt edilen ölçümler tekrar hesaplanmadan toplamları alınması iyi olabilir. Çünkü henüz ilk günler (hesaplanmış değerler az olduğu için) sistem güzel çalışıyordur belki, ama sonra sistemde kararlılık (stability) düştüğün tüm verileri baştan sona hesaplamak sorunlara sebep olabilir. En basiti, sistem kilitlenmek üzeredir ve uzun süren bir işlemde göçmesi an meselesi olabilir.

Son olarak, dosyaları kayıt yapmadan evvel önce güncellenmiş (yeni veri eklenmiş) bir kopyasını kayıt etmeyi, sonra her şey yolundaysa (küçük bir test kodu işletilebilir) eski kopyayı yedek uzantılı olarak ismini değiştirip kopyayı da onunla yer değiştirmek akıllıca olacaktır. Yılın sonlarına doğru dosyalardan birinin kayıp edilmesini istemeyiz...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Gerek Ali beye gerekse Salihcime öneriler için teşekkürler.

En azından ne yapmam gerektiği konusunda kafamda bir fikir oluştu.

CSV biçeminde kaydetmek, gün sonu ölçümlerin sonuçlarının farklı dosyalara kaydedilmesi, verilerin büyükten küçüğe doğru sıralanması gibi önerileri aklımın bir tarafına not aldım.

Arduino'da RS232 seri iletişim portunu kullanmaya gerek kalmadan direkt olarak bilgisayarla USB kapısından seri iletişim yapabiliyoruz. Böyle bir güzelliği var. Ama ileride belki verileri göndermek için kablosuz iletişim, radyo dalgaları ile aktarma düşünülebilir. Ancak bunun için de iki tane Arduino gerekiyor. Bir de neredeyse şu an kullandığım Arduino Uno üzerinde neredeyse tüm giriş çıkış kapıları doldu.

Arduino için bekçi köpeği uygulaması var mı bilmiyorum açıkcası.

Ama şöyle bir şey var.
#include <avr/wdt.h>
 
void setup ()
{
    Serial.begin (115200);
    Serial.println ("Tekrar başlatıldı");
    wdt_enable (WDTO_1S)// eğer 'hav hav' sesi almazsan bir saniye sonra tekrar başlat
}
 
void loop ()
{
    Serial.println ("Döngüye girildi ...");
    wdt_reset ()// bana işleri tamamlamam için bir saniye daha ver (hav hav)
    while (true) ; // ops, döngüye girdik
}  // döngü sonu 

Burada eğer bekçi köpeğinden asayiş berkemal sinyali almazsa sistemi tekrardan başlatıyor.

Bu özelliği de yukardaki kodda kullandım. Örneğin bir enerji kesintisi oldu. Bunu denemek için USB kablosunu (aynı zamanda Arduino USB kablosundan besleniyor) çıkarttığımda SD kart üzerindeki verilerin üzerine yazmıyordu.

Bunu düzeltmek için eğer kod else bloğuna gelmişse sonsuz bir döngüye giriyor. Ve bu arada bekçi köpeğinden sinyal alamazsa program tekrar baştan başlıyor ve kaldığı yerden kütüğün üzerine verileri yazmaya devam ediyor.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 00:30:07 (UTC -08:00)