Відмінності між версіями «Аналоговий датчик вимірювання частоти пульсу»

Рядок 1: Рядок 1:
Шпакович Володимир
 
група КАс-41
 
  
== 10.6.17 ==
+
'''Pulse Sensor''' - це аналоговий датчик,дозволяє фіксувати пульс.
* Не зрозуміло (у першу чергу з назви статті), датчик дає можливість просто виявляти наявність пульсу, чи вимірювати частоту пульсу, чи будувати кардіограму...
+
[[File:frontback.png|right|250px|thumb|'''Вигляд датчика,спереду і ззаду]]
* Після воахування зауваження - до захисту. --[[Користувач:Shkod|Shkod]] ([[Обговорення користувача:Shkod|обговорення]]) 08:24, 10 червня 2017 (CEST)
+
 
 +
На датчику встановлені світлодіод і фотоприймач, розташовані так, що промінь світла випромінюється світлодіодом, потрапляє на фотоприймач тільки відбившись від перешкоди, яким повинна виступати подушечка пальця або мочка вуха.
 +
 
 +
=='''Загальні відомості'''==
 +
[[File:pidkl.jpg|right|250px|thumb|'''Підключення датчика з TFT дисплеєм]]
 +
 
 +
'''Живлення'''
 +
 
 +
Датчик може живитись від виводу 3,3В або 5В
 +
 
 +
'''Специфікація датчика'''
 +
* Вхідна напруга: 3 ... 5 В.
 +
* Струм: 5 мА, при Vcc = 5 В.
 +
* Габарити: O15 мм x 3 мм.
 +
* Вага: 1 м
 +
 
 +
'''Підключення'''
 +
 
 +
Вихід датчика підключається до будь-якого аналогового входу arduino. У комплекті є кабель для швидкого і зручного підключення.
 +
[[File:komplekt.jpg|right|250px|thumb|'''Вигляд датчика і його комплектуючих]]
 +
 
 +
'''Для роботи установки з датчиком,потрібно:'''
 +
* Arduino х 1шт.
 +
* TFT дисплей 2.8 - 320x240 х 1шт.
 +
* Датчик пульсу х 1шт.
 +
* Trema зуммер х 1шт.
 +
* Double Shield х 1шт.
 +
* Trema Shield х 1шт.
 +
 
 +
 
 +
'''Для реалізації проекту нам необхідно встановити бібліотеки:'''
 +
 
 +
*Бібліотека iarduino_SensorPulse для роботи з датчиком пульсу.
 +
*Бібліотека UTFT для роботи з кольоровими TFT дисплеями
 +
 
 +
=='''Принцип дії датчика фіксації пульсу'''==
 +
[[File:interface.png|right|250px|thumb|'''Інтерфейс роботи датчика на ПК]]
 +
Судини, наповнюючись кров'ю, змінюють свою оптичну щільність, що впливає на зміну кількості відбитого світла. Отже, при постійному рівні світлового потоку, випромінюваного світлодіодом, інтенсивність світла реєструється фотоприймачем, буде залежати від наповнюваності судин кров'ю.
 +
 
 +
Електрична схема датчика влаштована так, щоб реєструвати тільки динамічну зміну інтенсивності світлового потоку. При незмінному світловому потоці (незалежно від його інтенсивності), напруга на виході датчика знаходиться в районі половини напруги живлення. При зміні інтенсивності світлового потоку, напруга на виході датчика відхиляється від середнього значення, в сторону зменшення або збільшення, пропорційно зміні світлового потоку. Таким чином датчик не потребує підстроювання під кожну людину.
 +
 
 +
=='''Схема підключення'''==
 +
