Max30100 giao tiếp ESP8266, Nhịp tim, Oxy + Blynk + Oled + ESP

cam-bien-nhip-tim-oxy-max30100-giao-tiep-arduino-hien-thi-lcd1602-app-blynk-4
Max30100 giao tiếp ESP8266 là dùng Cảm biến nhịp tim và oxy trong máu MAX30100 được sử dụng để đo nhịp tim và nồng độ Oxy trong máu, thích hợp cho nhiều ứng dụng liên quan đến y sinh, cảm biến sử dụng phương pháp đo quang phổ biến hiện nay với thiết kế và chất liệu mắt đo chuyên biệt từ chính hãng Maxim cho độ chính xác và độ bền cao, cảm biến sử dụng giao tiếp I2C với bộ thư viện sẵn có trên Arduino rất dễ sử dụng. Cảm biến nhịp tim MAX30100 được tích hợp 16-bit sigma delta ADC và bộ xử lý tín hiệu tương tự với độ nhiễu thấp giúp cảm biến hoạt động chính xác và ổn định cao. Đồng thời được thiết kế nhỏ gọn có thể sử dụng làm thiết bị đeo tay và dễ dàng giao tiếp với các MCU, Arduino và Raspberry Pi.   Liên hệ làm Đồ án và Mạch điện tử Phone : 0967.551.477 Zalo    : 0967.551.477 FB      : Huỳnh Nhật Tùng Email : dientunhattung@gmail.com Địa Chỉ: 171/25 Lê Văn Thọ, P8, Gò Vấp, Tp HCM Chi tiết: Nhận làm mạch và đồ án Điện tử
 

1. Linh kiện cần thiết làm mạch đọc nhịp tim và oxy Max30100 giao tiếp ESP8266

1.1 Vi điều khiển Arduino Uno trong mạch đọc nhịp tim và oxy Max30100 giao tiếp ESP8266

a. Giới thiệu

Kít ESP8266 là kít phát triển dựa trên nền chíp Wifi SoC ESP8266 với thiết kế dễ dàng sửa dụng vì tích hợp sẵn mạch nạp sử dụng chíp CP2102 trên borad. Bên trong ESP8266 có sẵn một lõi vi sử lý vì thế bạn có thể trực tiếp lập trình cho ESP8266 mà không cần thêm bất kì con vi sử lý nào nữa. Hiện tại có hai ngôn ngữ có thể lập trình cho ESP8266, sử dụng trực tiếp phần mềm IDE của Arduino để lập trình với bộ thư viện riêng hoặc sử dụng phần mềm node MCU NodeMCU ESP8266 Lua CP2102 là kit phát triển dựa trên nền chip Wifi SoC ESP8266 với thiết kế dễ sử dụng và đặc biệt là có thể sử dụng trực tiếp trình biên dịch của Arduino để lập trình và nạp code, điều này khiến việc sử dụng và lập trình các ứng dụng trên ESP8266 trở nên rất đơn giản. NodeMCU ESP8266 Lua CP2102 sử dụng chip nạp và giao tiếp UART mới và ổn định nhất là CP2102 có khả năng tự nhận Driver trên tất cả các hệ điều hành Window và Linux, đây là phiên bản nâng cấp từ các phiên bản sử dụng IC nạp giá rẻ CH340. NodeMCU ESP8266 Lua CP2102 đã được ra chân đầy đủ nhất trong các Version của ESP8266 với 9 chân GPIO , 1 chân ADC, 1 giao tiếp UART, 1 giao tiếp SPI và hỗ trợ PWM. cam-bien-do-am-nhiet-do-sht75-giao-tiep-esp8266-node-mcu-hien-thi-lcd1602

Tính năng khác

Vi xử lý có rất nhiều loại bắt đầu từ 4 bit cho đến 32 bit, vi xử lý 4 bit hiện nay không còn nhưng vi xử lý 8 bit vẫn còn mặc dù đã có vi xử lý 64 bit. Lý do sự tồn tại của vi xử lý 8 bit là phù hợp với một số yêu cầu điều khiển trong công nghiệp. Các vi xử lý 32 bit, 64 bit thường sử dụng cho các máy tính vì khối lượng dữ liệu của máy tính rất lớn nên cần các vi xử lý càng mạnh càng tốt. Các hệ thống điều khiển trong công nghiệp sử dụng các vi xử lý 8 bit hay 16 bit như hệ thống điện của xe hơi, hệ thống điều hòa, hệ thống điều khiển các dây chuyền sản xuất, … các ứng dụng của vi điều khiển

b. Chức năng của Arduino R3:

Chúng ta biết rằng ở mỗi chân trên vi điều khiển có thể thực hiện nhiều chức năng khác nhau,  NodeMCU có tổng cộng 13 chân GPIO tuy nhiên một số chân được dùng cho những mục đích quan trọng khác vì vậy chúng ta phải lưu ý khi sử dụng như sau:
  • Tất cả các GPIO đều có trở kéo lên nguồn bên trong (ngoại trừ GPIO16 có trở kéo xuống GND). Người dùng có thể cấu hình kích hoạt hoặc không kích hoạt trở kéo này.
  • GPIO1 và GPIO3: hai GPIO này được nối với TX và RX của bộ UART0, NodeMCU nạp code thông qua bộ UART này nên tránh sử dụng 2 chân GPIO này.
  • GPIO0, GPIO2, GPIO15: đây là các chân có nhiệm vụ cấu hình mode cho ESP8266 điều khiển quá trình nạp code nên bên trong NodeMCU (có tên gọi là strapping pins) có các trở kéo để định sẵn mức logic cho chúng như sau: GPIO0: HIGH, GPIO2: HIGH, GPIO15: LOW. Vì vậy khi muốn sử dụng các chân này ở vai trò GPIO cần phải thiết kế một nguyên lý riêng để tránh xung đột đến quá trình nạp code. Các bạn có thể tham khảo nguyên lý thiết kế mạch
  • GPIO9, GPIO10: hai chân này được dùng để giao tiếp với External Flash của ESP8266 vì vậy cũng không thể dùng được (đã test thực nghiệm).
Như vậy, các GPIO còn lại: GPIO 4, 5, 12, 13, 14, 16 có thể sử dụng bình thường. cam-bien-do-am-nhiet-do-sht75-giao-tiep-esp8266-node-mcu-hien-thi-lcd1602-1  

c.Thông số kỹ thuật ESP8266 Node MCU (Dip)

  • Chip: ESP8266EX SoC Wifi
  • Băng tần WiFi: 2.4 GHz chuẩn 802.11 b/g/n
  • Phiên bản firmware: NodeMCU V1.0
  • Điện áp hoạt động: 3.3V
  • Điện áp vào: 5V
  • Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire, trừ chân D0)
  • Số chân Analog Input: 1 (điện áp vào tối đa 3.3V)
  • Bộ nhớ Flash: 4MB
  • Chip giao tiếp UART: CP2102
  • Giao tiếp: Cable Micro USB
  • Hỗ trợ bảo mật: WPA/WPA2
  • Tích hợp giao thức TCP/IP
  • Lập trình trên các ngôn ngữ: C/C++, Micropython, NodeMCU – Lua

d. Power

  • LED: Có 1 LED được tích hợp trên bảng mạch và được nối vào chân D16. Khi chân có giá trị mức cao (HIGH) thì LED sẽ sáng và LED tắt khi ở mức thấp (LOW).
  • VIN: Chân này dùng để cấp nguồn ngoài (điện áp cấp từ 5VDC).
  • 3V3: Điện áp ra 3.3V (dòng điện trên mỗi chân này tối đa là 50mA).
  • GND: Là chân mang điện cực âm trên board.
  • IOREF: Điệp áp hoạt động của vi điều khiển trên ESP8266 và có thể đọc điện áp trên chân IOREF. Chân IOREF không dùng để làm chân cấp nguồn.

