Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.04 KB | None | 0 0
  1. #define PROCESSING_VISUALIZER 1
  2. #define SERIAL_PLOTTER  2
  3.  
  4. #include <LiquidCrystal.h>
  5.  
  6. LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
  7.  
  8. int pulsePin = 0;                 // контакт провода данных на A0
  9.  
  10. volatile int BPM;                   // удары в минуту
  11. volatile int Signal;                // входной сигнал
  12. volatile int IBI = 600;             // интервал между ударами
  13. volatile boolean Pulse = false;     // обнаружено ли сердцебиение
  14. volatile boolean QS = false;
  15.  
  16. volatile int rate[10];                    // IBI
  17. volatile unsigned long sampleCounter = 0;          // определить синхронизацию импульсов
  18. volatile unsigned long lastBeatTime = 0;           // IBI
  19. volatile int P =512;                      // пик в пульсовой волне
  20. volatile int T = 512;                     // яма в пульсовой волне
  21. volatile int thresh = 530;                // поиск момента сердца, seeded
  22. volatile int amp = 0;                   // амплитуда, seeded
  23. volatile boolean firstBeat = true;      
  24. volatile boolean secondBeat = false;      
  25.  
  26.  
  27. void interruptSetup(){  
  28.   TCCR2A = 0x02;     // CTC
  29.   TCCR2B = 0x06;     // F/256
  30.   OCR2A = 0x7C;      // 124 (500Hz)
  31.   TIMSK2 = 0x02;     // прерывание по совпадению
  32.   sei();
  33. }
  34.  
  35. ISR(TIMER2_COMPA_vect){                        
  36.   cli();                                      
  37.   Signal = analogRead(pulsePin);              
  38.   sampleCounter += 2;                         // время в мс переведём с помощью этой переменной
  39.   int N = sampleCounter - lastBeatTime;       // Следить за временем с момента последнего удара, чтобы избежать шума
  40.  
  41.     //  Найти пик и впадину пульсовой волны
  42.   if(Signal < thresh && N > (IBI/5)*3){       // избегаем шума, выжидая 3/5 от последнего IBI
  43.     if (Signal < T){                        
  44.       T = Signal;                         // самая низкая точка в волне
  45.     }
  46.   }
  47.  
  48.   if(Signal > thresh && Signal > P){          // избегаем шума
  49.     P = Signal;                            
  50.   }                                        // самая высокая точка в волне
  51.  
  52.   // Считаем сердцебиение
  53.   // Сигнал возрастает по значению каждый раз, когда появляется импульс
  54.   if (N > 250){                                   // избегаем высокочастотных шумов
  55.     if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
  56.       Pulse = true;                               // Установить флаг Pulse, когда мы думаем, что есть импульс
  57.       IBI = sampleCounter - lastBeatTime;         // Измерьте время между ударами в мс
  58.       lastBeatTime = sampleCounter;               // Отслеживать время следующего импульса
  59.  
  60.       if(secondBeat){                        // Если это второй такт
  61.         secondBeat = false;                  
  62.         for(int i=0; i<=9; i++){            
  63.           rate[i] = IBI;
  64.         }
  65.       }
  66.  
  67.       if(firstBeat){                         // Если это первый такт
  68.         firstBeat = false;                  
  69.         secondBeat = true;                  
  70.         sei();                               // enable interrupts again
  71.         return;                              
  72.       }
  73.  
  74.  
  75.       // Сохранить текущую совокупность последних 10 значений IBI
  76.       word runningTotal = 0;                  
  77.  
  78.       for(int i=0; i<=8; i++){                // сдвигаем данные
  79.         rate[i] = rate[i+1];                  // И отбросить старое значение IBI
  80.         runningTotal += rate[i];              // Суммировать 9 самых старых значений IBI
  81.       }
  82.  
  83.       rate[9] = IBI;                          // Добавьте последний IBI в массив
  84.       runningTotal += rate[9];                // Добавьте последний IBI в runningTotal
  85.       runningTotal /= 10;                     // среднее
  86.       BPM = 60000/runningTotal;               // считаем УД/М
  87.       QS = true;                              
  88.     }
  89.   }
  90.  
  91.   if (Signal < thresh && Pulse == true){   // Когда значения падают, ритм заканчивается
  92.     Pulse = false;                        
  93.     amp = P - T;                           // амплитуда
  94.     thresh = amp/2 + T;                    // яма = 50% от амплитуды
  95.     P = thresh;                            
  96.     T = thresh;
  97.   }
  98.  
  99.   if (N > 2500){                           // если 2.5 секунды без биений
  100.     thresh = 530;                          //
  101.     P = 512;                               // всё по умолчанию
  102.     T = 512;                               //
  103.     lastBeatTime = sampleCounter;          
  104.     firstBeat = true;                      
  105.     secondBeat = false;                    
  106.   }
  107.  
  108.   sei();                                  
  109. }
  110.  
  111. volatile char firstStr[16] = {
  112.   0x42, // B
  113.   0x61, // a
  114.   0xC1, // ш
  115.   0x20, // _
  116.   0xBE, // п
  117.   0x79, // y
  118.   0xBB, // л
  119.   0xC4, // ь
  120.   0x63, // c
  121.   0x3A, // :
  122.   0x20, // _
  123.   0x20, // _
  124.   0x20, // _
  125.   0x20, // _
  126.   0x20, // _
  127.   0x20 // _
  128. };
  129.  
  130. volatile char secondStr[10] = {
  131.   0x20, // _
  132.   0x28, // (
  133.   0xA9, // У
  134.   0xE3, // д
  135.   0x2F, // /
  136.   0x4D, // M
  137.   0xB8, // и
  138.   0xBD, // н
  139.   0x29, // )
  140.   0x20 // _
  141. };
  142.  
  143. void setup(){
  144.   lcd.begin(16, 2);
  145.   lcd.clear();
  146.   lcd.print((char*)firstStr);
  147.   interruptSetup();
  148. }
  149.  
  150.  
  151. void loop(){
  152.  
  153.   lcd.setCursor(0, 1);
  154.   lcd.print(BPM);
  155.   lcd.print((char*)secondStr);
  156.  
  157.   delay(50);
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement