FriedBob

shock_detect code updated-누적 충격량을 계산하게 수정

1 // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files 1 // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
2 // for both classes must be in the include path of your project 2 // for both classes must be in the include path of your project
3 // 전처리부 3 // 전처리부
4 +#include <SoftwareSerial.h>
4 #include "I2Cdev.h" 5 #include "I2Cdev.h"
5 #include "MPU6050.h" 6 #include "MPU6050.h"
7 +
6 #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE 8 #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
7 #include "Wire.h" 9 #include "Wire.h"
8 #endif 10 #endif
11 +
9 #define mpu_add 0x68 12 #define mpu_add 0x68
10 #define Pin_Relay 13 13 #define Pin_Relay 13
14 +#define BT_RXD 7
15 +#define BT_TXD 6
11 MPU6050 mpu; 16 MPU6050 mpu;
12 17
13 18
...@@ -17,15 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산) ...@@ -17,15 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산)
17 double dgy_x; // double type acc data 22 double dgy_x; // double type acc data
18 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시 23 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시
19 long int angle_value; 24 long int angle_value;
20 -const int mapping_value = 1000; 25 +const int mapping_value = 5000;
21 -const int Emergency_value = 1300; // 충격상태로 판단하는 값 26 +const int Emergency_value = 10000; // 충격상태로 판단하는 값
22 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기) 27 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기)
23 const int Emergency_value2 = 1200;// 충격상태로 판단하는 값 28 const int Emergency_value2 = 1200;// 충격상태로 판단하는 값
24 const int Emergency_angle2 = 9; // 충격상태로 판단하는 각도(기울기) 29 const int Emergency_angle2 = 9; // 충격상태로 판단하는 각도(기울기)
25 -boolean State_Parameter = false; // 충격상태 30 +boolean State_Parameter = false; // 충격상태 판단
26 -const long int sum_count = 2; // 평균 내는 횟수 31 +unsigned short int shock_level; // 충격정도 상,중,하 char로 받을 생각
27 -const long interval = 1000; // 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms) 32 +const long int sum_count = 4; // 평균 내는 횟수
33 +const long interval = 50; // 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
28 unsigned long previousMillis = 0; // 최초 시작시간 34 unsigned long previousMillis = 0; // 최초 시작시간
35 +long shock_sum = 0; // 누적 충격값
29 36
30 37
31 /* 사용자지정함수부 38 /* 사용자지정함수부
...@@ -74,9 +81,11 @@ void accel_calculate() { ...@@ -74,9 +81,11 @@ void accel_calculate() {
74 ac_z = Wire.read() << 8 | Wire.read() ; 81 ac_z = Wire.read() << 8 | Wire.read() ;
75 82
76 //맵핑화 시킨 것 - 즉 10000으로 맵핑시킴 83 //맵핑화 시킨 것 - 즉 10000으로 맵핑시킴
77 - normal_x = map(int(ac_x), -16384, 16384, 0, mapping_value); 84 + normal_x = map(int(ac_x), -16384, 16384, -5000, mapping_value);
78 - normal_y = map(int(ac_y), -16384, 16384, 0, mapping_value); 85 + normal_y = map(int(ac_y), -16384, 16384, -5000, mapping_value);
79 - normal_z = map(int(ac_z), -16384, 16384, 0, mapping_value); 86 + normal_z = map(int(ac_z), -16384, 16384, -5000, mapping_value);
87 +
88 + //normal_z = map(int(ac_z), -16384, 16384, -1000, mapping_value);
80 89
81 //각도계산 deg -> 각도 90 //각도계산 deg -> 각도
82 deg = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg 91 deg = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg
...@@ -87,12 +96,22 @@ void accel_calculate() { ...@@ -87,12 +96,22 @@ void accel_calculate() {
87 // 충격상태함수 96 // 충격상태함수
88 void Emergency_state_(){ 97 void Emergency_state_(){
89 digitalWrite(Pin_Relay , HIGH); // 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다. 98 digitalWrite(Pin_Relay , HIGH); // 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다.
90 - Serial.println("SHOCK!!!!!!!!!!!!!!!!!"); // Serial 모니터로 확인 99 + Serial.print("SHOCK level : ");
100 + Serial.println(shock_level); // Serial 모니터로 확인
101 + Serial.print(" x: ");
102 + Serial.print(deltha_x[0]);
103 + Serial.print(" y: ");
104 + Serial.print(deltha_y[0]);
105 + Serial.print(" z: ");
106 + Serial.println(deltha_z[0]);
107 +
108 + /*Serial.print(" deltha_1 : "); Serial.print(deltha_x[1]);
109 + Serial.print(" deltha_2 : "); Serial.println(deltha_x[2]);*/
91 } 110 }
92 111
93 void Shock_Sensing(){ 112 void Shock_Sensing(){
94 State_Parameter = false; // 충격상태 초기화 113 State_Parameter = false; // 충격상태 초기화
95 - 114 + shock_level = 0; // 충격정도 초기화
96 //첫번째 센싱 115 //첫번째 센싱
97 for (int i=0; i < sum_count; i++){ 116 for (int i=0; i < sum_count; i++){
98 accel_calculate(); 117 accel_calculate();
...@@ -129,6 +148,23 @@ void Shock_Sensing(){ ...@@ -129,6 +148,23 @@ void Shock_Sensing(){
129 if (deltha > Emergency_value){ 148 if (deltha > Emergency_value){
130 State_Parameter=true; 149 State_Parameter=true;
131 } 150 }
151 +
152 + shock_level = deltha; // 추후 수정 예정
153 +
154 +/*
155 + if(deltha > 하){
156 + shock_level = 'a';
157 + if(deltha > 중){
158 + shock_level = 'b';
159 + if(deltha > 상){
160 + shock_level = 'c';
161 + }
162 + }
163 + }
164 +
165 +*/
166 +
167 +
132 /*if (angle_value > Emergency_angle){ 168 /*if (angle_value > Emergency_angle){
133 State_Parameter=true; 169 State_Parameter=true;
134 } 170 }
...@@ -145,26 +181,43 @@ void Shock_Sensing(){ ...@@ -145,26 +181,43 @@ void Shock_Sensing(){
145 } 181 }
146 } 182 }
147 183
184 +// BLUETOOTH TRANSACTION
185 +SoftwareSerial bluetooth(BT_RXD, BT_TXD); // 블루투스 모듈
148 186
149 187
150 /*main 함수부*/ 188 /*main 함수부*/
151 void setup() { 189 void setup() {
152 Serial.begin(9600); // 시리얼 속도 설정 190 Serial.begin(9600); // 시리얼 속도 설정
153 Serial.println("Initializing I2C devices..."); 191 Serial.println("Initializing I2C devices...");
192 + bluetooth.begin(9600); // 블루투스 속도 설정
193 + Serial.println("Initializing Bluetooth devices...");
194 +
154 mpu6050_init(); // 가속도 센서 초기화 195 mpu6050_init(); // 가속도 센서 초기화
155 Serial.println("Testing device connections..."); 196 Serial.println("Testing device connections...");
156 Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); 197 Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
198 +
157 pinMode(Pin_Relay, OUTPUT); // 핀모드사용, led로 육안확인 가능하게끔 199 pinMode(Pin_Relay, OUTPUT); // 핀모드사용, led로 육안확인 가능하게끔
158 digitalWrite(Pin_Relay , LOW); // HIGH - LED on, LOW - LED off (DEFAULT : OFF) 200 digitalWrite(Pin_Relay , LOW); // HIGH - LED on, LOW - LED off (DEFAULT : OFF)
159 } 201 }
160 202
161 void loop() { 203 void loop() {
162 value_init(); //가속도-각도 관련 초기값 선언 204 value_init(); //가속도-각도 관련 초기값 선언
163 - unsigned long currentMillis = millis(); 205 + //---------dump--------------------do not erase yet-
164 - if(currentMillis - previousMillis >= interval){ 206 + //unsigned long currentMillis = 0;
207 + //previousMillis = currentMillis;
208 + //if(currentMillis - previousMillis >= interval){
209 + //if(currentMillis - previousMillis >= interval){
210 + //--------------------------------------------------
211 +
165 Shock_Sensing(); 212 Shock_Sensing();
166 if(State_Parameter == true){ 213 if(State_Parameter == true){
167 - previousMillis = currentMillis; 214 + shock_sum += deltha;
215 + //currentMillis = millis();
168 } 216 }
217 + if(State_Parameter == false && shock_sum != 0){
218 + //bluetooth.write(char_maker(shock_sum)); // 블루투스로 충격정도 전송 (shock_maker 라는 char 리턴함수를 통해 진동강도 전송)
219 + Serial.print("누적 충격값 : ");
220 + Serial.println(shock_sum); // 충격 누적값 전송
221 + shock_sum = 0; // 충격의 지속이 끝났으니 원래값인 0으로 초기화
169 } 222 }
170 } 223 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
12 #define mpu_add 0x68 12 #define mpu_add 0x68
13 #define Pin_Relay 13 13 #define Pin_Relay 13
14 #define BT_RXD 7 14 #define BT_RXD 7
15 -#define BT_TXD 8 15 +#define BT_TXD 6
16 MPU6050 mpu; 16 MPU6050 mpu;
17 17
18 18
...@@ -22,16 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산) ...@@ -22,16 +22,17 @@ double angle = 0, deg; // angle, deg data (각도계산)
22 double dgy_x; // double type acc data 22 double dgy_x; // double type acc data
23 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시 23 long int normal_x, normal_y, normal_z, deltha_x[3], deltha_y[3], deltha_z[3], deltha; // 노말라이즈(정규화 데이터), 가속도 변화량 표시
24 long int angle_value; 24 long int angle_value;
25 -const int mapping_value = 1000; 25 +const int mapping_value = 5000;
26 -const int Emergency_value = 1300; // 충격상태로 판단하는 값 26 +const int Emergency_value = 10000; // 충격상태로 판단하는 값
27 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기) 27 const int Emergency_angle = 25; // 충격상태로 판단하는 각도(기울기)
28 const int Emergency_value2 = 1200;// 충격상태로 판단하는 값 28 const int Emergency_value2 = 1200;// 충격상태로 판단하는 값
29 const int Emergency_angle2 = 9; // 충격상태로 판단하는 각도(기울기) 29 const int Emergency_angle2 = 9; // 충격상태로 판단하는 각도(기울기)
30 boolean State_Parameter = false; // 충격상태 판단 30 boolean State_Parameter = false; // 충격상태 판단
31 unsigned short int shock_level; // 충격정도 상,중,하 char로 받을 생각 31 unsigned short int shock_level; // 충격정도 상,중,하 char로 받을 생각
32 -const long int sum_count = 2; // 평균 내는 횟수 32 +const long int sum_count = 4; // 평균 내는 횟수
33 -const long interval = 500; // 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms) 33 +const long interval = 50; // 충격을 감지후 다음 충격을 감지하는 최소 간극 시간 (ms)
34 unsigned long previousMillis = 0; // 최초 시작시간 34 unsigned long previousMillis = 0; // 최초 시작시간
35 +long shock_sum = 0; // 누적 충격값
35 36
36 37
37 /* 사용자지정함수부 38 /* 사용자지정함수부
...@@ -80,9 +81,11 @@ void accel_calculate() { ...@@ -80,9 +81,11 @@ void accel_calculate() {
80 ac_z = Wire.read() << 8 | Wire.read() ; 81 ac_z = Wire.read() << 8 | Wire.read() ;
81 82
82 //맵핑화 시킨 것 - 즉 10000으로 맵핑시킴 83 //맵핑화 시킨 것 - 즉 10000으로 맵핑시킴
83 - normal_x = map(int(ac_x), -16384, 16384, 0, mapping_value); 84 + normal_x = map(int(ac_x), -16384, 16384, -5000, mapping_value);
84 - normal_y = map(int(ac_y), -16384, 16384, 0, mapping_value); 85 + normal_y = map(int(ac_y), -16384, 16384, -5000, mapping_value);
85 - normal_z = map(int(ac_z), -16384, 16384, 0, mapping_value); 86 + normal_z = map(int(ac_z), -16384, 16384, -5000, mapping_value);
87 +
88 + //normal_z = map(int(ac_z), -16384, 16384, -1000, mapping_value);
86 89
87 //각도계산 deg -> 각도 90 //각도계산 deg -> 각도
88 deg = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg 91 deg = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg
...@@ -95,6 +98,15 @@ void Emergency_state_(){ ...@@ -95,6 +98,15 @@ void Emergency_state_(){
95 digitalWrite(Pin_Relay , HIGH); // 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다. 98 digitalWrite(Pin_Relay , HIGH); // 릴레이핀을 True값으로 바꿔 13번 핀의 LED를 ON시킨다.
96 Serial.print("SHOCK level : "); 99 Serial.print("SHOCK level : ");
97 Serial.println(shock_level); // Serial 모니터로 확인 100 Serial.println(shock_level); // Serial 모니터로 확인
101 + Serial.print(" x: ");
102 + Serial.print(deltha_x[0]);
103 + Serial.print(" y: ");
104 + Serial.print(deltha_y[0]);
105 + Serial.print(" z: ");
106 + Serial.println(deltha_z[0]);
107 +
108 + /*Serial.print(" deltha_1 : "); Serial.print(deltha_x[1]);
109 + Serial.print(" deltha_2 : "); Serial.println(deltha_x[2]);*/
98 } 110 }
99 111
100 void Shock_Sensing(){ 112 void Shock_Sensing(){
...@@ -190,13 +202,22 @@ void setup() { ...@@ -190,13 +202,22 @@ void setup() {
190 202
191 void loop() { 203 void loop() {
192 value_init(); //가속도-각도 관련 초기값 선언 204 value_init(); //가속도-각도 관련 초기값 선언
193 - unsigned long currentMillis = millis(); 205 + //---------dump--------------------do not erase yet-
206 + //unsigned long currentMillis = 0;
207 + //previousMillis = currentMillis;
208 + //if(currentMillis - previousMillis >= interval){
209 + //if(currentMillis - previousMillis >= interval){
210 + //--------------------------------------------------
194 211
195 - if(currentMillis - previousMillis >= interval){
196 Shock_Sensing(); 212 Shock_Sensing();
197 if(State_Parameter == true){ 213 if(State_Parameter == true){
198 - bluetooth.write(shock_level); // 블루투스로 충격정도 전송 214 + shock_sum += deltha;
199 - previousMillis = currentMillis; 215 + //currentMillis = millis();
200 } 216 }
217 + if(State_Parameter == false && shock_sum != 0){
218 + //bluetooth.write(char_maker(shock_sum)); // 블루투스로 충격정도 전송 (shock_maker 라는 char 리턴함수를 통해 진동강도 전송)
219 + Serial.print("누적 충격값 : ");
220 + Serial.println(shock_sum); // 충격 누적값 전송
221 + shock_sum = 0; // 충격의 지속이 끝났으니 원래값인 0으로 초기화
201 } 222 }
202 } 223 }
......