- Gerekli Bileşenler
- Darbe Sensörü SEN-11574
- PIC Mikrodenetleyici ile Darbe Sensörü arabirimi için Devre Şeması
- PIC16F877A Kalp Atışı Monitörü için Kod Açıklaması
Kalp atış hızı, herhangi bir kişinin sağlığının izlenmesinde en önemli parametredir. Giyilebilir cihazların modern çağında kalp atışını, kan basıncını, ayak seslerini, yakılan kalorileri ve daha pek çok şeyi ölçebilen birçok cihaz var. Bu cihazların içinde nabız hızını algılamak için nabız sensörü vardır. Bugün, dakikada kalp atışını saymak için PIC Mikrodenetleyicili bir nabız sensörü ve Atım Arası Aralığı kullanacağız, bu değerler 16x2 karakter LCD'de daha da gösterilecektir. Bu projede PIC16F877A PIC mikrodenetleyici kullanacağız. Hasta İzleme Sistemi için Arduino ile nabız sensörünü zaten arayüzledik.
Gerekli Bileşenler
- PIC16F877A mikrodenetleyici
- 20 Mhz Kristal
- 33pF kapasitör 2 adet
- 4.7k direnç 1 adet
- 16x2 Karakter LCD
- LCD'nin kontrast kontrolü için 10K pot
- SEN-11574 Nabız sensörü
- Velcro kayış
- 5V Güç adaptörü
- Breadboard ve bağlantı telleri
Darbe Sensörü SEN-11574
Kalp atışını ölçmek için bir nabız sensörüne ihtiyacımız var. Burada, çevrimiçi veya çevrimdışı mağazalarda kolayca bulunabilen SEN-11574 nabız sensörünü seçtik. Üreticiden sağlanan örnek kodlar olduğu için bu sensörü kullandık, ancak bu bir Arduino kodu. Bu kodu PIC mikro denetleyicimiz için dönüştürdük.
Sensör gerçekten küçüktür ve kalp atışını kulak memesinde veya parmak ucunda okumak için mükemmeldir. Yuvarlak PCB tarafından 0,625 ”çapında ve 0,125” kalınlığındadır.
Bu sensör bir analog sinyal sağlar ve sensör 3V veya 5V ile çalıştırılabilir, sensörün akım tüketimi 4 mA'dır, bu da mobil uygulamalar için mükemmeldir. Sensör, ucunda 24 ”uzunluğunda bağlantı kablosu ve berg erkek başlığa sahip üç tel ile birlikte gelir. Ayrıca sensör, parmak ucuna takmak için Velcro Parmak Kayışı ile birlikte gelir.
Darbe Sensörü şeması da üretici tarafından sağlanır ve ayrıca sparkfun.com adresinde mevcuttur.
Sensör şeması, şematik diyagramda görülebilen optik kalp atış hızı sensörü, gürültü iptali RC devresi veya filtrelerden oluşur. Güvenilir yükseltilmiş analog çıkış için R2, C2, C1, C3 ve işlemsel yükseltici MCP6001 kullanılır.
Kalp Atışı İzleme için birkaç başka sensör vardır, ancak SEN-11574 nabız sensörü Elektronik projelerinde yaygın olarak kullanılmaktadır.
PIC Mikrodenetleyici ile Darbe Sensörü arabirimi için Devre Şeması
Burada nabız sensörünü mikrodenetleyici biriminin 2. pinine bağladık. Sensör analog verileri sağladığı için gerekli hesaplamaları yaparak analog verileri dijital sinyale dönüştürmemiz gerekiyor.
20Mhz kristal osilatör iki seramik 33pF kapasitörler mikrodenetleyici biriminin iki OSC pimleri arasında bağlanır. LCD Mikrodenetleyicinin RB iskelesinin karşısında bağlanır.
PIC16F877A Kalp Atışı Monitörü için Kod Açıklaması
Kod, yeni başlayanlar için biraz karmaşıktır. Üretici, SEN-11574 sensörü için örnek kodlar sağladı, ancak Arduino platformu için yazılmıştır. Mikroçipimiz olan PIC16F877A için hesaplamayı dönüştürmemiz gerekiyor. Bu projenin sonunda bir Gösteri Videosu ile kodun tamamı verilmektedir. Destekleyen C dosyaları buradan indirilebilir.
Kod akışımız nispeten basittir ve adımları bir anahtar durumu kullanarak yaptık. Üreticiye göre sensörden verileri 2 milisaniyede bir almamız gerekiyor. Bu nedenle, her 2 milisaniyede bir işlevi çalıştıracak bir zamanlayıcı kesinti hizmeti rutini kullandık.
Switch ifadesindeki kod akışımız şu şekilde olacaktır:
Durum 1: ADC'yi okuyun
Durum 2: Kalp Atışını ve IBI'yı Hesaplayın
Durum 3: Kalp atışını ve IBI'yı LCD'de gösterin
Durum 4: IDLE (Hiçbir şey yapmayın)
Zamanlayıcı kesme fonksiyonunun içinde, programın durumunu Durum 1 olarak değiştiriyoruz: ADC'yi her 2 milisaniyede bir okuyun.
Böylece, ana işlevde, program durumunu ve tüm anahtar durumlarını tanımladık.
void main () { system_init (); main_state = READ_ADC; while (1) { anahtar (ana_durum) { durum READ_ADC: { adc_value = ADC_Read (0); // 0, main_state = CALCULATE_HEART_BEAT kanal numarasıdır ; kırmak; } case CALCULATE_HEART_BEAT: { calculate_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; kırmak; } case SHOW_HEART_BEAT: { if (QS == true) {// Bir Kalp Atışı Bulundu // BPM ve IBI Belirlendi // Arduino bir kalp atışı bulduğunda "QS" doğru QS = false; // bir dahaki sefere Quantified Self bayrağını sıfırlayın // 0.9 daha iyi veri elde etmek için kullanıldı. gerçekte kullanılmamalıdır BPM = BPM * 0.9; IBI = IBI / 0.9; lcd_com (0x80); lcd_puts ("BPM: -"); lcd_print_number (BPM); lcd_com (0xC0); lcd_puts ("IBI: -"); lcd_print_number (IBI); } } main_state = IDLE; kırmak; IDLE vakası: { break; } varsayılan: { } } } }
PIC16F877A'nın iki donanım çevre birimini kullanıyoruz: Timer0 ve ADC.
Timer0.c dosyasının içinde, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Bu hesaplama, 2 milisaniye zamanlayıcı kesintisini sağlıyor. Hesaplama formülü
// TimerCountMax - (((gecikme (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Gördüğümüz Eğer timer_isr işlevi, bu IS-
void timer_isr () { main_state = READ_ADC; }
Bu işlevde program durumu her 2 ms'de bir READ_ADC olarak değiştirilir.
Daha sonra CALCULATE_HEART_BEAT işlevi Arduino örnek kodundan alınır.
void calculate_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // bu değişkenle mS cinsinden zamanı takip edin int N = sampleCounter - lastBeatTime; // gürültüyü önlemek için son vuruştan bu yana geçen süreyi izleyin // eğer nabız dalgasının tepe ve çukurunu bulun (Signal <eşik && N> (IBI / 5) * 3) {// 3/5 bekleyerek dikrotik gürültüden kaçının (Sinyal <T) {// T, çukur T = Sinyal ise son IBI'nın ; // nabız dalgasındaki en alçak noktayı takip edin } } …………. ………………………..
Ayrıca, kodun tamamı aşağıda verilmiştir ve yorumlarla iyi bir şekilde açıklanmıştır. Bu kalp atışı sensörü verileri buluta daha fazla yüklenebilir ve her yerden internet üzerinden izlenebilir, bu da onu IoT tabanlı Kalp Atışı İzleme sistemi yapar, daha fazlasını öğrenmek için bağlantıyı izleyin.
Bu PIC Nabız Sensörü Projesi için Destekleyici C dosyalarını buradan indirin.