[졸음 해결 프로젝트 - 2] 아두이노-파이썬 연결

반응형

1. 이번 내용 요약

파이썬-아두이노 연결하기, 아두이노 쪽 코드와 파이썬 쪽 코드 작성하기, 결과 확인

2. 환경 설정

아두이노와 파이썬이 소통하기 위해서 시리얼 통신을 활용할 것입니다. 시리얼 통신을 활용하려면 컴퓨터와 아두이노가 연결되어 있으면 되고, 라이브러리를 설치해 주면 됩니다. 초기 설정 방법에 대한 링크를 아래 첨부하겠습니다.
-> 초기 설정 방법

3. 아두이노 코드

세가지 데이터를 시리얼 작성을 해주는 코드입니다. ‘ , ‘로 구분해서 작성합니다.

 

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// MAX30100 핀 설정
#define MAX30100_SCL A5
#define MAX30100_SDA A4

// DS18B20 핀 설정
#define DS18B20_PIN 2

OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);
PulseOximeter pox;
uint32_t tsLastReport = 0;

// 콜백 함수를 사용하여 심박수 업데이트
void onBeatDetected() {
    Serial.println("Heartbeat detected!");
}

void setup() {
    Serial.begin(9600);
     
    // 기본 I2C 핀을 사용하여 Wire 라이브러리 초기화
    Wire.begin();
     
    // MAX30100 초기화
    if (!pox.begin()) {
        Serial.println("Failed to initialize pulse oximeter!");
        for(;;);
    } else {
        Serial.println("Pulse oximeter initialized.");
    }

    // 콜백 설정
    pox.setOnBeatDetectedCallback(onBeatDetected);
     
    // DS18B20 센서 시작
    sensors.begin();
}


void loop() {
    // 심박수와 산소포화도 측정
    pox.update();
     
    // 현재 시간 체크
    if (millis() - tsLastReport > 1000) {
        tsLastReport = millis();
         
        // 온도 읽기
        sensors.requestTemperatures();
        float temperature = sensors.getTempCByIndex(0);
         
        Serial.print(pox.getSpO2());
        Serial.print(",");
        Serial.print(pox.getHeartRate());
        Serial.print(",");
        Serial.print(temperature);
        //serial borad print -> 'spO2','heartbeat','temp'
    }
}
 

4. 파이썬 코드

세 가지 데이터를 받아온 뒤 현재 날짜와 데이터를 csv에 작성하는 코드입니다!

import serial
import csv
from datetime import datetime

# Serial port setup
ser = serial.Serial('/dev/cu.usbmodem2101', 9600)
ser.flushInput()

# Open CSV file
with open("sensor_data.csv", "w", newline='') as csvfile:
    writer = csv.writer(csvfile)
    # Update the column names to match the data
    writer.writerow(["Time", "SpO2", "Heart Rate", "Temperature"])

    while True:
        try:
            ser_bytes = ser.readline().decode('utf-8').strip()  # Read data from serial
            now = datetime.now()
            current_time = now.strftime("%H:%M:%S")  # Convert current time to string

            # Split the received data into individual sensor values
            spo2, heart_rate, temperature = ser_bytes.split(',')

            # Write the data to the CSV file
            writer.writerow([current_time, spo2, heart_rate, temperature])

            # Print the data to the console
            print(f"{current_time}, SpO2: {spo2}, HR: {heart_rate}, Temp: {temperature}")

        except KeyboardInterrupt: #control c
            print("Data collection stopped.")
            break

ser.close()

 

pip install은 필수!

 

맥 시리얼 포트 설정
저는 맥북 유저이기 때문에 ‘/dev~’를 사용하고 있습니다.
1. 이름 확인법(확인하는 방법이 있는데, 자세히 정리해서 업데이트할게요!
2. 포트 이름 설정
3. 끝!

윈도우 시리얼 포트 설정
1. 아두이노 IDE에서 포트 확인
2. 포트 이름 똑같이 설정(‘COM~’)
3. 끝!
(윈도우는 안 해봐서 잘 몰라요…)

5. 테스트

아래 사진처럼 나오게 되고, 이 사진은 처음 만들 때 테스트해 본 사진으로 코드는 같으나 센서를 다 연결하지 않아 데이터가 하나만 나오게 되었습니다.

6. 다음 내용

직접 테스트해본 결과 값이 제대로 나오는 것을 확인할 수 있었습니다. 이후 모든 센서를 다 연결해서 값이 제대로 나오는지 확인해 보고, 직접 공부 중에 테스트해볼 예정입니다. 다만, 자습 중에 직접 테스트할 기회를 틈틈이 엿보고 있는데 아직 기회를 잡지 못했습니다… 기회를 잡게 되면 실제 측정 결과 값과 +분석(미정)으로 돌아오겠습니다!

잘못된 내용이나 수정할 부분 있으면 알려주세요! 감사합니다!

반응형