e.Bộ nhớ

Vi điều khiển ATmega328:
  • 32 KB bộ nhớ Plash: trong đó bootloader chiếm 0.5KB.
  • 2 KB cho SRAM: (Static Random Access Menory): giá trị các biến khai báo sẽ được lưu ở đây. Khai báo càng nhiều biến thì càng tốn nhiều bộ nhớ RAM. Khi mất nguồn dữ liệu trên SRAM sẽ bị mất.
  • 1 KB cho EEPROM: (Electrically Eraseble Programmable Read Only Memory): Là nơi có thể đọc và ghi dữ liệu vào đây và không bị mất dữ liệu khi mất nguồn.

f. Các chân đầu vào và đầu ra

Trên Board ESP8266 Node MCU có các chân Digital được sử dụng để làm chân đầu vào và đầu ra và chúng sử dụng các hàm pinMode(), digitalWrite(), digitalRead(). Giá trị điện áp trên mỗi chân là 5V, dòng trên mỗi chân là 20mA và bên trong có điện trở kéo lên là 20-50 ohm. Dòng tối đa trên mỗi chân I/O không vượt quá 40mA để tránh trường hợp gây hỏng board mạch. Ngoài ra, một số chân Digital có chức năng đặt biệt:
  • Serial: 0 (RX) và 1 (TX): Được sử dụng để nhận dữ liệu (RX) và truyền dữ liệu (TX) TTL.
  • PWM: Từ D1 – D7 đều có chức năng PWM.
  • SPI:  D7 (MOSI), D6 (MISO), D5 (SCK). Các chân này hỗ trợ giao tiếp SPI bằng thư viện SPI.
  • LED: Có 1 LED được tích hợp trên bảng mạch và được nối vào chân D0. Khi chân có giá trị mức cao (HIGH) thì LED sẽ sáng và LED tắt khi ở mức thấp (LOW).
  • TWI/I2C: D2 (SDA) và D1 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.

g. Các chân không khởi động được khi

Chân ký hiệu thực tếChân GPIOKhông cho phép khi khởi động
D0GPIO16Lỗi nếu kéo xuống thấp
D3GPIO0Lỗi nếu kéo xuống thấp
D4GPIO2Lỗi khi kéo xuống thấp
D8GPIO15Lỗi khi kéo lên cao

1.2 Cảm biến nhịp tim và nồng độ Oxy Max30100 giao tiếp ESP8266

a. Giới thiệu cảm biến Max30100 giao tiếp ESP8266

Cảm biến nhịp tim và oxy trong máu MAX30100 được sử dụng để đo nhịp tim và nồng độ Oxy trong máu, thích hợp cho nhiều ứng dụng liên quan đến y sinh, cảm biến sử dụng phương pháp đo quang phổ biến hiện nay với thiết kế và chất liệu mắt đo chuyên biệt từ chính hãng Maxim cho độ chính xác và độ bền cao, cảm biến sử dụng giao tiếp I2C với bộ thư viện sẵn có trên Arduino rất dễ sử dụng. Cảm biến nhịp tim MAX30100 được tích hợp 16-bit sigma delta ADC và bộ xử lý tín hiệu tương tự với độ nhiễu thấp giúp cảm biến hoạt động chính xác và ổn định cao. Đồng thời được thiết kế nhỏ gọn có thể sử dụng làm thiết bị đeo tay và dễ dàng giao tiếp với các MCU, Arduino và Raspberry Pi. cam-bien-nhip-tim-oxy-max30100-giao-tiep-arduino-hien-thi-lcd1602-app-blynk-2

b. Thông số kỹ thuật cảm biến Max30100

  • Đèn LED tích hợp
  • Nhỏ gọn 5,6mm x 2,8mm x 1,2mm được cải tiến về mặt quang học
  • Hoạt động năng lượng thấp, tăng tuổi thọ pin cho các thiết bị đeo được
  • Tốc độ mẫu có thể lập trình và dòng điện LED cho tiết kiệm điện
  • Dòng tắt máy cực thấp (0,7μA, typ)
  • Chức năng nâng cao cải thiện hiệu suất đo lường
  • SNR cao cung cấp khả năng phục hồi chuyển động mạnh mẽ
  • Tích hợp hủy ánh sáng xung quanh
  • Khả năng tỷ lệ mẫu cao
  • Khả năng xuất dữ liệu nhanh
  • Điện áp: 3.3VDC
  • IC chính: MAX30100
  • Giao tiếp: I2C, mức tín hiệu TTL

1.3 Oled cho mạch đọc nhịp tim và oxy Max30100 giao tiếp ESP8266

a. Giới thiệu

Màn hình Oled 1.3 inch giao tiếp I2C cho khả năng hiển thị đẹp, sang trọng, rõ nét vào ban ngày và khả năng tiết kiệm năng lượng tối đa với mức chi phí phù hợp, màn hình sử dụng giao tiếp I2C cho chất lượng đường truyền ổn định và rất dễ giao tiếp chỉ với 2 chân GPIO. Màn hình OLED SH1106 với kích thước 1.3 inch, cho khả năng hiển thị hình ảnh tốt với khung hình 128×64 pixel. Ngoài ra, màn hình còn tương thích với hầu hết các vi điều khiển hiện nay thông qua giao tiếp SPI. Màn hình sử dụng driver SH1106 cùng thiết kế nhỏ gọn sẽ giúp bạn phát triển các sản phẩm DIY hoặc các ứng dụng khác một cách nhanh chóng. màn hình oled 1.3in chuẩn i2c

Màn hình Oled chuẩn truyền I2C

màn hình oled chuẩn truyền SPI

Màn hình Oled chuẩn truyền SPI

b. Thông số kỹ thuật

  • Điện áp sử dụng: 2.2~5.5VDC
  • Công suất tiêu thụ: 0.04w
  • Góc hiển thị: lớn hơn 160 độ
  • Số điểm hiển thị: 128×64 điểm.
  • Độ rộng màn hình: 1.3 inch.
  • Màu hiển thị: Trắng / Xanh Dương.
  • Giao tiếp: I2C hoặc SPI tùy loại
  • Driver: SH1106
  • Kích thước 1.3 inch (128x64px)
  • Góc nhìn tối đa: 160°
  • Nhiệt độ làm việc: -30°V đến 80°C
  • Tương thích với hầu hết các board như: Arduino, ESP8266, ESP32, STM32,
Lưu ý khi dùng Oled 1.3in Hiện trên thị trường sẽ có: +  2 loại chính là 0.96in1.3in +  2 mã số là SH1106SH1306 +  2 chuẩn truyền SPII2C Vì thế việc lựa chọn đúng đối tượng để lập trình mới có thể hiển thị được thông tin mong muốn.

1.4 App Blynk cho mạch đọc nhịp tim và oxy Max30100 giao tiếp ESP8266

