質問編集履歴

9

解決しました

2019/01/30 05:49

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -12,39 +12,35 @@
12
12
 
13
13
 
14
14
 
15
-
16
-
17
- 入力波形は以下のような心電波形です。
15
+ 入力波形は心電波形です。
18
-
19
- ![イメージ説明](82b9f7e0bbdf867b07ebeba13908bb32.png)
20
-
21
-
22
-
23
- 当方プログラミング初心者のため資料を参考にこのプログラムを作成しました。
24
-
25
- 詳しい方がいらっしゃいましたらお助け頂けますと幸いです。
26
-
27
- よろしくお願いいたします。
28
-
29
-
30
-
31
- こちらにも質問させていただいています。
32
-
33
- https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13202603858?__ysp=YXJkdWlubw%3D%3D
34
-
35
- ### 発生している問題・エラーメッセージ
36
-
37
- ![イメージ説明](7b0a64229f5ac986c683fd9ba5ef4c0b.png)
38
16
 
39
17
 
40
18
 
41
19
 
42
20
 
21
+
22
+
23
+
24
+
25
+
26
+
43
- ### 該当のソースコード
27
+ ### 解決したコード
28
+
29
+
44
30
 
45
31
  int now=0 ;
46
32
 
33
+ long i=0 ; //配列番号の管理
34
+
35
+ byte j=0 ; //フラグ管理
36
+
37
+ unsigned long tNow,tPrev;
38
+
39
+ word peak;
40
+
47
41
  unsigned long time ;
42
+
43
+ //int pin=10 ;
48
44
 
49
45
 
50
46
 
@@ -52,7 +48,7 @@
52
48
 
53
49
  // put your setup code here, to run once:
54
50
 
55
- Serial.begin(1200);
51
+ Serial.begin(9600);
56
52
 
57
53
  }
58
54
 
@@ -62,27 +58,75 @@
62
58
 
63
59
  // put your main code here, to run repeatedly:
64
60
 
65
- now=analogRead(A5) ;//入力波形の取得
61
+ now=analogRead(A5) ;
66
62
 
67
63
  time = millis() ;
68
64
 
69
65
 
70
66
 
71
- Serial.print(time/1000) ; //mSからSに
67
+ Serial.print(time/1000) ;
72
68
 
73
69
  Serial.print(",") ;
74
70
 
75
- //Serial.println(now*0.0049); //電圧に変更
71
+ Serial.println(now*0.005);
76
72
 
77
- Serial.println(now);
73
+ //Serial.println(now);
78
74
 
79
75
 
80
76
 
81
- //delay(10); //必要(?)
77
+ //delay(10);
78
+
79
+
80
+
81
+ if(now>peak) {//ピーク値更新なら
82
+
83
+ peak=now;//保存して
84
+
85
+ tNow=millis();//時間を取得
86
+
87
+ j=1;//取得した
88
+
89
+ }
90
+
91
+ if(now<peak*7/10 && j==1) {//7割りに落ちた時にピーク確定。→集計
92
+
93
+ if(i){
94
+
95
+ //Serial.print("count:");
96
+
97
+ //Serial.print(i);
98
+
99
+ //Serial.print(" peak:");
100
+
101
+ //Serial.print(peak);
102
+
103
+ Serial.print(" RR:");
104
+
105
+ Serial.print(tNow-tPrev);
106
+
107
+ Serial.println("ms");
82
108
 
83
109
  }
84
110
 
85
111
 
112
+
113
+ tPrev = tNow ;
114
+
115
+ peak=peak*8/10;//8割以上に上がったら再取得
116
+
117
+ i++;
118
+
119
+ j=0;
120
+
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+ }
86
130
 
87
131
  ```ここに言語名を入力
88
132
 

8

2019/01/30 05:48

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -27,6 +27,10 @@
27
27
  よろしくお願いいたします。
28
28
 
29
29
 
30
+
31
+ こちらにも質問させていただいています。
32
+
33
+ https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13202603858?__ysp=YXJkdWlubw%3D%3D
30
34
 
31
35
  ### 発生している問題・エラーメッセージ
32
36
 

7

画像の変更

2019/01/30 00:10

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ### 発生している問題・エラーメッセージ
32
32
 
33
- ![イメージ説明](b11027f931092caa4655e8c63f822f43.png)
33
+ ![イメージ説明](7b0a64229f5ac986c683fd9ba5ef4c0b.png)
34
34
 
35
35
 
36
36
 

6

再考後の質問

2019/01/29 09:15

投稿

taki3005
taki3005

スコア12

test CHANGED
@@ -1 +1 @@
1
- 【Arduino】シリアルモニタに正しい値が表示されないです
1
+ 【Arduino】シリアルモニタに正しい値が表示されない
test CHANGED
@@ -1,14 +1,16 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 入力された生体信号(心電波形)のRR間隔の時間をシリアルモニタに表示させたいです。
3
+ 入力された生体信号(心電波形)のRR間隔の時間を出力させめに
4
4
 
5
+ 入力信号のデータを取得して、波形のグラフを作成したいです。
6
+
7
+
8
+
5
- 私の作成したコードではシリアルモニタの出力結果全て以下のようになってしまいます。
9
+ 私の作成したコードではArduinoに入力する前にオロスコープで取得している波形となってしまいます。
6
10
 
7
11
  コンパイル時のエラー等はありません。
8
12
 
9
- 現在、プログラムの確認のためファンクションジェネレータを用いて1Hz~10Hzの実行結果の変化を見たところ、
10
13
 
11
- 全て150前後の結果が出てしまいます。
12
14
 
13
15
 
14
16
 
@@ -36,113 +38,47 @@
36
38
 
37
39
  ### 該当のソースコード
38
40
 
41
+ int now=0 ;
39
42
 
40
-
41
- int i=0 ; //配列番号の管理
42
-
43
- int j=0 ; //フラグ管理
44
-
45
- //プログラム起動時間の変数
46
-
47
- unsigned long ti ;
43
+ unsigned long time ;
48
-
49
- unsigned long to ;
50
-
51
- unsigned long tNow,tPrev ;
52
-
53
- int threshold ; //閾値
54
-
55
- int a=0 ; //アナログ電圧の変数
56
-
57
- int x=0 ; //一つ前のアナログ値を入力
58
44
 
59
45
 
60
46
 
61
- void setup(){
47
+ void setup() {
62
48
 
63
- //put your setup code here, to run once;
49
+ // put your setup code here, to run once:
64
50
 
65
- Serial.begin(1200);
51
+ Serial.begin(1200);
66
52
 
67
53
  }
68
54
 
69
- void loop(){
70
55
 
71
- //配列の数が200なのでエラーを出さないようにする
72
56
 
73
- ti=millis(); //起動時間の代入
57
+ void loop() {
74
58
 
75
- a=analogRead(A5); //アナログ入力の代入
59
+ // put your main code here, to run repeatedly:
76
60
 
77
- //閾値を決める
61
+ now=analogRead(A5) ;//入力波形の取得
78
62
 
79
- if(a-x>0){
63
+ time = millis() ;
80
-
81
- x=a;//波形の山が下り始めるところを見つける
82
-
83
- if(x-threshold>0){
84
-
85
- threshold=a; //R波のみ判定
86
-
87
- }
88
-
89
- }
90
-
91
- //アナログ入力が閾値を超えたときに時間を入れるに格納
92
-
93
- if(a>=0.5*threshold&&j==0){
94
-
95
- //4.9mV*20=98mVの時に分岐
96
64
 
97
65
 
98
66
 
99
- Serial.print("count");
67
+ Serial.print(time/1000) ; //mSからSに
100
68
 
101
- Serial.println(i);
69
+ Serial.print(",") ;
102
70
 
71
+ //Serial.println(now*0.0049); //電圧に変更
72
+
103
- tNow=millis();
73
+ Serial.println(now);
104
74
 
105
75
 
106
76
 
107
- //i=0の時は計算できないので分岐
108
-
109
-
110
-
111
- if(i!=0){
112
-
113
- to=tNow-tPrev;
114
-
115
- tPrev = tNow ;
116
-
117
- //入れるに格納された秒数からRR間隔を計算
77
+ //delay(10); //必要(?)
118
-
119
- //USVBケーブルを通してPCに出力
120
-
121
- Serial.println("RR");
122
-
123
- Serial.println(to);
124
78
 
125
79
  }
126
80
 
127
- i++; //次の配列へ
128
81
 
129
- j=1; //一度とったのでフラグをオンに
130
-
131
- // Serial.end(); //通信終了
132
-
133
- }
134
-
135
- //フラグがオンの時に閾値を下回った時にオフにする
136
-
137
- if(a< 0.5*threshold&&j==1) {
138
-
139
- j=0;
140
-
141
- }
142
-
143
-
144
-
145
- }
146
82
 
147
83
  ```ここに言語名を入力
148
84
 

5

コードの修正

2019/01/29 09:14

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  //アナログ入力が閾値を超えたときに時間を入れるに格納
92
92
 
