Showing
2 changed files
with
105 additions
and
31 deletions
| 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; |
| 168 | - } | 215 | + //currentMillis = millis(); |
| 169 | - } | 216 | + } |
| 170 | -} | 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으로 초기화 | ||
| 222 | + } | ||
| 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 | + } |
| 201 | - } | 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으로 초기화 | ||
| 222 | + } | ||
| 202 | } | 223 | } | ... | ... |
-
Please register or login to post a comment