a. Giới thiệu

  • Blynk là một nền tảng với các ứng dụng điện thoại thông minh cho phép bạn có thể dễ dàng tương tác với bộ vi điều khiển như: Arduino, Esp8266, Esp32 hoặc Raspberry qua Internet.
  • Blynk App là một bảng điều khiển kỹ thuật số cho phép bạn có thể xây dựng giao diện đồ họa cho dự án của mình bằng cách kéo và thả các widget khác nhau mà nhà cung cấp thiết kế sẵn.
  • Blynk không bị ràng buộc với một số bo hoặc shield cụ thể. Thay vào đó, nó hỗ trợ phần cứng mà bạn lựa chọn. Cho dù Arduino hoặc Raspberry Pi của bạn được liên kết với Internet qua Wi-Fi, Ethernet hoặc chip ESP8266, Blynk sẽ giúp bạn kết nối và sẵn sàng cho các dự án IoT.
  • Blynk Server – chịu trách nhiệm về tất cả các giao tiếp giữa điện thoại thông minh và phần cứng. Bạn có thể sử dụng Blynk Cloud hoặc chạy cục bộ máy chủ Blynk riêng của mình. Nó là mã nguồn mở, có thể dễ dàng xử lý hàng nghìn thiết bị và thậm chí có thể được khởi chạy trên Raspberry Pi.
  • Thư viện Blynk – dành cho tất cả các nền tảng phần cứng phổ biến – cho phép giao tiếp với máy chủ và xử lý tất cả các lệnh đến và lệnh đi.
  • Mỗi khi bạn nhấn một nút trong ứng dụng Blynk, thông điệp sẽ truyền đến không gian của đám mây Blynk, và tìm đường đến phần cứng của bạn.
cam-bien-nhip-tim-oxy-max30100-giao-tiep-arduino-hien-thi-lcd1602-app-blynk  

b. Tính năng

  • API và giao diện người dùng tương tự cho tất cả phần cứng và thiết bị được hỗ trợ
  • Kết nối với đám mây bằng cách sử dụng:
    • Wifi
    • Bluetooth và BLE
    • Ethernet
    • USB (Nối tiếp)
    • GSM
  • Bộ Widget dễ sử dụng
  • Thao tác ghim trực tiếp mà không cần viết mã
  • Dễ dàng tích hợp và thêm chức năng mới bằng cách sử dụng ghim ảo
  • Theo dõi dữ liệu lịch sử qua tiện ích SuperChart
  • Giao tiếp giữa thiết bị với thiết bị sử dụng Bridge Widget
  • Gửi email, tweet, push notification…

c. Hoạt động app blynk

  • Blynk được thiết kế cho IoT. Nó có thể điều khiển phần cứng từ xa, nó có thể hiển thị dữ liệu cảm biến, nó có thể lưu trữ dữ liệu, trực quan hóa và làm nhiều thứ hay ho khác.
  • Có ba thành phần chính trong nền tảng:
  • Ứng dụng Blynk – cho phép bạn tạo giao diện cho các dự án của mình bằng cách sử dụng các widget khác nhau.
  • Blynk Server – chịu trách nhiệm về tất cả các giao tiếp giữa điện thoại thông minh và phần cứng. Bạn có thể sử dụng Blynk Cloud hoặc chạy cục bộ máy chủ Blynk riêng của mình. Nó là mã nguồn mở, có thể dễ dàng xử lý hàng nghìn thiết bị và thậm chí có thể được khởi chạy trên Raspberry Pi.
  • Thư viện Blynk – dành cho tất cả các nền tảng phần cứng phổ biến – cho phép giao tiếp với máy chủ và xử lý tất cả các lệnh đến và lệnh đi.

2. Hướng dẫn đồ án Max30100 giao tiếp ESP8266 hiển thị LCD1602

Phần cứng

cam-bien-nhip-tim-oxy-max30100-giao-tiep-arduino-hien-thi-lcd1602-app-blynk-3

Phần mềm

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"

#define REPORTING_PERIOD_MS 1000

OakOLED oled;

char auth[] = "N-81lOStH83VwUeNuKHOzpLVzqjFXhHO";             // You should get Auth Token in the Blynk App.
char ssid[] = "dientunhatttung";                                     // Your WiFi credentials.
char pass[] = "0967551477";

