Integrate fall detector sms with bluetooth

Hi, I need help to integrate these two codes, the first code is used to detect falls and send an SMS to a recipient number, the second code is used so that through Bluetooth, I can use the mit app inventor to send the number that I I want to send the sms and the message to be sent

I tried everything to integrate these two codes, but it's not working.I need help

the codes are below:

the first code:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_MPU6050.h>
#include <SoftwareSerial.h>
#include <String.h>
#include <EEPROM.h>

//----------------------------------------------------------------------------------//

#define TRIGGER_PIN 9 // Pinagem do sensor ultrassônico
#define ECHO_PIN 10 // Pinagem do sensor ultrassônico
#define GSM_RX 7 // Pinagem do módulo GSM SIM900A
#define GSM_TX 8 // Pinagem do módulo GSM SIM900A
#define THRESHOLD_DISTANCE 10 // Valor de distância para detecção de presença
#define FALL_THRESHOLD_X 5 // Valor de aceleração no eixo X para detecção de queda
#define MAX_DISTANCE_PRESENCE 10 // Distância máxima para considerar a presença (ajuste conforme necessário)

//----------------------------------------------------------------------------------//

SoftwareSerial gsmSerial(GSM_RX, GSM_TX); // Comunicação com o módulo GSM via SoftwareSerial
Adafruit_MPU6050 mpu; // Objeto para interagir com o sensor MPU6050

bool presenceDetected = false;
unsigned long lastPresenceTime = 0;
const unsigned long presenceInterval = 5000; // Intervalo mínimo entre detecções de presença (5 segundos)

// Declaração das funções
bool detectPresence();
bool checkUltrasonicSensor();
bool checkMPU6050();
int detectFall();

//---------------------------------------// DEFINIÇÃO DE FUNCIONAMENTO DE CADA FUNÇÃO //---------------------------------------//

// Função para detectar presença usando o sensor ultrassônico
bool detectPresence() {
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long duration = pulseIn(ECHO_PIN, HIGH);

  // Verifica se houve timeout durante a leitura do sinal de eco
  if (duration == 0) {
    Serial.println("Erro no sensor ultrassônico. Verifique a conexão.");
    return false;
  }

  float echoDistance = (duration / 2.0) / 29.1;   // Calcula a distância com base na duração do pulso de eco
  return echoDistance < MAX_DISTANCE_PRESENCE;   // Retorna verdadeiro se a distância estiver abaixo do valor definido para considerar a presença
}

// Função para verificar o funcionamento do sensor ultrassônico
bool checkUltrasonicSensor() {
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH);

  // Verifica se houve timeout durante a leitura do sinal de eco
  if (duration == 0) {
    Serial.println("Erro no sensor ultrassônico. Verifique a conexão.");
    return false;
  }


  // Calcula a distância com base na duração do pulso de eco
  float echoDistance = (duration / 2.0) / 29.1;


  // Retorna verdadeiro se a distância estiver abaixo do limiar para considerar a presença
  return echoDistance < MAX_DISTANCE_PRESENCE;
}

// Função para verificar o funcionamento do sensor MPU6050
bool checkMPU6050() {
  sensors_event_t accel, gyro, temp;
  if (!mpu.getEvent(&accel, &gyro, &temp)) {
    return false;
  }

  float accelerationX = accel.acceleration.x;
  /*Serial.print("Aceleracao no eixo X: ");
  Serial.println(accelerationX);*/
  return true; // Retorna verdadeiro se o sensor MPU6050 estiver funcionando corretamente
}

// Função para detectar a queda com base na aceleração no eixo X
int detectFall() {
  sensors_event_t accel, gyro, temp;
  if (!mpu.getEvent(&accel, &gyro, &temp)) {
    Serial.println("Erro ao ler eventos do MPU6050. Verifique a conexão do sensor.");
    return 0;
  }

  float accelerationX = accel.acceleration.x;
  return abs(accelerationX);   // Retorna o valor absoluto da aceleração no eixo X
}

//----------------------------------------------------------------------------------//