[[File:cxema.png|right|250px|thumb|'''Приклад електричної схеми підключення датчика]]
 +
TFT дисплей реалізований у вигляді shield і використовує наступні виводи arduino Uno: A0-A4 (управління), 2-9 (дані), 10-13 (SD-карта), живлення. Датчик пульсу підключається до аналогового входу A5. Trema зумер підключається до цифрового виводу 1. чином датчик не потребує підстроювання під кожну людину.
 +
 
 +
Так як цифровий вивід 1 є лінією TX шини UART, то при завантаженні скетчу буде чутний звук.
 +
 
 +
 
 +
 
 +
=='''Приклад програми'''==
 +
 
 +
// Підключаємо бібліотеки:
 +
#include <iarduino_SensorPulse.h> // підключаємо бібліотеку для роботи з датчиком пульсу
 +
#include <UTFT.h> // підключаємо бібліотеку для роботи з TFT дисплеями
 +
// Оголошуємо змінні і константи:
 +
extern uint8_t SmallFont [];
 +
extern uint8_t BigFont [];
 +
const uint16_t colorBG = VGA_BLACK; // колір фону
 +
const uint16_t colorGR = VGA_GREEN; // колір графіка
 +
const uint16_t colorCD = VGA_WHITE; // колір тексту і символу пульсу
 +
const uint16_t colorER = VGA_RED; // колір тексту про помилку
 +
      uint16_t graphY0; // положення попередньої точки графіка по осі Y
 +
      uint16_t graphY; // положення поточної точки графіка по осі Y
 +
      uint16_t graphX; // положення поточної точки графіка по осі X
 +
      uint16_t screenW; // ширина дисплея
 +
      uint16_t screenH; // висота дисплея
 +
UTFT myGLCD (TFT28UNO, A2, A1, A3, A4, A0); // підключаємо дисплей TFT28UNO
 +
iarduino_SensorPulse Pulse (A5,1); // підключаємо сенсор до 5 аналоговому входу, а зумер до 1 цифровому висновку
 +
void setup () {
 +
  Pulse.begin (); // ініціюємо сенсор
 +
  myGLCD.InitLCD (); // ініціюємо дисплей
 +
  myGLCD.clrScr (); // стираємо всю інформацію з дисплея
 +
  screenW = myGLCD.getDisplayXSize () - 1; // отримуємо ширину дисплея
 +
  screenH = myGLCD.getDisplayYSize () - 1; // отримуємо висоту дисплея
 +
}
 +
void loop () {
 +
// визначаємо координати поточної точки графіка
 +
  graphX ??++; if (graphX> = screenW) {graphX ??= 0;} // зрушуємо точку графіка по осі X
 +
  graphY = map (Pulse.check (ISP_ANALOG), 1024,0,0, screenH); // визначаємо точку графіка по осі Y
 +
// якщо стан сенсора змінилося, то ...
 +
  if (Pulse.check (ISP_VALID) == ISP_CHANGED) {
 +
    myGLCD.clrScr (); // стираємо всю інформацію з дисплея
 +
    graphX ??= 0; // скидаємо координату поточної точки по осі X
 +
  }
 +
// якщо сенсор підключений, то ...
 +
  if (Pulse.check (ISP_VALID) == ISP_CONNECTED) {
 +
// виводимо графік
 +
                                  myGLCD.setColor (colorBG); myGLCD.drawLine (graphX, 30, graphX, screenH);
 +
      if (graphX> 0) {myGLCD.setColor (colorGR); myGLCD.drawLine (graphX, graphY0, graphX, graphY);
 +
                                  myGLCD.setColor (colorGR); myGLCD.drawLine (graphX-1, graphY0-1, graphX-1, graphY-1); // товщають лінію
 +
      }
 +
// виводимо пульс і серце
 +
    if (Pulse.check (ISP_BEEP) == 0) {myGLCD.setColor (colorCD); myGLCD.fillCircle (20, 20, 4);}
 +
    if (Pulse.check (ISP_BEEP) == 1) {myGLCD.setColor (colorBG); myGLCD.fillCircle (20, 20, 4);}
 +
    if (Pulse.check (ISP_BEEP) == 2) {myGLCD.setColor (colorCD); myGLCD.setFont (SmallFont); myGLCD.printNumI (Pulse.check (ISP_PULSE), 24,16,3);}
 +
// інакше, якщо сенсор відключений, то виводимо повідомлення про помилку
 +
  } Else {myGLCD.setColor (colorER); myGLCD.setFont (BigFont); myGLCD.print ( "DISCONNECTED", CENTER, 100);}
 +
// присвоюємо координату поточної точки графіка, координаті попередньої точки
 +
  graphY0 = graphY;
 +
  delay (5);
 +
}
 +
<Span class = "redactor-invisible-space"> / * опис функції check () бібліотеки iarduino_SensorPulse
 +
* Pulse.check (ISP_ANALOG); - повертає число від 0 до 1024 - дані з аналогового входу, до якого підключений датчик
 +
* Pulse.check (ISP_PULSE); - повертає число від 0 до 999 - пульс (кількість пульсацій за хвилину)
 +
* Pulse.check (ISP_BEEP); - повертає число від 0 до 2621 - кількість десятих часток секунди, що минув після останнього піку пульсу
 +
* Pulse.check (ISP_VALID); - повертає стан датчика - ISP_DISCONNECTED - відключений (дані не відповідають пульсу)
 +
* ISP_CONNECTED - підключений (дані схожі на пульс)
 +
* ISP_CHANGED - стан сенсора змінилося підключений на відключений або навпаки)
 +
* / </ Span>
 +
 
 +
=='''Алгоритм роботи'''==
 +
 
 +
На початку коду:
 +
 
 +
    *підключаються бібліотеки: iarduino_SensorPulse і UTFT;
 +
    *підключаються шрифти: SmallFont і BigFont для виведення тексту на TFT дисплей;
 +
    *створюються константи: colorBG, colorGR, colorCD, colorER, яким присвоюються кольору в форматі RGB565;
 +
    *створюються змінні, для виведення графіка: graphY0, graphY, graphX, screenW і screenH;
 +
    *створюються об'єкти бібліотек: myGLCD - для роботи з дисплеєм і Pulse - для роботи з датчиком пульсу.
 +
 
 +
У функції setup:
 +
 
 +
    *ініціюємо дисплей і датчик пульсу;
 +
    *стираємо всю інформацію з дисплея;
 +
    *зберігаємо ширину і висоту дисплея в змінні screenW і screenH, віднімаючи по одиниці з кожного параметра, так як координати для графічних функцій починаються з 0, а не з 1.
 +
 
 +
У функції loop:
 +
 
 +
    *визначаємо координати кінцевої точки графіка: graphX, graphY;
 +
    *якщо сенсор підключений, то виводимо графік і показання пульсу;
 +
    *якщо сенсор відключений, то виводимо повідомлення "DISCONNECTED";
 +
    *якщо сенсор змінив свій стан (з підключений на відключений або навпаки), то стираємо всю інформацію з дисплея;
 +
    *в кінці коду встановлюється затримка на 5 мс., чим більше значення затримки, тим більше пульсацій вміститься на графіку.
 +
 
 +
=='''Робота з даними'''==
 +
 
 +
'''Прийом даних'''
 +
 
 +
Дані датчика пульсу повертає функція check () бібліотеки iarduino_SensorPulse, яка приймає в якості аргументу 1 з 4 параметрів: ISP_ANALOG, ISP_PULSE, ISP_BEEP, ISP_VALID.
 +
 
 +
    *Pulse.check (ISP_ANALOG); - повертає число від 0 до 1024 - дані з аналогового входу, до якого підключений датчик;
 +
    *Pulse.check (ISP_PULSE); - повертає число від 0 до 999 - пульс (кількість пульсацій за хвилину);
 +
    *Pulse.check (ISP_BEEP); - повертає число від 0 до 2621 - кількість десятих часток секунди, що минув після останнього піку пульсу;
 +
    *Pulse.check (ISP_VALID); - повертає стан датчика - ISP_CONNECTED, ISP_DISCONNECTED, ISP_CHANGED:
 +
        ISP_CONNECTED - підключений (дані схожі на пульс);
 +
        ISP_DISCONNECTED - відключений (дані не відповідають пульсу);
 +
        ISP_CHANGED - стан сенсора змінилося (з підключений на відключений або навпаки)
 +
 
 +
'''Вивід даних'''
 +
 
 +
*Графік виводиться промальовуванням ліній від попередньої (graphX-1, graphY0), до поточної (graphX, graphY) точки.
 +
        Координата graphX ??зсувається від 0 до screenW, при кожному циклі loop.
 +
        Координата graphY число повернене функцією Pulse.check (ISP_ANALOG) і перетворене функцією map () від діапазону 1024-0 до діапазону 0-screenH;
 +
        Координата graphY0 відповідає значенню graphY попереднього циклу loop.
 +
        Перед промальовуванням ліній графіка, виводиться чорна вертикальна лінія, що пере точку попереднього графіка.
 +
*Символ пульсу (білий круг) виводиться і стирається через певний проміжок часу після фіксації пульсу.
 +
        якщо Pulse.check (ISP_BEEP) == 0 (пульс тільки що зафіксований), то виводимо білий зафарбований круг.
 +
        якщо Pulse.check (ISP_BEEP) == 1 (після фіксації пульсу пройшла 0,1 сек), то зафарбовує білий круг, чорним кругом.
 +
*Значення пульсу повертається функцією Pulse.check (ISP_PULSE) і виводиться на дисплей через 0,2 сек після фіксації пульсу Pulse.check (ISP_BEEP) == 2.
 +
 
 +
=='''Перелік посилань'''==
 +
 
 +
* [http://lesson.iarduino.ru/page/urok-27-pulsometr/ '''Pulse Sensor-підключення і програмування''']
 +
* [http://iarduino.ru/shop/Sensory-Datchiki/datchik-pulsa.html '''Pulse Sensor-характеристики''']
 +
* [http://arduino-project.net/'''Загальна інформація по Arduino''']

Версія за 12:22, 10 червня 2017

Pulse Sensor - це аналоговий датчик,дозволяє фіксувати пульс.

Вигляд датчика,спереду і ззаду

На датчику встановлені світлодіод і фотоприймач, розташовані так, що промінь світла випромінюється світлодіодом, потрапляє на фотоприймач тільки відбившись від перешкоди, яким повинна виступати подушечка пальця або мочка вуха.

Загальні відомості

Підключення датчика з TFT дисплеєм

Живлення

Датчик може живитись від виводу 3,3В або 5В

Специфікація датчика

  • Вхідна напруга: 3 ... 5 В.
  • Струм: 5 мА, при Vcc = 5 В.
  • Габарити: O15 мм x 3 мм.
  • Вага: 1 м

Підключення

Вихід датчика підключається до будь-якого аналогового входу arduino. У комплекті є кабель для швидкого і зручного підключення.

Вигляд датчика і його комплектуючих

Для роботи установки з датчиком,потрібно:

  • Arduino х 1шт.
  • TFT дисплей 2.8 - 320x240 х 1шт.
  • Датчик пульсу х 1шт.
  • Trema зуммер х 1шт.
  • Double Shield х 1шт.
  • Trema Shield х 1шт.


Для реалізації проекту нам необхідно встановити бібліотеки:

  • Бібліотека iarduino_SensorPulse для роботи з датчиком пульсу.
  • Бібліотека UTFT для роботи з кольоровими TFT дисплеями

Принцип дії датчика фіксації пульсу

Інтерфейс роботи датчика на ПК

Судини, наповнюючись кров'ю, змінюють свою оптичну щільність, що впливає на зміну кількості відбитого світла. Отже, при постійному рівні світлового потоку, випромінюваного світлодіодом, інтенсивність світла реєструється фотоприймачем, буде залежати від наповнюваності судин кров'ю.

Електрична схема датчика влаштована так, щоб реєструвати тільки динамічну зміну інтенсивності світлового потоку. При незмінному світловому потоці (незалежно від його інтенсивності), напруга на виході датчика знаходиться в районі половини напруги живлення. При зміні інтенсивності світлового потоку, напруга на виході датчика відхиляється від середнього значення, в сторону зменшення або збільшення, пропорційно зміні світлового потоку. Таким чином датчик не потребує підстроювання під кожну людину.

Схема підключення

Приклад електричної схеми підключення датчика

TFT дисплей реалізований у вигляді shield і використовує наступні виводи arduino Uno: A0-A4 (управління), 2-9 (дані), 10-13 (SD-карта), живлення. Датчик пульсу підключається до аналогового входу A5. Trema зумер підключається до цифрового виводу 1. чином датчик не потребує підстроювання під кожну людину.

Так як цифровий вивід 1 є лінією TX шини UART, то при завантаженні скетчу буде чутний звук.


Приклад програми

// Підключаємо бібліотеки:
#include <iarduino_SensorPulse.h> // підключаємо бібліотеку для роботи з датчиком пульсу
#include <UTFT.h> // підключаємо бібліотеку для роботи з TFT дисплеями
// Оголошуємо змінні і константи:
extern uint8_t SmallFont [];
extern uint8_t BigFont [];
const uint16_t colorBG = VGA_BLACK; // колір фону
const uint16_t colorGR = VGA_GREEN; // колір графіка
const uint16_t colorCD = VGA_WHITE; // колір тексту і символу пульсу
const uint16_t colorER = VGA_RED; // колір тексту про помилку
      uint16_t graphY0; // положення попередньої точки графіка по осі Y
      uint16_t graphY; // положення поточної точки графіка по осі Y
      uint16_t graphX; // положення поточної точки графіка по осі X
      uint16_t screenW; // ширина дисплея
      uint16_t screenH; // висота дисплея
UTFT myGLCD (TFT28UNO, A2, A1, A3, A4, A0); // підключаємо дисплей TFT28UNO
iarduino_SensorPulse Pulse (A5,1); // підключаємо сенсор до 5 аналоговому входу, а зумер до 1 цифровому висновку
void setup () {
  Pulse.begin (); // ініціюємо сенсор
  myGLCD.InitLCD (); // ініціюємо дисплей
  myGLCD.clrScr (); // стираємо всю інформацію з дисплея
  screenW = myGLCD.getDisplayXSize () - 1; // отримуємо ширину дисплея
  screenH = myGLCD.getDisplayYSize () - 1; // отримуємо висоту дисплея
}
void loop () {
// визначаємо координати поточної точки графіка
  graphX ??++; if (graphX> = screenW) {graphX ??= 0;} // зрушуємо точку графіка по осі X
  graphY = map (Pulse.check (ISP_ANALOG), 1024,0,0, screenH); // визначаємо точку графіка по осі Y
// якщо стан сенсора змінилося, то ...
  if (Pulse.check (ISP_VALID) == ISP_CHANGED) {
    myGLCD.clrScr (); // стираємо всю інформацію з дисплея
    graphX ??= 0; // скидаємо координату поточної точки по осі X
  }
// якщо сенсор підключений, то ...
  if (Pulse.check (ISP_VALID) == ISP_CONNECTED) {
// виводимо графік
                                 myGLCD.setColor (colorBG); myGLCD.drawLine (graphX, 30, graphX, screenH);
      if (graphX> 0) {myGLCD.setColor (colorGR); myGLCD.drawLine (graphX, graphY0, graphX, graphY);
                                 myGLCD.setColor (colorGR); myGLCD.drawLine (graphX-1, graphY0-1, graphX-1, graphY-1); // товщають лінію
      }
// виводимо пульс і серце
    if (Pulse.check (ISP_BEEP) == 0) {myGLCD.setColor (colorCD); myGLCD.fillCircle (20, 20, 4);}
    if (Pulse.check (ISP_BEEP) == 1) {myGLCD.setColor (colorBG); myGLCD.fillCircle (20, 20, 4);}
    if (Pulse.check (ISP_BEEP) == 2) {myGLCD.setColor (colorCD); myGLCD.setFont (SmallFont); myGLCD.printNumI (Pulse.check (ISP_PULSE), 24,16,3);}
// інакше, якщо сенсор відключений, то виводимо повідомлення про помилку
  } Else {myGLCD.setColor (colorER); myGLCD.setFont (BigFont); myGLCD.print ( "DISCONNECTED", CENTER, 100);}
// присвоюємо координату поточної точки графіка, координаті попередньої точки
  graphY0 = graphY;
  delay (5);
}
 / * опис функції check () бібліотеки iarduino_SensorPulse
* Pulse.check (ISP_ANALOG); - повертає число від 0 до 1024 - дані з аналогового входу, до якого підключений датчик
* Pulse.check (ISP_PULSE); - повертає число від 0 до 999 - пульс (кількість пульсацій за хвилину)
* Pulse.check (ISP_BEEP); - повертає число від 0 до 2621 - кількість десятих часток секунди, що минув після останнього піку пульсу
* Pulse.check (ISP_VALID); - повертає стан датчика - ISP_DISCONNECTED - відключений (дані не відповідають пульсу)
* ISP_CONNECTED - підключений (дані схожі на пульс)
* ISP_CHANGED - стан сенсора змінилося (з підключений на відключений або навпаки)
* / </ Span>

Алгоритм роботи

На початку коду:

   *підключаються бібліотеки: iarduino_SensorPulse і UTFT;
   *підключаються шрифти: SmallFont і BigFont для виведення тексту на TFT дисплей;
   *створюються константи: colorBG, colorGR, colorCD, colorER, яким присвоюються кольору в форматі RGB565;
   *створюються змінні, для виведення графіка: graphY0, graphY, graphX, screenW і screenH;
   *створюються об'єкти бібліотек: myGLCD - для роботи з дисплеєм і Pulse - для роботи з датчиком пульсу.

У функції setup:

   *ініціюємо дисплей і датчик пульсу;
   *стираємо всю інформацію з дисплея;
   *зберігаємо ширину і висоту дисплея в змінні screenW і screenH, віднімаючи по одиниці з кожного параметра, так як координати для графічних функцій починаються з 0, а не з 1.

У функції loop:

   *визначаємо координати кінцевої точки графіка: graphX, graphY;
   *якщо сенсор підключений, то виводимо графік і показання пульсу;
   *якщо сенсор відключений, то виводимо повідомлення "DISCONNECTED";
   *якщо сенсор змінив свій стан (з підключений на відключений або навпаки), то стираємо всю інформацію з дисплея;
   *в кінці коду встановлюється затримка на 5 мс., чим більше значення затримки, тим більше пульсацій вміститься на графіку.

Робота з даними

Прийом даних

Дані датчика пульсу повертає функція check () бібліотеки iarduino_SensorPulse, яка приймає в якості аргументу 1 з 4 параметрів: ISP_ANALOG, ISP_PULSE, ISP_BEEP, ISP_VALID.

   *Pulse.check (ISP_ANALOG); - повертає число від 0 до 1024 - дані з аналогового входу, до якого підключений датчик;
   *Pulse.check (ISP_PULSE); - повертає число від 0 до 999 - пульс (кількість пульсацій за хвилину);
   *Pulse.check (ISP_BEEP); - повертає число від 0 до 2621 - кількість десятих часток секунди, що минув після останнього піку пульсу;
   *Pulse.check (ISP_VALID); - повертає стан датчика - ISP_CONNECTED, ISP_DISCONNECTED, ISP_CHANGED:
       ISP_CONNECTED - підключений (дані схожі на пульс);
       ISP_DISCONNECTED - відключений (дані не відповідають пульсу);
       ISP_CHANGED - стан сенсора змінилося (з підключений на відключений або навпаки)

Вивід даних

  • Графік виводиться промальовуванням ліній від попередньої (graphX-1, graphY0), до поточної (graphX, graphY) точки.
       Координата graphX ??зсувається від 0 до screenW, при кожному циклі loop.
       Координата graphY число повернене функцією Pulse.check (ISP_ANALOG) і перетворене функцією map () від діапазону 1024-0 до діапазону 0-screenH;
       Координата graphY0 відповідає значенню graphY попереднього циклу loop.
       Перед промальовуванням ліній графіка, виводиться чорна вертикальна лінія, що пере точку попереднього графіка.
  • Символ пульсу (білий круг) виводиться і стирається через певний проміжок часу після фіксації пульсу.
       якщо Pulse.check (ISP_BEEP) == 0 (пульс тільки що зафіксований), то виводимо білий зафарбований круг.
       якщо Pulse.check (ISP_BEEP) == 1 (після фіксації пульсу пройшла 0,1 сек), то зафарбовує білий круг, чорним кругом.
  • Значення пульсу повертається функцією Pulse.check (ISP_PULSE) і виводиться на дисплей через 0,2 сек після фіксації пульсу Pulse.check (ISP_BEEP) == 2.

Перелік посилань