質問編集履歴

2

他サイトへの同じ質問について、他サイトの方の質問を削除致しました。 コードを成型し直しました。

2022/09/19 11:44

投稿

mokon
mokon

スコア16

test CHANGED
File without changes
test CHANGED
@@ -3,86 +3,137 @@
3
3
  結論から書くと、一度目のデバッグではちゃんと通信ができますが、一旦停止し、初めからデバックをやり直すと「invalid literal for int() with base 10: ''」というエラーが返ってきます。問題がありそうな関数に関して以下に掲載いたします。
4
4
 
5
5
  【Arduino側】
6
+ ```Arduino
7
+ //心電計測関数
6
8
  void HRV_check(){
7
- int checkflag = 0;
9
+ int checkflag = 0;
8
- char inputData;
10
+ char inputData;
9
-
11
+
10
- while(1){
12
+ while(1){
11
- //二分計測したら'0'が送られてくる
13
+ //二分計測したら'0'が送られてくる
12
- if(Serial.available() > 0){
14
+ if(Serial.available() > 0){
13
- inputData = Serial.read();
15
+ inputData = Serial.read();
14
- //データ受信
16
+ //データ受信
15
- //ループ停止信号
17
+ //ループ停止信号
16
- if(inputData == '0'){
18
+ if(inputData == '0'){
17
- break;
19
+ break;
18
- }
20
+ }
19
- else if(inputData == '1'){
21
+ else if(inputData == '1'){
20
- checkflag = 1;
22
+ checkflag = 1;
21
- }
23
+ }
24
+ }
25
+
26
+ if(checkflag == 1){
27
+ //心電読み込み
28
+ //データなし
29
+ if((digitalRead(10) == 1)||(digitalRead(11) == 1)){
30
+ Serial.println('!');
31
+ }
32
+ else{
33
+ //心電情報送信
34
+ Serial.println(analogRead(A5));
35
+ }
36
+ //1ms待機
37
+ delay(1);
38
+ }
39
+ }
22
40
  }
23
41
 
24
- if(checkflag == 1){
42
+ void loop(){
25
- //心電読み込み
43
+ //シリアル信号受信
26
- //データなし
44
+ HRV_check();
27
- if((digitalRead(10) == 1)||(digitalRead(11) == 1)){
45
+
28
- Serial.println('!');
46
+ exit(0);
29
47
  }
48
+ ```
30
- else{
49
+ 【PC側】
31
- //心電情報送信
32
- Serial.println(analogRead(A5));
33
- }
34
- //1ms待機
35
- delay(1);
50
+ ```python
51
+ import serial
52
+ from serial.tools import list_ports
36
- }
53
+ import time
54
+ import numpy as np
55
+ import matplotlib.pyplot as plt
56
+ from biosppy.signals import ecg
57
+ import pandas as pd
37
- }
58
+ import scipy
38
- }
39
59
 
60
+ #サンプリング周波数
61
+ Fs = 512
62
+
63
+ #心電計測時間(s)
64
+ HR_calculate_time = 150
65
+
66
+ if __name__ == "__main__":
40
- 【PC側】
67
+ main()
68
+
41
69
  #2分間心電を計測する関数
42
70
  #引数:Arduinoシリアルポート
43
71
  def HRV_check(ser):
44
- #時間計測用
72
+ #時間計測用
45
- sum_time = 0
73
+ sum_time = 0
46
- temp_time = 0
74
+ temp_time = 0
47
- #心電計測用
75
+ #心電計測用
48
- hrv_data = []
76
+ hrv_data = []
77
+
78
+ #PCからArduinoへ送る場合
79
+ ser.write(b'1')
80
+ #ser.write(moji.encode('utf-8'))
81
+ print("心電計測中")
49
82
 
50
- #PCからArduinoへ送る場合
83
+ while True:
84
+ temp_time = time.perf_counter()
85
+ ##################計測開始##################
86
+ #信号読み込み
87
+ val_arduino = ser.readline()#シリアル通信(PC⇔Arduino)
51
- ser.write(b'1')
88
+ print(type(val_arduino))
89
+ # val_decoded = float(repr(val_arduino.decode())[1:-5])
52
- #ser.write(moji.encode('utf-8'))
90
+ val_decoded = val_arduino.strip().decode('UTF-8')
91
+ #心電情報表示
53
- print("心電計測中")
92
+ print(val_decoded)
54
93
 
55
- while True:
56
- temp_time = time.perf_counter()
57
- ##################計測開始##################
58
- #信号読み込み
94
+ #取得ミス時
59
- val_arduino = ser.readline()#シリアル通信(PC⇔Arduino)
95
+ if val_decoded == '!':
60
- print(type(val_arduino))
96
+ print(";;\n")
97
+ #配列がカラなら 0
98
+ if not hrv_data:
99
+ hrv_data.append(0)
100
+ #カラでないなら ひとつ前のデータを
101
+ else:
61
- #val_decoded = float(repr(val_arduino.decode())[1:-5])
102
+ hrv_data.append(hrv_data[-1])
62
- val_decoded = val_arduino.strip().decode('UTF-8')
103
+ #正常に取得できていれば配列に追加
63
- #心電情報表示
104
+ else:
105
+ print("正常よ")
64
- print(val_decoded)
106
+ hrv_data.append(int(val_decoded))
65
107
 
108
+ #################計測終了###################
66
- #取得ミス
109
+ #時間を加算していく
110
+ sum_time += (time.perf_counter() - temp_time)
111
+ #2分経過していたらループを抜ける
112
+ if sum_time > HR_calculate_time:
67
- if val_decoded == '!':
113
+ ser.write(b'0')
68
- print(";;\n")
69
- #配列がカラなら 0
70
- if not hrv_data:
71
- hrv_data.append(0)
72
- #カラでないなら ひとつ前のデータを
73
- else:
114
+ break
74
- hrv_data.append(hrv_data[-1])
75
- #正常に取得できていれば配列に追加
76
- else:
77
- hrv_data.append(int(val_decoded))
78
115
 
79
- #################計測終了###################
80
- #時間を加算していく
116
+ def main():
81
- sum_time += (time.perf_counter() - temp_time)
117
+ ser = select_port(baudrate = 9600)
118
+ print("Arduino読み込み")
119
+ #PC→Arduino
120
+ #e:終了
121
+ #s:HRV計測スタート
122
+
82
- #2分経過していたらループを抜ける
123
+ ####心電計測フェイズ####
124
+ while(1):
125
+ #心電計測
126
+ input1 = input("まず初めに、2分間心電を計測します。\nokと入力すると、10秒後に計測が開始されます。")
127
+
83
- if sum_time > HR_calculate_time:
128
+ if input1 == "ok":
84
- ser.write(b'0')
129
+ "心電計測開始"
130
+ HRV_check(ser)
85
- break
131
+ break;
132
+ else: print("入力が適切でありません。")
133
+ ####################
134
+ ser.close()
135
+
136
+ ```
86
137
 
87
138
  試したこと
88
139
  単純にArduinoからdegitalreadした信号をprintlnにて送信する → 動作する。

1

テキストが大きく表示されるようになっていたので、「# テキスト」のせいかな?と思い、間の空白を削除しました。

2022/09/19 09:08

投稿

mokon
mokon

スコア16

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
  #信号読み込み
59
59
  val_arduino = ser.readline()#シリアル通信(PC⇔Arduino)
60
60
  print(type(val_arduino))
61
- # val_decoded = float(repr(val_arduino.decode())[1:-5])
61
+ #val_decoded = float(repr(val_arduino.decode())[1:-5])
62
62
  val_decoded = val_arduino.strip().decode('UTF-8')
63
63
  #心電情報表示
64
64
  print(val_decoded)