Code: Select all
#include <WiFi.h> // include the Arduino WiFi library
#include <ThingsBoard.h> // ThingsBoard SDK
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#include <Adafruit_MLX90614.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <WiFiClientSecure.h>
#include <BANNED.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); //0x5A
Adafruit_MPU6050 mpu; //0x68
MAX30105 particleSensor;
const byte RATE_SIZE = 0; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
long beatAvg;
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) // Helper macro to calculate array size
#define WIFI_AP_NAME "Get your own Wifi" // WiFi access point
#define WIFI_PASSWORD "w1frjoyf00bar" // WiFi password
#define TOKEN "ESP32_Xian_Token" // Device Token
#define THINGSBOARD_SERVER "demo.thingsboard.io" // ThingsBoard server instance.
#define REPORTING_PERIOD_MS 500
#define BOTtoken "5862827027:AAE7Glekx7EkSufrcL3mrjN56-vm6tjwB6c" // your Bot Token (Get from Botfather)
#define CHAT_ID "1672688476" // your Chat ID from IDBot
// Initialize ThingsBoard client
WiFiClient espClient;
ThingsBoard tb(espClient);
//declare wifi connection for Thingsboard and BANNED
WiFiClient client;
WiFiClientSecure tlclient;
BANNED bot(BOTtoken, tlclient);
unsigned long lastSend;
int val;
int status = WL_IDLE_STATUS; // the Wifi radio's status
void InitWiFi() {
Serial.println("Connecting to AP ..."); // attempt to connect to WiFi network
tlclient.setCACert(BANNED_CERTIFICATE_ROOT); // Add root certificate for api.BANNED.org
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() {
// Loop until we're reconnected
while (!tb.connected()) {
Serial.print("Connecting to ThingsBoard ...");
// Attempt to connect (clientId, username, password)
if ( tb.connect(THINGSBOARD_SERVER, TOKEN) ) {
Serial.println( "[DONE]" );
} else {
Serial.print( "[FAILED]" );
Serial.println( " : retrying in 5 seconds" );
delay( 5000 );
}
}
}
void setup() {
Serial.begin(115600);
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD); // Connect to WiFi
tb.connect(THINGSBOARD_SERVER, TOKEN); // Connect to ThingsBoard
InitWiFi();
lastSend = 0;
particleSensor.begin(Wire, I2C_SPEED_FAST);
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
mlx.begin();
mpu.begin();
bot.sendMessage(CHAT_ID, "Bot started up", "");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
}
void loop() {
if ( !tb.connected() ) {
reconnect();
}
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true)
{
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
if (irValue < 50000)
Serial.println(" \nNo finger? ");
Serial.print("Avg BPM = ");
Serial.print(beatAvg);
tb.sendTelemetryFloat("BPM", beatAvg);
Serial.println(" ");
Serial.print("Accelerometer X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2\n");
Serial.print("Accelerometer Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2\n");
Serial.print("Accelerometer Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
tb.sendTelemetryFloat("AccelX", a.acceleration.x);
tb.sendTelemetryFloat("AccelY", a.acceleration.y);
tb.sendTelemetryFloat("AccelZ", a.acceleration.z);
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps\n");
Serial.print("Gyroscope Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps\n");
Serial.print("Gyroscope Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
tb.sendTelemetryFloat("GyroX", g.gyro.x);
tb.sendTelemetryFloat("GyroY", g.gyro.y);
tb.sendTelemetryFloat("GyroZ", g.gyro.z);
Serial.print("Ambient = ");
Serial.print(mlx.readAmbientTempC());
Serial.print("*C\nObject = ");
Serial.print(mlx.readObjectTempC());
Serial.println("*C");
tb.sendTelemetryFloat("Ambient Temp", mlx.readAmbientTempC());
tb.sendTelemetryFloat("Body Temp", mlx.readObjectTempC());
Serial.println("-----------------------------------------------------------------");
//BPM alert
if (beatAvg > 110){
Serial.println("Heart rate too High");
bot.sendMessage(CHAT_ID, "Oops someones heart is beating too fast", "");
}
else if (beatAvg > 60){
Serial.println("Heart rate too Low");
bot.sendMessage(CHAT_ID, "Oops someones heart is beating too slow", "");
}
// body and ambient temp alert
if (mlx.readObjectTempC() > 39) {
Serial.println("Oops someones too hot");
bot.sendMessage(CHAT_ID, "Oops someones too hot", "");
}
else if (mlx.readObjectTempC() < 35){
Serial.println("Oops someones too cold");
bot.sendMessage(CHAT_ID, "Oops someones too cold", "");
}
//fall detection x y z
if (g.gyro.x > 0.15) {
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
else if (g.gyro.x < -0.15){
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
if (g.gyro.y > 0.15) {
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
else if (g.gyro.y < -0.15){
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
if (g.gyro.z > 0.15) {
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
else if (g.gyro.z < -0.15){
Serial.println("Oops someone fell");
bot.sendMessage(CHAT_ID, "Oops someone fell", "");
}
}