93
- if(a>=0.99*threshold&&j==0){
93
+ if(a>=0.5*threshold&&j==0){
94
94
 
95
95
  //4.9mV*20=98mVの時に分岐
96
96
 
@@ -134,7 +134,7 @@
134
134
 
135
135
  //フラグがオンの時に閾値を下回った時にオフにする
136
136
 
137
- if(a< 0.99*threshold&&j==1) {
137
+ if(a< 0.5*threshold&&j==1) {
138
138
 
139
139
  j=0;
140
140
 

4

コードの修正

2019/01/28 05:00

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -38,10 +38,6 @@
38
38
 
39
39
 
40
40
 
41
-
42
-
43
- ```ここに言語名を入力
44
-
45
41
  int i=0 ; //配列番号の管理
46
42
 
47
43
  int j=0 ; //フラグ管理
@@ -52,7 +48,7 @@
52
48
 
53
49
  unsigned long to ;
54
50
 
55
- unsigned long t[200] ;
51
+ unsigned long tNow,tPrev ;
56
52
 
57
53
  int threshold ; //閾値
58
54
 
@@ -66,7 +62,7 @@
66
62
 
67
63
  //put your setup code here, to run once;
68
64
 
69
- Serial.begin(1200);
65
+ Serial.begin(1200);
70
66
 
71
67
  }
72
68
 
@@ -94,13 +90,17 @@
94
90
 
95
91
  //アナログ入力が閾値を超えたときに時間を入れるに格納
96
92
 
97
- if(a>=0.8*threshold&&j==0){
93
+ if(a>=0.99*threshold&&j==0){
94
+
95
+ //4.9mV*20=98mVの時に分岐
96
+
97
+
98
98
 
99
99
  Serial.print("count");
100
100
 
101
101
  Serial.println(i);
102
102
 
103
- t[i]=millis();
103
+ tNow=millis();
104
104
 
105
105
 
106
106
 
@@ -110,9 +110,13 @@
110
110
 
111
111
  if(i!=0){
112
112
 
113
- to=t[i]-t[i-1]; //入れるに格納された秒数からRR間隔を計算
113
+ to=tNow-tPrev;
114
114
 
115
+ tPrev = tNow ;
116
+
117
+ //入れるに格納された秒数からRR間隔を計算
118
+
115
- //ケーブルを通してPCに出力
119
+ //USVBケーブルを通してPCに出力
116
120
 
117
121
  Serial.println("RR");
118
122
 
@@ -124,13 +128,13 @@
124
128
 
125
129
  j=1; //一度とったのでフラグをオンに
126
130
 
127
-
131
+ // Serial.end(); //通信終了
128
132
 
129
133
  }
130
134
 
131
135
  //フラグがオンの時に閾値を下回った時にオフにする
132
136
 
133
- if(a< 0.8*threshold&&j==1) {
137
+ if(a< 0.99*threshold&&j==1) {
134
138
 
135
139
  j=0;
136
140
 
@@ -139,6 +143,8 @@
139
143
 
140
144
 
141
145
  }
146
+
147
+ ```ここに言語名を入力
142
148
 
143
149
 
144
150
 

3

画像の追加

2019/01/28 04:46

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -11,6 +11,10 @@
11
11
  全て150前後の結果が出てしまいます。
12
12
 
13
13
 
14
+
15
+ 入力波形は以下のような心電波形です。
16
+
17
+ ![イメージ説明](82b9f7e0bbdf867b07ebeba13908bb32.png)
14
18
 
15
19
 
16
20
 

2

追記

2019/01/28 03:43

投稿

taki3005
taki3005

スコア12

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  現在、プログラムの確認のためファンクションジェネレータを用いて1Hz~10Hzの実行結果の変化を見たところ、
10
10
 
11
- 全て150結果が出てしまいます。
11
+ 全て150前後の結果が出てしまいます。
12
12
 
13
13
 
14
14
 

1

追記

2019/01/23 06:54

投稿

taki3005
taki3005

スコア12

test CHANGED
@@ -1 +1 @@
1
- 【Arduino】シリアルモニタに値が表示されないです
1
+ 【Arduino】シリアルモニタに正しい値が表示されないです
test CHANGED
@@ -1,14 +1,14 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 入力された生体信号(心電波形)のRR間隔の時間をシリアルモニタに表示させたいです
3
+ 入力された生体信号(心電波形)のRR間隔の時間をシリアルモニタに表示させたいです
4
4
 
5
- 私の作成したコードではシリアルモニタの出力結果は以下のようになってしまいます。
5
+ 私の作成したコードではシリアルモニタの出力結果は全て以下のようになってしまいます。
6
6
 
7
7
  コンパイル時のエラー等はありません。
8
8
 
9
- 入力波形はちらになります。
9
+ 現在、プログラム確認のためファンクションジェネレータを用いて1Hz~10Hzの実行結果の変化を見たとろ、
10
10
 
11
- ![![イメージ説明](861a52b5132d061898587a28027abc82.png)]
11
+ 全て150と結果が出てしまいます。
12
12
 
13
13
 
14
14
 
@@ -24,9 +24,9 @@
24
24
 
25
25
  ### 発生している問題・エラーメッセージ
26
26
 
27
+ ![イメージ説明](b11027f931092caa4655e8c63f822f43.png)
27
28
 
28
29
 
29
- ![イメージ説明](2f858e017738053780c66e5ec082c757.png)
30
30
 
31
31
 
32
32
 
@@ -62,6 +62,8 @@
62
62
 
63
63
  //put your setup code here, to run once;
64
64
 
65
+ Serial.begin(1200);
66
+
65
67
  }
66
68
 
67
69
  void loop(){
@@ -89,8 +91,6 @@
89
91
  //アナログ入力が閾値を超えたときに時間を入れるに格納
90
92
 
91
93
  if(a>=0.8*threshold&&j==0){
92
-
93
- Serial.begin(9600);
94
94
 
95
95
  Serial.print("count");
96
96
 
@@ -120,7 +120,7 @@
120
120
 
121
121
  j=1; //一度とったのでフラグをオンに
122
122
 
123
- Serial.end(); //通信終了
123
+
124
124
 
125
125
  }
126
126