Konuyu Değerlendir
  • 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
ARDUİNO İLE ÖLÇÜLEN NABZIN ANALİZİ VE KİŞİNİN DOKTORUNA MAİL GÖNDERİLMESİ PROJESİ
#1
ARDUİNO İLE ÖLÇÜLEN NABZIN ANALİZİ VE KİŞİNİN DOKTORUNA MAİL GÖNDERİLMESİ PROJESİ

Kalbin kasılıp gevşeyerek damarlara yaptığı basınca kalp atışı denir.  Kalbin dakikadaki vuruş sayısına nabız denir. Nabız bilgisi bize kalp hızını ve kalp hızındaki düzensizlikleri gösterir. Nabız bir insanda ortalama 60 ile 100 arasındadır.
Projede Gerçekleştirilenler
Bu projede nabız ölçümü, ölçülen nabızların analizi ve grafiği elde edilir. Daha sonra elde edilen veriler mail ile doktora gönderilir. Böylece yaşı ilerlemiş kişilerde nabız takibi, ev ortamında kolayca yapılabilmektedir. Nabzın kolay ölçülebilmesi ve doktora kolaylıkla gönderilebilmesi nabız ölçme sayısının artmasına, bu artan sayı ile doktorun teşhisi doğru koyma olasılığı artmaktadır.
Projenin Amacı ve Hedef Kitlesi
Projenin hedef kitle yaşlı insanlar, şehirden uzak yerlerde yaşayan ve yol sıkıntısı sorunu çeken kişilerdir.  Büyükşehirlerin dışındaki illerde hastane sayısı ve doktor sayısı yeterli değildir. kişi nabız ölçümüne gittiğinde yoğunlukla karşılaşmaktadır. Normalde 5 dakika süren bu nabız işlemi, hastanede sıra bekleme süresi ve hastaneye gidiş geliş süreleri de eklenince günün büyük bir bölümünü kapsamaya başlar.  Ayrıca hastaneye giden bir kişinin hastalık kapma olasılığı vardır. Bu proje sayesinde ev ortamında sadece nabız ölçümü için süre harcanır. Bu sayede zamandan tasarruf edilir. Hastanelerde virüs kapma olasılığı yok olur ve bu projenin yaygınlaşması halinde hastanelerdeki yoğunlukta bir düşüş yaşanır. A şehrinde yaşayan bir kişi nabız verilerini dünyanın herhangi bir yerindeki doktora kolaylıkla ulaştırabilir ve yine bu nabız verilerini istediği doktora analiz ettirebilir.
Nabız bilgisinin gerekli olduğu durumlar aşağıda sıralanmıştır.
-Tanı işlemlerinden önce ve sonra
-Nabzı tetikleyen ilaçların kullanımından önce ve sonra
-Kalp krizi geçirmiş, kalp krizi geçirme olasılığı yüksek olan kişilerde ve Anjio olmuş kişilerde
-Kronik hastalığı olan kişilerde
-Yaşlılarda ve bebeklerde
Nabız bilgisi gereklidir.
Bu insanların evlerinden ya da iş yerlerinden hastanelere gitmesi çok vakit almaktadır. Düzenli ölçümün gerektirdiği durumlarda günün büyük bir bölümünü bu işlemler kapsamaktadır. Bu proje ile veriler ölçüldükten hemen sonra analiz edilir ve çizilen grafik ile birlikte hastanın doktoruna mail olarak gönderilir. Böylece veriler hem elektronik ortamda saklanmış olur hem de hasta hastaneye gitme durumundan kurtulmuş olur. Ve yine nabız takibi doktor tarafından daha hızlı bir şekilde takip edilmiş olur
Projede Kullanılan Malzemeler
Projede 1 adet arduino uno r3
1 adet pulse sensörü
Ve 1 adet arduino bilgisayar bağlantı kablosu kullanılmıştır.
Fritzing uygulamasında pulse sensör mevcut olmadığı için sembolik bir eleman kullanılmıştır. Aşağıda bağlantı şeması görülmektedir.[img=617x0]http://i2.wp.com/mekatronizm.com/wp-content/uploads/2016/04/1.png?resize=617%2C550[/img]
Pulse sensörün 3 bacağı vardır. Bunlar artı bacak, eksi bacak ve sensör bacağıdır. Sensör bacağı arduino nun A0 pinine bağlanmıştır. Artı bacak 5 volta , eksi bacak ise toprağa bağlanmıştır.
[img=731x0]http://i0.wp.com/mekatronizm.com/wp-content/uploads/2016/04/2-1.png?resize=860%2C645[/img]
Sensör Nasıl Çalışır
Nabız sensörü ışığın soğurulması mantığıyla çalışmaktadır. Sensörün ledinden çıkan ışınlar kanda bulunan hemoglobin ve hemoglobindeki oksijen moleküllerinin miktarına göre farklı dalga boylarında farklı şekilde soğurulurlar. Kanın pompalanma hızı hemoglobin miktarını dolayısıyla bu dalganın hızını belirler. Sensör bu dalga bilgisini arduinoya aktarır.
[img=496x0]http://i0.wp.com/mekatronizm.com/wp-content/uploads/2016/04/3.png?resize=496%2C379[/img]
Gelen bu dalga bilgisinin tepe değeri ve çukur değeri arduino tarafından yazılan algoritma ile algılanır. Tepe değerinden ve çukur değerine geçiş süresi bulunur ve böylece nabız ölçülmüş olur.
[img=635x0]http://i2.wp.com/mekatronizm.com/wp-content/uploads/2016/04/4-1.png?resize=635%2C191[/img]
Projenin İçeriği Ve Uygulamanın Tanıtımı
Arduino üzerinden hesaplanmış nabız değerleri visual studio programına aktarılır.visual studio uygulamasında  3 adet  form oluşturulmuştur. Birinci form nabız hakkında genel bilgileri ve projenin nasıl kullanılacağını anlatır. İkinci formda asıl işlemler yapılmaktadır. Bu formda arduinodan gelen nabız bilgilerinin gerçek zamanlı olarak grafiği çizilir ve nabız bilgileri kaydedilir. Üçüncü ve son fromda ise kaydedilmiş nabız bilgilerinin analizleri yapılır. Minumum nabız değeri, maksimum nabız değeri ve ortalama  nabız değeri hesaplanır  nabız verilerinin grafiği çizilir. Ve son olarak girilen mail adresine grafik ve  nabız bilgileri ile analiz edilmiş nabız bilgileri mail olarak gönderilir ve program sonlandırılır.
[img=731x0]http://i2.wp.com/mekatronizm.com/wp-content/uploads/2016/04/5.png?resize=860%2C677[/img]
Form 1 ekran görüntüsü
[img=731x0]http://i0.wp.com/mekatronizm.com/wp-content/uploads/2016/04/6.png?resize=860%2C497[/img]
Form 2 ekran görüntüsü
[img=731x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/7-1.png?resize=860%2C422[/img]
Form3 ekran görüntüsü
[img=731x0]http://i2.wp.com/mekatronizm.com/wp-content/uploads/2016/04/8.png?resize=860%2C199[/img]
Arduino Kodları
Not: İki kod yan sekmeler içindedir. İki kod aynı anda arduinoya gömülmektedir.


Kod:
//interrupt kodları


volatile int rate[10]; // 10 IBI değerini tutması için tanımlandı
volatile unsigned long sampleCounter = 0; // nabız süresinin hesaplanması için
volatile unsigned long lastBeatTime = 0; // IBI değerinin bulunması için
volatile int P =512; //nabız dalgasının tepe değerinin bulunmasında kullanılır.
volatile int T = 512; // nabız dalgasının çukur değerinin bulunmasında kullanılır.
volatile int thresh = 512; // kal atışı anını bulmada
volatile int amp = 100; // nabzın dalga genliğini bulmada
volatile boolean firstBeat = true; //
volatile boolean secondBeat = false; //


void interruptSetup(){
// timer 2 nin her 2 milisaniyede çalışmasını sağlar
TCCR2A = 0x02; //
TCCR2B = 0x06; //
OCR2A = 0X7C; //
TIMSK2 = 0x02; //
sei(); // interrup ı başlatır
}


 
2 her iki milisaniyede çalışır
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
cli(); // interrupt kapatılır
Signal = analogRead(pulsePin); // pulse sensör okunur
sampleCounter += 2; // zaman takibi için
int N = sampleCounter - lastBeatTime; // ekran zamanı, gürültüleri önlemek için

// nabız dalgasının tepe ve çukur değeri bulunur
if(Signal < thresh && N > (IBI/5)*3){ // gürültüyü önlemek için IBI nin 3/5 i kadar bekler
if (Signal < T){ // signal çukur değerinden küçükse
T = Signal; // nabız dalgasının çukur değeri atanır
}
}

if(Signal > thresh && Signal > P){ // gürültüyü önlemede yardımcı
P = Signal; // tepe değeri atanır
} //

// kalp atışı hesapları
// signal değerinde darbe olduğu zaman
if (N > 250){ // gürültüyü önlemede yardımcı
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
Pulse = true; // nabız değerinin olduğu varsayıldı
digitalWrite(blinkPin,HIGH); // 13. pini high yap
IBI = sampleCounter - lastBeatTime; // kalp atışları arasındaki zamanı milisaniye cinsinden ölçer
lastBeatTime = sampleCounter; // bir sonraki nabızlar arasındaki zamanı ölçebilmek için

if(secondBeat){ // ikinci atış if koşulu ile başlatılır
secondBeat = false; //
for(int i=0; i<=9; i++){ // IBI değerleri toplanır gerçekçi BPM değeri için
rate[i] = IBI;
}
}

if(firstBeat){ // ilk atış if koşulu ile başlatılır
firstBeat = false; //
secondBeat = true; //
sei(); // interrupt aktif edilir
return; // IBI değeri güvenilmez, bu yüzden atılır
}


// son 10 IBI değeri runningTotal değerine atılır
word runningTotal = 0; // clear the runningTotal variable

for(int i=0; i<=8; i++){ //
rate[i] = rate[i+1]; // eski IBI değeri bırakıldı
runningTotal += rate[i]; // 9 değer atandı
}

rate[9] = IBI; // son IBI değeri 9. indise atandı
runningTotal += rate[9]; // runningTotal değeri sürekli güncellenmiş olur, son değer atandı
runningTotal /= 10; // son 10 IBI değerinin ortalaması alındı
BPM = 60000/runningTotal; // dakikadaki atış sayısı hesabı. 60 saniye bir atış için geçen süreye bölünerek dakikadaki atış sayısı bulunur.
QS = true; // nabız değeri bulundu
//
}
}

if (Signal < thresh && Pulse == true){ // signal aşağıya düşmeye başladığı zaman atış biter
digitalWrite(blinkPin,LOW); // 13. pin low yapılır
Pulse = false; //
amp = P - T; // nabzın genliği hesaplanır
thresh = amp/2 + T; // tresh değerine genliğin yarısı eklenir
P = thresh; // gelecek işlemler için tepe ve çukur değerleri sıfırlanır
T = thresh;
}

if (N > 2500){ // eğer 2.5 saniye atış olmaz ise
thresh = 512; // thresh default olur
P = 512; // P default olur
T = 512; // T default olur
lastBeatTime = sampleCounter; // the lastBeatTime güncellenir
firstBeat = true; // gürültüyü önlemek için
secondBeat = false; //
}

sei(); // işlemler bittiğinde interrupt ı aktif et
}// end isr


Kod:
//pulse sensör kodu

int pulsePin = 0; //0. pin pulsepin e atandı
int blinkPin = 13; 13. pin atama işlemi
/*
* kodlarda volatile tanımlayıcısının kullanılmasının sebebi yapılan okuma yazma işlemlerinde optimize edilmesini sağlamaktır.
* Interrupt işleminde değiştirilen bir alan kesme dışındaki kodda okunuyorsa (ya da tam tersi) söz konusu
* alanın değeri programın çalışması süresince her an değişebilir. Derleyici bundan haberdar olmadığı için bir kere değeri
* okuyup/yazdıktan sonra tekrar aynı işlemi yapmayabilir. Bu gibi durumlarda bu yüzden volatilenin kullanılması gerekir.
*/

