Untitled
unknown
ada
3 years ago
18 kB
6
Indexable
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <EEPROM.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
#define BLYNK_TEMPLATE_ID "TMPLhRpujk5E"
#define BLYNK_DEVICE_NAME "IOT Pulse Oximeter"
#define BLYNK_AUTH_TOKEN "FC37yNTnXcdM_UfeRTdb91TzlKzHd1C6"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "💀 ALPHA 💀";
char pass[] = "2552425524";
BlynkTimer timer;
BLYNK_WRITE(V0)
{
int value = param.asInt();
Blynk.virtualWrite(V1, value);
}
BLYNK_CONNECTED()
{
Blynk.setProperty(V3, "offImageUrl", "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations.png");
Blynk.setProperty(V3, "onImageUrl", "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations_pressed.png");
Blynk.setProperty(V3, "url", "https://docs.blynk.io/en/getting-started/what-do-i-need-to-blynk/how-quickstart-device-was-made");
}
void myTimerEvent()
{
Blynk.virtualWrite(V2, millis() / 1000);
}
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = 0;
const int mood = 16;
String PHONE = "+8801533378721";
const int totalPhoneNo = 5;
const int button = D8;
const int buzzer = D7;
int temp = 0;
String phoneNo[totalPhoneNo] = {"","","","",""};
int offsetPhone[totalPhoneNo] = {0,14,28,42,56};
String tempPhone = "";
#define rxGSM 0
#define txGSM 2
SoftwareSerial sim800(rxGSM,txGSM);
#define rxGPS 14
#define txGPS 12
SoftwareSerial neogps(rxGPS,txGPS);
TinyGPSPlus gps;
String smsStatus;
String senderNumber;
String receivedDate;
String msg;
const int MPU_addr=0x68;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
float ax=0, ay=0, az=0, gx=0, gy=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 trigger1count=0; //stores the counts past since trigger 1 was set true
byte trigger2count=0; //stores the counts past since trigger 2 was set true
byte trigger3count=0; //stores the counts past since trigger 3 was set true
int angleChange=0;
int period = 10000;
unsigned long time_now = 0;
int flagcall = 1;
int moodcall = 1;
void onBeatDetected()
{
Serial.println("Beat Detected!");
}
void setup() {
Serial.begin(115200);
Serial.println("NodeMCU USB serial initialize");
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.println("Wrote to IMU");
sim800.begin(9600);
Serial.println("SIM800L serial initialize");
delay(100);
neogps.begin(9600);
Serial.println("NEO6M serial initialize");
delay(100);
sim800.listen();
neogps.listen();
pinMode(button, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(mood, INPUT);
EEPROM.begin(512);
writeToEEPROM(offsetPhone[0],"");
writeToEEPROM(offsetPhone[1],"");
writeToEEPROM(offsetPhone[2],"");
writeToEEPROM(offsetPhone[3],"");
writeToEEPROM(offsetPhone[4],"");
phoneNo[0] = "";
phoneNo[1] = "";
phoneNo[2] = "";
phoneNo[3] = "";
phoneNo[4] = "";
offsetPhone[0] = 0;
offsetPhone[1] = 14;
offsetPhone[2] = 28;
offsetPhone[3] = 42;
offsetPhone[4] = 56;
phoneNo[0] = "+8801533378721";
writeToEEPROM(offsetPhone[0],PHONE);
Serial.println("List of Registered Phone Numbers");
for (int i = 0; i < totalPhoneNo; i++){
phoneNo[i] = readFromEEPROM(offsetPhone[i]);
if(phoneNo[i].length() != 14)
{phoneNo[i] = "";Serial.println(String(i+1)+": empty");}
else
{Serial.println(String(i+1)+": "+phoneNo[i]);}
}
senderNumber="";
msg="";
delay(9000);
sim800.println("AT+CMGF=1"); //SMS text mode
delay(2000);
sim800.println("AT+CLIP=1"); //Enable Caller ID
delay(2000);
sim800.println("AT+CNMI=1,2,0,0,0"); //Enable Caller ID
delay(2000);
sim800.listen();
}
void loop() {
temp = digitalRead(mood);
if (temp == HIGH) {
if(moodcall == 1){
moodcall = 2;
digitalWrite(buzzer,HIGH);
delay(500);
digitalWrite(buzzer,LOW);
delay(500);
digitalWrite(buzzer,HIGH);
delay(500);
digitalWrite(buzzer,LOW);
Serial.println("MOOD 2");
stu();
}
else if(moodcall == 2){
moodcall = 1;
digitalWrite(buzzer,HIGH);
delay(1000);
digitalWrite(buzzer,LOW);
Serial.println("MOOD 1");
setup();
}
}
if(moodcall == 1){
while(sim800.available()){
Data(sim800.readString());
//Serial.println(sim800.readString());
}
while(Serial.available()){
sim800.println(Serial.readString());
}
mpu_read();
ax = (AcX-2050)/16384.00;
ay = (AcY-77)/16384.00;
az = (AcZ-1947)/16384.00;
gx = (GyX+270)/131.07;
gy = (GyY-351)/131.07;
gz = (GyZ+136)/131.07;
// calculating Amplitute vactor for 3 axis
float Raw_Amp = pow(pow(ax,2)+pow(ay,2)+pow(az,2),0.5);
int Amp = Raw_Amp * 10; // Mulitiplied by 10 bcz values are between 0 to 1
if (Amp<=2 && trigger2==false){ //if AM breaks lower threshold (0.4g)
trigger1=true;
Serial.println("TRIGGER 1 ACTIVATED");
}
if (trigger1==true){
trigger1count++;
if (Amp>=12){ //if AM breaks upper threshold (3g)
trigger2=true;
Serial.println("TRIGGER 2 ACTIVATED");
trigger1=false; trigger1count=0;
}
}
if (trigger2==true){
trigger2count++;
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5); Serial.println(angleChange);
if (angleChange>=30 && angleChange<=400){ //if orientation changes by between 80-100 degrees
trigger3=true; trigger2=false; trigger2count=0;
Serial.println(angleChange);
Serial.println("TRIGGER 3 ACTIVATED");
}
}
if (trigger3==true){
trigger3count++;
if (trigger3count>=10){
angleChange = pow(pow(gx,2)+pow(gy,2)+pow(gz,2),0.5);
//delay(10);
Serial.println(angleChange);
if ((angleChange>=0) && (angleChange<=10)){ //if orientation changes remains between 0-10 degrees
fall=true; trigger3=false; trigger3count=0;
Serial.println(angleChange);
}
else{ //user regained normal orientation
trigger3=false; trigger3count=0;
Serial.println("TRIGGER 3 DEACTIVATED");
}
}
}
if (fall==true){ //in event of a fall detection
Serial.println("FALL DETECTED");
time_now = millis();
while(millis() < time_now + period){
//wait approx. [period] ms
temp = digitalRead(button);
Serial.println("TRIGGER");
digitalWrite(buzzer, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100);
if (temp == HIGH) {
flagcall = 0;
break;
delay(1000);
}
}
digitalWrite(buzzer,LOW);
if(flagcall==1){
Serial.println("TRIGGER");
sendLocation1(PHONE);
}
flagcall = 1;
fall=false;
}
if (trigger2count>=6){ //allow 0.5s for orientation change
trigger2=false; trigger2count=0;
Serial.println("TRIGGER 2 DECACTIVATED");
}
if (trigger1count>=6){ //allow 0.5s for AM to break upper threshold
trigger1=false; trigger1count=0;
Serial.println("TRIGGER 1 DECACTIVATED");
}
delay(100);
temp = digitalRead(button);
if (temp == HIGH) {
Serial.println("press");
sendLocation2(PHONE);
digitalWrite(buzzer,HIGH);
delay(2000);
digitalWrite(buzzer,LOW);
}
delay(100);
}
if(moodcall == 2){
pox.update();
Blynk.run();
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
if (millis() - tsLastReport > REPORTING_PERIOD_MS)
{
Serial.print("Heart rate:");
Serial.print(BPM);
Serial.print(" SpO2:");
Serial.print(SpO2);
Serial.println(" %");
Blynk.virtualWrite(V1, BPM);
Blynk.virtualWrite(V2, SpO2);
tsLastReport = millis();
}
}
}
void Data(String buff){
Serial.println(buff);
unsigned int len, index;
index = buff.indexOf("\r");
buff.remove(0, index+2);
buff.trim();
if(buff != "OK"){
Serial.println("2");
index = buff.indexOf(":");
String cmd = buff.substring(0, index);
cmd.trim();
Serial.println(cmd);
buff.remove(0, index+2);
if(cmd == "+CMT"){
Serial.println("3");
extractSms(buff);
if(comparePhone(senderNumber)){
doAction(senderNumber);
}
}
}
else{
}
}
void doAction(String phoneNumber){
if(msg == "location"){
sendLocation(phoneNumber);
}
if(msg == "r2="){
Serial.println(offsetPhone[1]);
writeToEEPROM(offsetPhone[1],tempPhone);
phoneNo[1] = tempPhone;
String text = "Phone2 is Registered: ";
text = text + tempPhone;
debugPrint(text);
Reply(text, phoneNumber);
}
else if(msg == "r3="){
writeToEEPROM(offsetPhone[2],tempPhone);
phoneNo[2] = tempPhone;
String text = "Phone3 is Registered: ";
text = text + tempPhone;
Reply(text, phoneNumber);
}
else if(msg == "r4="){
writeToEEPROM(offsetPhone[3],tempPhone);
phoneNo[3] = tempPhone;
String text = "Phone4 is Registered: ";
text = text + tempPhone;
Reply(text, phoneNumber);
}
else if(msg == "r5="){
writeToEEPROM(offsetPhone[4],tempPhone);
phoneNo[4] = tempPhone;
String text = "Phone5 is Registered: ";
text = text + tempPhone;
Reply(text, phoneNumber);
}
else if(msg == "list"){
String text = "";
if(phoneNo[0])
text = text + phoneNo[0]+"\r\n";
if(phoneNo[1])
text = text + phoneNo[1]+"\r\n";
if(phoneNo[2])
text = text + phoneNo[2]+"\r\n";
if(phoneNo[3])
text = text + phoneNo[3]+"\r\n";
if(phoneNo[4])
text = text + phoneNo[4]+"\r\n";
debugPrint("List of Registered Phone Numbers: \r\n"+text);
Reply(text, phoneNumber);
}
else if(msg == "del=1"){
writeToEEPROM(offsetPhone[0],"");
phoneNo[0] = "";
Reply("Phone1 is deleted.", phoneNumber);
}
else if(msg == "del=2"){
writeToEEPROM(offsetPhone[1],"");
phoneNo[1] = "";
debugPrint("Phone2 is deleted.");
Reply("Phone2 is deleted.", phoneNumber);
}
else if(msg == "del=3"){
writeToEEPROM(offsetPhone[2],"");
phoneNo[2] = "";
debugPrint("Phone3 is deleted.");
Reply("Phone3 is deleted.", phoneNumber);
}
else if(msg == "del=4"){
writeToEEPROM(offsetPhone[3],"");
phoneNo[3] = "";
debugPrint("Phone4 is deleted.");
Reply("Phone4 is deleted.", phoneNumber);
}
else if(msg == "del=5"){
writeToEEPROM(offsetPhone[4],"");
phoneNo[4] = "";
debugPrint("Phone5 is deleted.");
Reply("Phone5 is deleted.", phoneNumber);
}
if(msg == "del=all"){
writeToEEPROM(offsetPhone[0],"");
writeToEEPROM(offsetPhone[1],"");
writeToEEPROM(offsetPhone[2],"");
writeToEEPROM(offsetPhone[3],"");
writeToEEPROM(offsetPhone[4],"");
phoneNo[0] = "";
phoneNo[1] = "";
phoneNo[2] = "";
phoneNo[3] = "";
phoneNo[4] = "";
offsetPhone[0] = NULL;
offsetPhone[1] = NULL;
offsetPhone[2] = NULL;
offsetPhone[3] = NULL;
offsetPhone[4] = NULL;
debugPrint("All phone numbers are deleted.");
Reply("All phone numbers are deleted.", phoneNumber);
}
senderNumber="";
msg="";
tempPhone = "";
}
void extractSms(String buff){
unsigned int index;
Serial.println("4");
index = buff.indexOf(",");
senderNumber = buff.substring(1, index-1);
buff.remove(0, index+2);
buff.remove(0,buff.indexOf("\r"));
buff.trim();
index =buff.indexOf("\n\r");
buff = buff.substring(0, index);
buff.trim();
msg = buff;
buff = "";
msg.toLowerCase();
Serial.println(msg);
Serial.println(senderNumber);
String tempcmd = msg.substring(0, 3);
if(tempcmd.equals("r1=") || tempcmd.equals("r2=") ||
tempcmd.equals("r3=") || tempcmd.equals("r4=") ||
tempcmd.equals("r5=")){
tempPhone = msg.substring(3, 17);
msg = tempcmd;
}
}
void Reply(String text, String Phone)
{
//return;
sim800.print("AT+CMGF=1\r");
delay(1000);
sim800.print("AT+CMGS=\""+Phone+"\"\r");
delay(1000);
sim800.print(text);
delay(100);
sim800.write(0x1A); //ascii code for ctrl-26 //sim800.println((char)26); //ascii code for ctrl-26
delay(1000);
Serial.println("SMS Sent Successfully.");
sim800.print("AT+CMGD=1,4");
senderNumber="";
msg="";
tempPhone = "";
}
void writeToEEPROM(int addrOffset, const String &strToWrite)
{
byte len = 14; //strToWrite.length();
for (int i = 0; i < len; i++)
{
EEPROM.write(addrOffset + i, strToWrite[i]);
}
EEPROM.commit();
}
String readFromEEPROM(int addrOffset)
{
int len = 14;
char data[len + 1];
for (int i = 0; i < len; i++)
{
data[i] = EEPROM.read(addrOffset + i);
}
data[len] = '\0';
return String(data);
}
{
boolean flag = 0;
for (int i = 0; i < totalPhoneNo; i++){
phoneNo[i] = readFromEEPROM(offsetPhone[i]);
if(phoneNo[i].equals(number)){
//Serial.println(phoneNo[i]);
flag = 1;
break;
}
}
return flag;
}
boolean compareWithoutCountryCode(String number)
{
boolean flag = 0;
for (int i = 0; i < totalPhoneNo; i++){
phoneNo[i] = readFromEEPROM(offsetPhone[i]);
//remove first 3 digits (country code)
phoneNo[i].remove(0,3);
//Serial.println("meee1: "+phoneNo[i]);
if(phoneNo[i].equals(number)){
//Serial.println(phoneNo[i]);
flag = 1;
break;
}
}
return flag;
}
void sendLocation(String phoneNumber)
{
boolean newData = false;
for (unsigned long start = millis(); millis() - start < 2000;)
{
while (neogps.available())
{
if (gps.encode(neogps.read()))
{newData = true;break;}
}
}
if(newData)
{
newData = false;
String latitude = String(gps.location.lat(), 6);
String longitude = String(gps.location.lng(), 6);
//String speed = String(gps.speed.kmph());
String text = "Latitude= " + latitude;
text += "\n\r";
text += "Longitude= " + longitude;
text += "\n\r";
text += "Speed= " + String(gps.speed.kmph()) + " km/h";
text += "\n\r";
text += "Altitude= " + String(gps.altitude.meters()) + " meters";;
text += "\n\r";
text += "http://maps.google.com/maps?q=loc:" + latitude + "," + longitude;
Reply(text, phoneNumber);
}
}
void sendLocation1(String phoneNumber)
{
boolean newData = false;
for (unsigned long start = millis(); millis() - start < 2000;)
{
while (neogps.available())
{
if (gps.encode(neogps.read()))
{newData = true;break;}
}
}
if(newData)
{
newData = false;
String latitude = String(gps.location.lat(), 6);
String longitude = String(gps.location.lng(), 6);
//String speed = String(gps.speed.kmph());
String text = "Accident Accident";
text += "\n\r";
text += "Latitude= " + latitude;
text += "\n\r";
text += "Longitude= " + longitude;
text += "\n\r";
text += "Speed= " + String(gps.speed.kmph()) + " km/h";
text += "\n\r";
text += "Altitude= " + String(gps.altitude.meters()) + " meters";
text += "\n\r";
text += "http://maps.google.com/maps?q=loc:" + latitude + "," + longitude;
debugPrint(text);
}
}
void sendLocation2(String phoneNumber)
{
boolean newData = false;
for (unsigned long start = millis(); millis() - start < 2000;)
{
while (neogps.available())
{
if (gps.encode(neogps.read()))
{newData = true;break;}
}
}
if(newData)
{
newData = false;
String latitude = String(gps.location.lat(), 6);
String longitude = String(gps.location.lng(), 6);
String text = "Calling for Hellp";
text += "\n\r";
text += "Latitude= " + latitude;
text += "\n\r";
text += "Longitude= " + longitude;
text += "\n\r";
text += "Speed= " + String(gps.speed.kmph()) + " km/h";
text += "\n\r";
text += "Altitude= " + String(gps.altitude.meters()) + " meters";
text += "\n\r";
text += "http://maps.google.com/maps?q=loc:" + latitude + "," + longitude;
debugPrint(text);
Reply(text, phoneNumber);
}
}
void mpu_read(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
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 stu(){
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, myTimerEvent);
Serial.print("Initializing Pulse Oximeter..");
if (!pox.begin())
{
Serial.println("FAILED");
for (;;);
}
else
{
Serial.println("SUCCESS");
pox.setOnBeatDetectedCallback(onBeatDetected);
}
}Editor is loading...