Akuta Fall anmälaren med panik-knappen (4 / 17 steg)
Steg 4: Programmering ATmega328P mikrokontroller med Arduino Uno
Den kompletta Arduino programmet bifogas härmed. Du kan behöva kalibrera MPU sensorn för att få korrekta resultat. Du kan också behöva justera de tröskelvärden som används i programmet. Kontrollera att Arduino tråd bibliotek är installerat.
MPU-6050 kort exempel skiss
Public Domain
#include
CONST int MPU_addr = 0x68; I2C adress MPU-6050
int16_t AcX AVAL, AcZ, Tmp, GyX, GyY, GyZ;
float ax = 0, ay = 0, az = 0, gx = 0, gy = 0, gz = 0;
int data [STORE_SIZE] [5]. matris för spara senaste data
byte currentIndex = 0; lagrar nuvarande data vektorindex (0-255)
booleska hösten = false; butiker om en nedgång skett
booleska trigger1 = false; butiker om första trigger (lägre tröskel) har inträffat
booleska trigger2 = false; butiker om andra trigger (övre tröskelvärde) har inträffat
booleska trigger3 = false; butiker om tredje trigger (orientering ändra) har inträffat
byte trigger1count = 0; lagrar de senaste räkningarna sedan utlösa 1 sattes sant
byte trigger2count = 0; lagrar de senaste räkningarna sedan utlösa 2 sattes sant
byte trigger3count = 0; lagrar de senaste räkningarna sedan utlösa 3 sattes sant
int angleChange = 0;
void setup() {
Wire.BEGIN();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); PWR_MGMT_1 register
Wire.write(0); satt till noll (vaknar upp MPU-6050)
Wire.endTransmission(true);
Serial.BEGIN(9600);
pinMode (11, OUTPUT);
digitalWrite (11, hög).
}
void loop() {
mpu_read();
2050, är 77, 1947 värden för kalibrering av accelerometer
värden kan vara annorlunda för dig
AX = (AcX-2050) / 16384.00;
AY = (AVAL-77) / 16384.00;
AZ = (AcZ-1947) / 16384.00;
270, 351, 136 för gyroskop
GX = (GyX + 270) / 131.07;
Gy = (GyY-351) / 131.07;
gz = (GyZ + 136) / 131.07;
beräkning av Amplitute vactor för 3 axel
flyta Raw_AM = pow(pow(ax,2)+pow(ay,2)+pow(az,2),0.5);
int är = Raw_AM * 10; som värden inom 0 till 1, jag multipliceras
det av för att använda om annat villkorar
Serial.println(am);
Serial.println(PM);
Delay(500);
om (trigger3 == true) {
trigger3count ++;
Serial.println(trigger3count);
om (trigger3count > = 10) {
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5);
Delay(10);
Serial.println(angleChange);
om ((angleChange > = 0) & & (angleChange < = 10)) {//if orientering förändringar är fortfarande mellan 0-10 grader
falla = sant; trigger3 = false; trigger3count = 0;
Serial.println(angleChange);
}
annat {//user återfått normala orientering
trigger3 = false; trigger3count = 0;
Serial.println ("TRIGGER 3 AVAKTIVERAS");
}
}
}
om (falla == true) {//in-händelse för en höst upptäckt
Serial.println ("FALL UPPTÄCKS");
digitalWrite (11, låg).
Delay(20);
digitalWrite (11, hög).
falla = false;
Exit(1);
}
om (trigger2count > = 6) {//allow 0.5s för orientering förändring
trigger2 = false; trigger2count = 0;
Serial.println ("TRIGGER 2 DECACTIVATED");
}
om (trigger1count > = 6) {//allow 0.5s för AM att bryta övre tröskelvärde
trigger1 = false; trigger1count = 0;
Serial.println ("TRIGGER 1 DECACTIVATED");
}
om (trigger2 == true) {
trigger2count ++;
angleChange=acos(((double)x*(double)bx+(double)y*(double)by+(double)z*(double)bz)/(double)AM/(double)BM);
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5); Serial.println(angleChange);
om (angleChange > = 30 & & angleChange < = 400) {//if orientering förändringar av mellan 80-100 grader
trigger3 = sant; trigger2 = false; trigger2count = 0;
Serial.println(angleChange);
Serial.println ("TRIGGER 3 aktiverad");
}
}
om (trigger1 == true) {
trigger1count ++;
om (AM > = 12) {//if AM raster övre tröskelvärde (3g)
trigger2 = sant;
Serial.println ("TRIGGER 2 aktiveras");
trigger1 = false; trigger1count = 0;
}
}
om (AM < = 2 & & trigger2 == false) {//if AM raster lägre tröskel (0,4 g)
trigger1 = sant;
Serial.println ("TRIGGER 1 aktiveras");
}
Det verkar att dröjsmål behövs för att inte täppa till hamnen
Delay(100);
}
void mpu_read() {
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); börjar med register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); begäran sammanlagt 14 register
AcX=Wire.read() << 8|Wire.read(); 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read() << 8|Wire.read(); 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read() << 8|Wire.read(); 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.Read() << 8|Wire.read(); 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read() << 8|Wire.read(); 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read() << 8|Wire.read(); 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read() << 8|Wire.read(); 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
}