volatile int BPM; // nabız değişkeni tanımlandı
volatile int Signal; // ham değeri alan değişken tanımlandı
volatile int IBI = 600; // atım arasındaki aralık
volatile boolean Pulse = false; //pulse sensörü high olduğunda bu değer true olur
volatile boolean QS = false; // arduino nabzı bulduğunda true olur

void setup(){
Serial.begin(115200); // serial haberleşme başlatıldı.
interruptSetup(); // her 2 milisaniyede nabız değeri okuyan interrupt
}

void loop(){
if (QS == true) { // nabız bulunduğunda
Serial.println(BPM); // nabzı serial monitöre yazdır
QS = false; // bir sonraki nabza kadar hiçbir veri göndermemesi için false yapılır.
}
}

Visual Studio Form1 kaynak Kodu

Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication32
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int a = 0;
private void button1_Click(object sender, EventArgs e)
{
a++;
if(a==1)
{
pictureBox1.Visible = true;
label1.Visible = true;

richTextBox1.Visible = false;
label4.Visible = false;
pictureBox3.Visible = false;
label2.Visible = false;
richTextBox3.Visible = false;
label3.Visible = false;

}
if(a==2)
{
pictureBox1.Visible = false;
label1.Visible = false;
pictureBox3.Visible = true;
label2.Visible = true;
richTextBox1.Visible = false;
label4.Visible = false;


richTextBox3.Visible = false;
label3.Visible = false;
}
if(a==3)
{
pictureBox3.Visible = false;
label2.Visible = false;
richTextBox3.Visible = true;
label3.Visible = true;
richTextBox1.Visible = false;
label4.Visible = false;
pictureBox3.Visible = false;
label2.Visible = false;
pictureBox1.Visible = false;
label1.Visible = false;
}
if(a==4)
{
button2.Visible = false;
button1.Text = "nabız ölçümüne başla";
}
if(a==5)
{
Form2 yeni = new Form2();
this.Hide();
yeni.Show();
}
}

private void button2_Click(object sender, EventArgs e)
{
if (a &amp;gt; 0)
{
a--;

}
if (a==0)
{
pictureBox1.Visible = false;
label1.Visible = false;

richTextBox1.Visible = true;
label4.Visible = true;
pictureBox3.Visible = false;
label2.Visible = false;
richTextBox3.Visible = false;
label3.Visible = false;
}
if (a == 1)
{
pictureBox1.Visible = true;
label1.Visible = true;

richTextBox1.Visible = false;
label4.Visible = false;
pictureBox3.Visible = false;
label2.Visible = false;
richTextBox3.Visible = false;
label3.Visible = false;
}
if (a == 2)
{
pictureBox1.Visible = false;
label1.Visible = false;
pictureBox3.Visible = true;
label2.Visible = true;
richTextBox1.Visible = false;
label4.Visible = false;
richTextBox3.Visible = false;
label3.Visible = false;
}
if (a == 3)
{
pictureBox3.Visible = false;
label2.Visible = false;
richTextBox3.Visible = true;
label3.Visible = true;
richTextBox1.Visible = false;
label4.Visible = false;
pictureBox3.Visible = false;
label2.Visible = false;
pictureBox1.Visible = false;
label1.Visible = false;
}
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}

[b]Visual Studio Form2 Kaynak Kodu[/b]


Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Windows.Forms.DataVisualization.Charting;
using System.Threading;
namespace WindowsFormsApplication32
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
int a, b;
public int[] dizi = new int[100];
SerialPort arduino = new SerialPort();
Form3 ye = new Form3();

private void Form2_Load(object sender, EventArgs e)
{
comboBox1.DataSource = SerialPort.GetPortNames();
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
arduino.PortName = comboBox1.Text;
arduino.BaudRate = 115200;
arduino.Open();
MessageBox.Show("2 sanine sonra başlayacak");
Thread.Sleep(2000);
pictureBox1.Visible = true;
timer1.Start();
this.chart1.Titles.Add("Nabız Ölçümü");
}

private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void timer1_Tick(object sender, EventArgs e)
{
if(arduino.IsOpen)
{
string value = arduino.ReadLine();
string[] vec = value.Split();
label1.Text = vec[0];
a = int.Parse(label1.Text);

this.chart1.Series["Nabız"].Points.AddY(vec[0]);

if (b &amp;lt; 100 &amp;amp;&amp;amp; a&amp;gt;0)
{
dizi[b] = a;

listBox1.Items.Add(dizi[b]);

b++;

}
if (b == 100)
{
b++;


for(int i=0; i&amp;lt;100;i++)
{
ye.dizi2[i] = dizi[i];
}
MessageBox.Show("ölçüm işlemi bitti");
this.Hide();
ye.Show();

}

}
}
}
}
Bul
Alıntı


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  ARDUİNO VE MATLAB İLE MPU6050 KULLANIMI VE YÖNTEMLER Ken 0 822 19-05-2016, Saat: 09:57
Son Mesaj: Ken
  MIT APP INVERTOR & ARDUİNO İLE LED KONTROL ETME YÖNTEMİ Ken 0 465 19-05-2016, Saat: 09:55
Son Mesaj: Ken
  MIT APP INVERTOR VE ARDUİNO İLE SERVO MOTOR KONTROL ETME YÖNTEMİ Ken 0 491 19-05-2016, Saat: 09:53
Son Mesaj: Ken
  ARDUİNO İLE NOKİA 5110(PCD8544) GRAFİK LCD KULLANIMI VE GEREKLİ YÖNTEMLER Ken 0 667 19-05-2016, Saat: 09:52
Son Mesaj: Ken
  ARDUİNO KONTROLLÜ ÇİM SULAMA SİSTEMİ PROJESİ VE YÖNTEMLER Ken 0 493 19-05-2016, Saat: 09:51
Son Mesaj: Ken

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi
loading...