void setup() {
  Serial.begin(9600); // Inicialização da comunicação serial com o monitor serial
  Serial.println("");
  Serial.println("Bem-vindo(a) ao projeto N.I.N.A.! Por favor, aguarde a inicialização do sistema!");
  Serial.println("");
  delay(1000);

  Serial.println("Iniciando o módulo GSM...");
  gsmSerial.begin(9600); // Inicialização da comunicação serial com o módulo GSM
  delay(5);
  gsmSerial.println("AT+CMGF=1"); // Configura o modo de mensagem para texto
  delay(1000);
  Serial.println("Módulo GSM inicializado!");
  delay(1000);

  // Inicialização do sensor MPU6050 e teste de funcionamento
  Serial.println("Iniciando o chip MPU6050...");
  if (!mpu.begin()) {
    Serial.println("Erro ao iniciar o chip MPU6050, verifique a conexão e tente novamente.");
    while (1); // Em caso de falha, entra em um loop infinito
  }
  else {
    Serial.println("Chip MPU6050 inicializado!");
  }

  Serial.println("Configurando faixa de aceleração do MPU6050...");
  mpu.setAccelerometerRange(MPU6050_RANGE_16_G); // Configuração da faixa de aceleração do MPU6050
  Serial.println("Faixa de aceleração do MPU6050 configurada!");

  Serial.println("Configurando sensor ultrassônico...");
  pinMode(TRIGGER_PIN, OUTPUT); // Configuração do pino de trigger do sensor ultrassônico como saída
  pinMode(ECHO_PIN, INPUT); // Configuração do pino de echo do sensor ultrassônico como entrada
  Serial.println("Sensor Ultrassônico Configurado!");

  Serial.println("");
  Serial.println("Inicialização realizada com sucesso! Aguardando detecção de presença...");
  Serial.println("");
  Serial.println("XXXXXXXX");
  delay(1000);
}

//----------------------------------------------------------------------------------//

void loop() {
  unsigned long currentMillis = millis();

  // Verifica se é o momento adequado para detectar presença
  if (currentMillis - lastPresenceTime >= presenceInterval) {
   
    // Verifica se a presença foi detectada pelo sensor ultrassônico
    if (detectPresence()) {
      long duration, echoDistance;

      // Gera um pulso para o sensor ultrassônico
      digitalWrite(TRIGGER_PIN, LOW);
      delayMicroseconds(2);
      digitalWrite(TRIGGER_PIN, HIGH);
      delayMicroseconds(10);
      digitalWrite(TRIGGER_PIN, LOW);

      // Mede a duração do pulso de eco
      duration = pulseIn(ECHO_PIN, HIGH);

      // Verifica se houve timeout durante a leitura do sinal de eco
      if (duration == 0) {
        Serial.println("Timeout durante a leitura do sinal de eco. Verifique a conexão do sensor ultrassônico.");
        delay(2000); // Aguarda 2 segundos antes de tentar novamente
        return;
      }

      // Calcula a distância com base na duração do pulso de eco
      float distance = (duration / 2.0) / 29.1;

      // Verifica se a distância está abaixo do valor desejado para considerar a presença (THRESHOLD_DISTANCE é definida no começo do código)
      if (distance < THRESHOLD_DISTANCE) {
        Serial.println("");
        Serial.println("Presença detectada! Sistema em alerta para possíveis impactos...");

        while(distance < THRESHOLD_DISTANCE) {

          //--------------------------------------------//

          long duration, echoDistance;

         // Gera um pulso para o sensor ultrassônico
          digitalWrite(TRIGGER_PIN, LOW);
          delayMicroseconds(2);
          digitalWrite(TRIGGER_PIN, HIGH);
          delayMicroseconds(10);
         digitalWrite(TRIGGER_PIN, LOW);

          // Mede a duração do pulso de eco
         duration = pulseIn(ECHO_PIN, HIGH);

          // Verifica se houve timeout durante a leitura do sinal de eco
          if (duration == 0) {
           Serial.println("Timeout durante a leitura do sinal de eco. Verifique a conexão do sensor ultrassônico.");
           delay(2000); // Aguarda 2 segundos antes de tentar novamente
            return;
          }

          // Calcula a distância com base na duração do pulso de eco
          distance = (duration / 2.0) / 29.1;

          //-----------------------------------------------//

          // Verifica se o sensor MPU6050 está funcionando corretamente
          if (!checkMPU6050()) {
          delay(2000); // Aguarda 2 segundos antes de tentar novamente
          return;
          }

          // Detecta a queda com base na aceleração no eixo X
          int fallValueX = detectFall();

          // Se a queda for detectada, envia uma mensagem SMS
          if (fallValueX > FALL_THRESHOLD_X) {
      
          Serial.println("Queda detectada! Enviando SMS!");
          gsmSerial.print("AT+CMGS=\"");
          gsmSerial.print("+5512992580220");
          gsmSerial.println("\"");
          delay(1000);
          gsmSerial.print("Queda detectada!");
          delay(100);
          gsmSerial.write(26); // Envio do caractere de controle (Ctrl-Z)
          delay(5000);
          Serial.println("Mensagem enviada com sucesso!");
          delay(1000);
          lastPresenceTime = currentMillis; // Atualiza o tempo da última detecção de presença
          }

          if (distance > THRESHOLD_DISTANCE) {
            Serial.println("Presença não detectada. Sistema de alertas suspenso.");
          }
        }
      } 
    }
  }
}

the second code:

#include <SoftwareSerial.h>
#include <EEPROM.h>

#define BT_Rx 0
#define BT_Tx 1

SoftwareSerial BTSerial(BT_Rx, BT_Tx);
String BlSent;
String NumeroSalvo;
String SMSmessage;

void CallNumb() {
  NumeroSalvo = "";
  BlSent = "";
  while (BTSerial.available()) {
    char c = BTSerial.read();
    BlSent += c;
    delay (5);
  }
  NumeroSalvo = BlSent;
  writeStringToEEPROM(0, NumeroSalvo);
}

void SMSm() {
  SMSmessage = "";
  BlSent = "";
  while (BTSerial.available()) {
    char s = BTSerial.read();
    BlSent += s;
    delay (5);
  }
  SMSmessage = BlSent;
  writeStringToEEPROM(100, SMSmessage);
}


void writeStringToEEPROM(int startAddress, const String &data) {
  for (int i = 0; i < data.length(); i++) { //declara variável; o loop continuará enquanto essa condição for verdadeira; (nesse caso) a cada término do loop i aumentará em 1
    EEPROM.write(startAddress + i, data[i]);
  }
  EEPROM.write(startAddress + data.length(), '\0'); // Adiciona o caractere nulo no final para indicar o término da string
}

String readStringFromEEPROM(int startAddress) {
  String result = "";
  char character = EEPROM.read(startAddress);
  int i = 0;
  while (character != '\0') {
    result += character;
    i++;
    character = EEPROM.read(startAddress + i);
  }
  return result;
}

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
  if (readStringFromEEPROM(100) == "") {
    writeStringToEEPROM(100, "Sofri um acidente! Preciso de ajuda imediata!");
  }
  if (readStringFromEEPROM(0) == ""){
    writeStringToEEPROM(0, "Pendente.");
  }
}

void loop() {

  if (BTSerial.available()) {
    if (BTSerial.read() != '+') {
      SMSm();
    }
    else {
      CallNumb();
    }
  } 

  if (readStringFromEEPROM(0).length() > 0 || readStringFromEEPROM(100).length() > 0) {
    Serial.println("Número de telefone salvo: " + readStringFromEEPROM(0));
    Serial.println("Recado salvo como: " + readStringFromEEPROM(100));
    delay(5000);
  } else {
    Serial.println("ERRO DESCONHECIDO");
  }
}

I don't think anyone has ever been able to get TWO version of software serial to work. Why not take the easy way out and use an Arduino board with multiple real serial UARTs?

I'm new to Arduino. I didn't quite understand what you meant by that.

Post your best attempt, and explain the problems you are having.

As suggested, it is extremely difficult, if not impossible, to use SoftwareSerial for two different devices at the same time. Choose a different Arduino with more than one hardware serial port.

Well, you asked about combining TWO programs, each of which uses software serial to connect to different devices. Since software serial only works with a single device, you cannot expect to combine those two programs.
If you use an Arduino with multiple serial ports and get your two programs to run on that Arduino, then there is a chance the two program could be combined.

you could simplify the project by using a microcontroller with builtin Bluettoth, e.g. the the ESP32 has plenty of IO facilities for your sensors, hardware serial ports, builtin WiFi, Bluetooth Classic and BLE and is supported by the Arduino IDE

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.