// Connections : SCL PIN - D1 , SDA PIN - D2 , INT PIN - D0
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = 0;
const unsigned char bitmap [] PROGMEM=
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x18, 0x00, 0x0f, 0xe0, 0x7f, 0x00, 0x3f, 0xf9, 0xff, 0xc0,
0x7f, 0xf9, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xf7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0x7f, 0xdb, 0xff, 0xe0,
0x7f, 0x9b, 0xff, 0xe0, 0x00, 0x3b, 0xc0, 0x00, 0x3f, 0xf9, 0x9f, 0xc0, 0x3f, 0xfd, 0xbf, 0xc0,
0x1f, 0xfd, 0xbf, 0x80, 0x0f, 0xfd, 0x7f, 0x00, 0x07, 0xfe, 0x7e, 0x00, 0x03, 0xfe, 0xfc, 0x00,
0x01, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void onBeatDetected()
{
    Serial.println("Beat Detected!");
    oled.drawBitmap( 60, 20, bitmap, 28, 28, 1);
    oled.display();
}

void setup()
{
    Serial.begin(115200);
    oled.begin();
    oled.clearDisplay();
    oled.setTextSize(1);
    oled.setTextColor(1);
    oled.setCursor(0, 0);
    oled.println("Initializing pulse oximeter..");
    oled.display();
 
    pinMode(16, OUTPUT);
    Blynk.begin(auth, ssid, pass);
    Serial.print("Initializing Pulse Oximeter..");
    if (!pox.begin())
    {
         Serial.println("FAILED");
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("FAILED");
         oled.display();
         for(;;);
    }
    else
    {
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("SUCCESS");
         oled.display();
         Serial.println("SUCCESS");
         pox.setOnBeatDetectedCallback(onBeatDetected);
    }
    // The default current for the IR LED is 50mA and it could be changed by uncommenting the following line.

     //pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
}

void loop()
{
    pox.update();
    Blynk.run();
    BPM = pox.getHeartRate();
    SpO2 = pox.getSpO2();
     if (millis() - tsLastReport > REPORTING_PERIOD_MS)
    {
        Serial.print("Heart rate:");
        Serial.print(BPM);
        Serial.print(" bpm / SpO2:");
        Serial.print(SpO2);
        Serial.println(" %");
        Blynk.virtualWrite(V7, BPM);
        Blynk.virtualWrite(V8, SpO2);
    
        oled.clearDisplay();
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0,16);
        oled.println(pox.getHeartRate());
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0, 0);
        oled.println("Heart BPM");
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0, 30);
        oled.println("Spo2");
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0,45);
        oled.println(pox.getSpO2());
        oled.display();
        tsLastReport = millis();
    }
}

3. Hoạt động của mạch đọc nhịp tim và Oxy Max30100 giao tiếp ESP8266

Khi cấp điện hệ thống hoạt động, vi điều khiển hiển thị thông tin ban đầu. Lúc này vi điều khiển chờ tín hiệu từ cảm biến nhịp tim và nồng độ Oxy Max30102 trong máu đưa vào. Khi nhận tín hiệu từ cảm biến Max30100 giao tiếp ESP8266 vi điều khiển tính toán, xử lý dữ liệu sau đó hiển thị giá trị nhịp tim và nồng độ Oxy lên màn hình Oled đồng thời gửi lên điện thoại App Blynk dùng wifi theo yêu cầu đã được lập trình.

4. Cụ thể hoạt động của mạch đọc nhịp tim và Oxy Max30100 giao tiếp ESP8266:

Ngoài ra còn nhiều Phần và các môn khác

Đồ án điện tử, Lập trình vi điều khiển tổng hợp File đồ án – Phần 1 Mạch điện tử, Lập trình vi điều khiển tổng hợp File đồ án – Phần 2 Thiết kế mạch điện tử, Lập trình vi điều khiển tổng hợp File đồ án – Phần 3 Vi xử lý, Lập trình vi điều khiển Pic – 8051 – Avr – Phần 4 Tổng hợp File ĐỒ ÁN Điện tử cơ bản Tổng hợp File ĐỒ ÁN Viễn thông Tổng hợp File ĐỒ ÁN PLC Tổng hợp File ĐỒ ÁN Cung cấp điện

Sẽ còn các phần khác nữa nhé.

Chúc các bạn thành công…!!!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *