Danke HotSystems für deine Antwort.
Das I2C ist für den Gyro Sensor um den Fall zu erkennen.
Das GPRS Modul ist auf Pin 2,3.
Das GPS Modul ist auf Pin 5,6.
Ganzer Code siehe unten
#include <Wire.h>
#include "SIM900.h"
#include "call.h"
#include "sms.h"
#include <Arduino.h>
#include <SoftwareSerial.h>
//#include "U8glib.h"
#define LED_BUILTIN 13
#define GPS_TX 6
#define GPS_RX 5
#define GPS_PPS 4
#include "GPS_MTK333X_SoftwareSerial.h"
GPS_MTK333X_SoftwareSerial GPS(GPS_RX, GPS_TX);
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
SMSGSM sms;
CallGSM call;
#define SDA_PORT PORTC
#define SDA_PIN 4
#define SCL_PORT PORTC
#define SCL_PIN 5
char sms_position;
char sms_text[10]="Hallo1";
//char c[10]="Hallo1";
char buffer[30];
int i;
String Uhrzeit;
int numdata;
boolean started=false;
boolean hilfe=false;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
float AX = 0, AY = 0, AZ = 0, GY = 0, GX = 0, GZ = 0;
boolean Fall = false; //stores if a fall has occurred
boolean trigger1 = false; //stores if first trigger (lower threshold) has occurred
boolean trigger2 = false; //stores if second trigger (upper threshold) has occurred
boolean trigger3 = false; //stores if third trigger (orientation change) has occurred
byte trigger1counter = 0; //stores the counters past since trigger 1 was set true
byte trigger2counter = 0; //stores the counters past since trigger 2 was set true
byte trigger3counter = 0; //stores the counters past since trigger 3 was set true
int Winkel = 0;
float lati;
float longi;
void setup() {
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
Serial.println(F("Startup"));
/*while (!GPS.begin(9600)) {
Serial.println(F("GPS notready"));
delay(1000);
}*/
/*// GPS.sendMTKcommand(220, F(",1000")); // 220 PMTK_API_SET_FIX_CTL (MTK3339)
GPS.sendMTKcommand(300, F(",1000,0,0,0,0")); // 300 PMTK_API_SET_FIX_CTL
GPS.sendMTKcommand(225, F(",0")); // 225 PMTK_SET_PERIODIC_MODE
// GPS.sendMTKcommand(353, F(",1,0,0,0,0"));
GPS.sendMTKcommand(351, F(",1")); // 351 PMTK_API_SET_SUPPORT_QZSS_NMEA
GPS.sendMTKcommand(314, F(",0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"));
delay(5000);*/
if(gsm.begin(9600)){
Serial.println("\nstatus=Ready");
}
else{
Serial.println("\nstatus=IDLE");
}
/* u8g.firstPage();
do {
titelbild();
} while( u8g.nextPage() );*/
}
void loop() {
if (GPS.check() && GPS.isTimeUpdate()) {
bool f = GPS.isStatusUpdate();
GPSInfo_t gpsInfo = GPS.value();
Serial.print(gpsInfo.date, HEX);
Serial.write(' ');
Serial.print(gpsInfo.time, HEX);
Serial.write(' ');
if (f) {
Serial.print(gpsInfo.satellites, DEC);
Serial.write(' ');
Serial.print(gpsInfo.dop / 100.0);
Serial.write(' ');
Serial.println(gpsInfo.latitude / 600000.0, 6);
float a = (gpsInfo.latitude);
float lati = (gpsInfo.latitude / 600000.0);
Serial.println(a);
Serial.println(lati,6);
Serial.write(' ');
Serial.println(gpsInfo.longitude / 600000.0, 6);
float b = (gpsInfo.longitude);
float longi = (b / 600000.0);
Serial.println(b);
Serial.println(longi,6);
Serial.write(' ');
Serial.print(gpsInfo.altitude / 100.0);
Serial.write(' ');
Serial.print(gpsInfo.speed * 0.01852);
Serial.write(' ');
Serial.print(gpsInfo.course / 100.0);
Serial.write(' ');
}
Serial.println();
}
mpu_read();
AX = (AcX + 3652) / 16384.00;
AY = (AcY - 1785) / 16384.00;
AZ = (AcZ - 973) / 16384.00;
GX = (GyX + 32) / 131.00;
GY = (GyY - 35) / 131.00;
GZ = (GyZ - 15) / 131.00;
float Roh_Geschwindigkeit = pow(pow(AX, 2) + pow(AY, 2) + pow(AZ, 2), 0.5);
int Geschwindigkeit = Roh_Geschwindigkeit * 10; // Mit 10 Multiplizieren um IF-Bedingung mit besseren Werten zu nutzen.
Serial.println(Geschwindigkeit);
if (Geschwindigkeit <= 2 && trigger2 == false) { //if AM breaks lower threshold (0.4g)
trigger1 = true;
Serial.println("trigger 1 AKTIVIERT");
}
if (trigger1 == true) {
trigger1counter++;
if (Geschwindigkeit >= 12) { //if AM breaks upper threshold (3g)
trigger2 = true;
Serial.println("trigger 2 AKTIVIERT");
trigger1 = false; trigger1counter = 0;
}
}
if (trigger2 == true) {
trigger2counter++;
//Winkel=acos(((double)x*(double)bx+(double)y*(double)by+(double)z*(double)bz)/(double)AM/(double)BM);
Winkel = pow(pow(GX, 2) + pow(GY, 2) + pow(GZ, 2), 0.5); //Serial.println(Winkel);
if (Winkel >= 30 && Winkel <= 400) { //if orientation changes by between 80-100 degrees
trigger3 = true; trigger2 = false; trigger2counter = 0;
Serial.println(Winkel);
Serial.println("trigger 3 ACTIVIERT");
}
}
if (trigger3 == true) {
trigger3counter++;
Serial.println(trigger3counter);
if (trigger3counter >= 10) {
Winkel = pow(pow(GX, 2) + pow(GY, 2) + pow(GZ, 2), 0.5);
delay(10);
Serial.println(Winkel);
if ((Winkel >= 0) && (Winkel <= 10)) { //if orientation changes remains between 0-10 degrees
Fall = true; trigger3 = false; trigger3counter = 0;
Serial.println(Winkel);
}
else { //user regained normal orientation
trigger3 = false; trigger3counter = 0;
Serial.println("trigger 3 DEACTIVIERT");
}
}
}
if (trigger1counter >= 6) { //allow 0.5s for AM to break upper threshold
trigger1 = false; trigger1counter = 0;
Serial.println("trigger 1 DEAKTIVIERT");
}
if (trigger2counter>=6) { //allow 0.5s for orientation change
trigger2 = false; trigger2counter = 0;
Serial.println("trigger 2 DEAKTIVIERT");
}
if (Fall==true) {
Serial.println("FALL DETECTED");
call.Call("015770885359");
Fall=false;
hilfe=true;
}
if(hilfe==true){
sms_position=sms.IsSMSPresent(SMS_UNREAD);
if (!sms_position){}
else{
Serial.print("SMS postion:");
Serial.println(sms_position,DEC);
sms.GetSMS(sms_position,"015770885359", sms_text, 100);
// now we have phone number string in phone_num
Serial.println("015770885359");
// and SMS text in sms_text
Serial.println(sms_text);
started=true;
}
delay(1000);
}
if(started==true){
buffer[40] = ("https://www.google.de/maps/place/%f,%f",lati,longi);
if (sms.SendSMS("015770885359",buffer)){
//Serial.println("\nSMS sent OK");
hilfe=false;
//if NO SPACE ,you need delte SMS from position 1 to position 20
//please enable this four lines
sms.DeleteSMS(i);
started=false;
}}
delay(100);
}
void mpu_read() {
Wire.beginTransmission(0x68);
Wire.write(0x3B); // starte mit Register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(0x68, 14, true); // 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)
}
/*void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 52, 36, "SOS");
u8g.drawStr( 18, 60, "Anruf waehlt..");
u8g.drawCircle(64,30,18);
}*/
/*void titelbild(void){
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 20, 20, "Projektarbeit");
u8g.drawStr( 50, 40, "2020");
u8g.drawStr( 20, 60, "Dennis Dorow");
}*/