0% found this document useful (0 votes)
11 views19 pages

Lora Project

The document provides code for a Raspberry Pi Pico project utilizing LoRa technology for wireless communication, including pulse rate and accelerometer data transmission. It includes transmitter and receiver code for various sensor setups, including temperature and GPS modules. The code demonstrates initialization, data reading, packet preparation, and transmission using LoRa, along with signal strength monitoring.

Uploaded by

Lisha Gowda
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views19 pages

Lora Project

The document provides code for a Raspberry Pi Pico project utilizing LoRa technology for wireless communication, including pulse rate and accelerometer data transmission. It includes transmitter and receiver code for various sensor setups, including temperature and GPS modules. The code demonstrates initialization, data reading, packet preparation, and transmission using LoRa, along with signal strength monitoring.

Uploaded by

Lisha Gowda
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 19

https://github.

com/earlephilhower/arduinopico/releases/download/global/
package_rp2040_index.json

Raspberry Pi Pico and this I2c lcd working process. #include <LiquidCrystal_PCF8574.h> (Compatible
library)

LORA TRANSMITTER

LORA RECIEVER
Library

LoRa by Sandeep Mistry


Lora Transmitter code ///pulse rate sensor
#include <SPI.h>
#include <LoRa.h>

const int pulsePin = 26; // GPIO26 (Pin 31) for pulse rate sensor signal
int pulseValue = 0; // Variable to store pulse rate sensor reading

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Transmitter...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
}

void loop() {
// Read analog value from the pulse rate sensor
pulseValue = analogRead(pulsePin);

// Convert analog value to voltage (optional, for debugging or calibration)


float voltage = pulseValue * (3.3 / 4095.0); // Assuming 12-bit ADC on Pico

// Prepare data packet


String dataPacket = "Pulse Value: " + String(pulseValue) + ", Voltage: " + String(voltage, 2);
Serial.println("Sending packet: " + dataPacket);

// Transmit data via LoRa


LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();

delay(1000); // Wait 1 second before sending the next packet


}
LORA reciver code ///pulse rate sensor
#include <SPI.h>
#include <LoRa.h>

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Receiver...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
}

void loop() {
// Check for incoming LoRa packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
// Received a packet
String receivedData = "";
while (LoRa.available()) {
receivedData += (char)LoRa.read();
}
Serial.println("Received packet: " + receivedData);

// Print RSSI (signal strength)


Serial.print("RSSI: ");
Serial.println(LoRa.packetRssi());
}
}

LoRa Transmitter ///pulse rate + accelerometer


#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <MPU6050.h> // Include MPU6050 library

const int pulsePin = 26; // GPIO26 (Pin 31) for pulse rate sensor signal
int pulseValue = 0; // Variable to store pulse rate sensor reading

// Accelerometer (MPU6050) setup


MPU6050 accel;
void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Transmitter...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");

// Initialize pulse rate sensor (analog)


pinMode(pulsePin, INPUT);

// Initialize I2C for the accelerometer


Wire.begin();
accel.initialize(); // Initialize the accelerometer
if (!accel.testConnection()) {
Serial.println("MPU6050 connection failed!");
while (1); // Halt if the accelerometer is not connected
}
Serial.println("MPU6050 initialized...");
}

void loop() {
// Read pulse rate sensor value
pulseValue = analogRead(pulsePin);

// Read accelerometer data


int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);

// Convert accelerometer data to g


float ax_g = ax / 16384.0; // MPU6050 sensitivity scale factor (default)
float ay_g = ay / 16384.0;
float az_g = az / 16384.0;

// Print data to Serial Monitor


Serial.print("Pulse Value: ");
Serial.print(pulseValue);
Serial.print(", Accelerometer X: ");
Serial.print(ax_g, 3);
Serial.print(", Y: ");
Serial.print(ay_g, 3);
Serial.print(", Z: ");
Serial.println(az_g, 3);
// Prepare data packet with pulse and accelerometer data
String dataPacket = "Pulse: " + String(pulseValue) + ", Accel X: " + String(ax_g, 3) + ", Accel Y: " +
String(ay_g, 3) + ", Accel Z: " + String(az_g, 3);
Serial.println("Sending packet: " + dataPacket);

// Transmit data via LoRa


LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();

delay(1000); // Wait 1 second before sending the next packet


}

LoRa receiver //pulse rate + accelerometer


#include <SPI.h>
#include <LoRa.h>

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Receiver...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
}

void loop() {
// Check if a LoRa packet is available
int packetSize = LoRa.parsePacket();
if (packetSize) {
String receivedData = "";
long packetRSSI = LoRa.packetRssi(); // Get the RSSI (signal strength) of the packet
long packetSnr = LoRa.packetSnr(); // Get the SNR (Signal-to-Noise Ratio)

// Read the packet data


while (LoRa.available()) {
receivedData += (char)LoRa.read();
}

// Print the received data along with RSSI and SNR


Serial.print("Received packet: ");
Serial.println(receivedData);
// Print RSSI and SNR for signal strength and quality
Serial.print("RSSI: ");
Serial.println(packetRSSI);
Serial.print("SNR: ");
Serial.println(packetSnr);

// Print a timestamp of the packet reception (in milliseconds)


Serial.print("Packet received at: ");
Serial.println(millis());
}
}

LORA Transmitter with pulse/temp/accelerometer /


#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <MPU6050.h> // Include MPU6050 library
#include <OneWire.h>
#include <DallasTemperature.h>

// Pulse rate sensor setup


const int pulsePin = 26; // GPIO26 (Pin 31) for pulse rate sensor signal
int pulseValue = 0; // Variable to store pulse rate sensor reading

// Accelerometer (MPU6050) setup


MPU6050 accel;

// Temperature sensor (DS18B20) setup


const int tempPin = 22; // GPIO22 for DS18B20 data line
OneWire oneWire(tempPin);
DallasTemperature tempSensor(&oneWire);
float temperatureC = 0.0; // Variable to store temperature in Celsius

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Transmitter...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
// Initialize pulse rate sensor (analog)
pinMode(pulsePin, INPUT);

// Initialize I2C for the accelerometer


Wire.begin();
accel.initialize(); // Initialize the accelerometer
if (!accel.testConnection()) {
Serial.println("MPU6050 connection failed!");
while (1); // Halt if the accelerometer is not connected
}
Serial.println("MPU6050 initialized...");

// Initialize DS18B20 temperature sensor


tempSensor.begin();
Serial.println("DS18B20 temperature sensor initialized...");
}

void loop() {
// Read pulse rate sensor value
pulseValue = analogRead(pulsePin);

// Read accelerometer data


int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);

// Convert accelerometer data to g


float ax_g = ax / 16384.0; // MPU6050 sensitivity scale factor (default)
float ay_g = ay / 16384.0;
float az_g = az / 16384.0;

// Request temperature reading from DS18B20


tempSensor.requestTemperatures();
temperatureC = tempSensor.getTempCByIndex(0); // Get temperature in Celsius

// Print data to Serial Monitor


Serial.print("Pulse Value: ");
Serial.print(pulseValue);
Serial.print(", Accelerometer X: ");
Serial.print(ax_g, 3);
Serial.print(", Y: ");
Serial.print(ay_g, 3);
Serial.print(", Z: ");
Serial.print(az_g, 3);
Serial.print(", Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");

// Prepare data packet with pulse, accelerometer, and temperature data


String dataPacket = "Pulse: " + String(pulseValue) +
", Accel X: " + String(ax_g, 3) +
", Accel Y: " + String(ay_g, 3) +
", Accel Z: " + String(az_g, 3) +
", Temp: " + String(temperatureC) + " °C";
Serial.println("Sending packet: " + dataPacket);

// Transmit data via LoRa


LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();

delay(1000); // Wait 1 second before sending the next packet


}

LORA RECIVER pulse/temp/accelerometer /


#include <SPI.h>
#include <LoRa.h>

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Receiver...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(915E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
}

void loop() {
// Check for incoming LoRa packet
int packetSize = LoRa.parsePacket();
if (packetSize) {
// Received a packet
String receivedData = "";
while (LoRa.available()) {
receivedData += (char)LoRa.read();
}

// Print received packet data


Serial.println("Received packet: " + receivedData);

// Parse the received data


int pulseValue;
float ax_g, ay_g, az_g, temperatureC;

// Extract data from the received string


int pulseIndex = receivedData.indexOf("Pulse:");
int accelXIndex = receivedData.indexOf("Accel X:");
int accelYIndex = receivedData.indexOf("Accel Y:");
int accelZIndex = receivedData.indexOf("Accel Z:");
int tempIndex = receivedData.indexOf("Temp:");

// Extract values from the string


if (pulseIndex != -1 && accelXIndex != -1) {
pulseValue = receivedData.substring(pulseIndex + 7, accelXIndex - 2).toInt();
}
if (accelXIndex != -1 && accelYIndex != -1) {
ax_g = receivedData.substring(accelXIndex + 8, accelYIndex - 2).toFloat();
}
if (accelYIndex != -1 && accelZIndex != -1) {
ay_g = receivedData.substring(accelYIndex + 8, accelZIndex - 2).toFloat();
}
if (accelZIndex != -1 && tempIndex != -1) {
az_g = receivedData.substring(accelZIndex + 8, tempIndex - 2).toFloat();
}
if (tempIndex != -1) {
temperatureC = receivedData.substring(tempIndex + 6).toFloat();
}

// Print parsed values to Serial Monitor


Serial.print("Pulse Value: ");
Serial.println(pulseValue);
Serial.print("Accelerometer X: ");
Serial.println(ax_g);
Serial.print("Accelerometer Y: ");
Serial.println(ay_g);
Serial.print("Accelerometer Z: ");
Serial.println(az_g);
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");

// Print RSSI (signal strength)


Serial.print("RSSI: ");
Serial.println(LoRa.packetRssi());
}
}

////GPS WORKING
#include <TinyGPS++.h> // Include TinyGPS++ library

// Define RX and TX pins for Serial1


#define RX_PIN 1 // GPS TX to Pico RX (GP1)
#define TX_PIN 0 // GPS RX to Pico TX (GP0)

// Create a TinyGPSPlus object to hold GPS data


TinyGPSPlus gps;
void setup() {
// Initialize Serial (USB) for debugging
Serial.begin(115200); // Set baud rate for Serial Monitor
delay(2000); // Wait for Serial Monitor to open

// Initialize Serial1 (UART) for GPS communication


Serial1.begin(9600); // Baud rate for Neo-6M GPS
}

void loop() {
// Check if GPS data is available from Serial1
while (Serial1.available() > 0) {
char c = Serial1.read(); // Read one character from GPS
gps.encode(c); // Decode the GPS data

// If new GPS data is available and the location is valid, print latitude and longitude
if (gps.location.isUpdated() && gps.location.isValid()) {
float latitude = gps.location.lat();
float longitude = gps.location.lng();

// Output only latitude and longitude


Serial.print(latitude, 6); // Print Latitude with 6 decimal places
Serial.print(", ");
Serial.println(longitude, 6); // Print Longitude with 6 decimal places
}
}
}

////lora transmitter

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <MPU6050.h> // Include MPU6050 library
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TinyGPS++.h> // Include TinyGPS++ library for GPS parsing

// Pulse rate sensor setup


const int pulsePin = 26; // GPIO26 (Pin 31) for pulse rate sensor signal
int pulseValue = 0; // Variable to store pulse rate sensor reading

// Accelerometer (MPU6050) setup


MPU6050 accel;

// Temperature sensor (DS18B20) setup


const int tempPin = 22; // GPIO22 for DS18B20 data line
OneWire oneWire(tempPin);
DallasTemperature tempSensor(&oneWire);
float temperatureC = 0.0; // Variable to store temperature in Celsius
// GPS module setup
TinyGPSPlus gps; // GPS object
#define RXPin 13 // GPS TX to GPIO0 (UART RX)
#define TXPin 12 // GPS RX to GPIO1 (UART TX)
#define GPSBaud 9600 // GPS baud rate

// Peltier module setup


#define RELAY_PIN 3 // GPIO0 connected to relay control pin
#define TEMP_THRESHOLD 30.0 // Temperature threshold in °C
bool isPeltierOn = false; // Track Peltier status

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Transmitter...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(433E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
LoRa.setTxPower(20); // Set transmission power to maximum (20 dBm)

// Initialize pulse rate sensor (analog)


pinMode(pulsePin, INPUT);

// Initialize I2C for the accelerometer


Wire.begin();
accel.initialize(); // Initialize the accelerometer
if (!accel.testConnection()) {
Serial.println("MPU6050 connection failed!");
while (1); // Halt if the accelerometer is not connected
}
Serial.println("MPU6050 initialized...");

// Initialize DS18B20 temperature sensor


tempSensor.begin();
Serial.println("DS18B20 temperature sensor initialized...");

// Initialize GPS module


Serial1.begin(GPSBaud);
Serial.println("GPS module initialized...");

// Initialize Relay for Peltier


pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Start with Peltier OFF
}
void loop() {
// Read pulse rate sensor value
pulseValue = analogRead(pulsePin);

// Read accelerometer data


int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);

// Convert accelerometer data to g


float ax_g = ax / 16384.0; // MPU6050 sensitivity scale factor (default)
float ay_g = ay / 16384.0;
float az_g = az / 16384.0;

// Request temperature reading from DS18B20


tempSensor.requestTemperatures();
temperatureC = tempSensor.getTempCByIndex(0); // Get temperature in Celsius

// Read GPS data


while (Serial1.available() > 0) {
gps.encode(Serial1.read());
}

double latitude = 0.0, longitude = 0.0;


if (gps.location.isUpdated()) {
latitude = gps.location.lat();
longitude = gps.location.lng();
}

// Handle Peltier control logic


if (temperatureC < TEMP_THRESHOLD && !isPeltierOn) {
digitalWrite(RELAY_PIN, LOW); // Turn ON Peltier
isPeltierOn = true;
Serial.println("Peltier turned ON. Body temperature falling.");
} else if (temperatureC >= TEMP_THRESHOLD && isPeltierOn) {
digitalWrite(RELAY_PIN, HIGH); // Turn OFF Peltier
isPeltierOn = false;
Serial.println("Peltier turned OFF. Body temperature normal.");
}

// Print data to Serial Monitor


Serial.print("Pulse Value: ");
Serial.print(pulseValue);
Serial.print(", Accelerometer X: ");
Serial.print(ax_g, 3);
Serial.print(", Y: ");
Serial.print(ay_g, 3);
Serial.print(", Z: ");
Serial.print(az_g, 3);
Serial.print(", Temperature: ");
Serial.print(temperatureC);
Serial.print(" °C, Latitude: ");
Serial.print(latitude, 6);
Serial.print(", Longitude: ");
Serial.println(longitude, 6);

// Prepare data packet


String dataPacket = "Pulse: " + String(pulseValue) +
", Accel X: " + String(ax_g, 3) +
", Accel Y: " + String(ay_g, 3) +
", Accel Z: " + String(az_g, 3) +
", Temp: " + String(temperatureC) + " °C, " +
"Lat: " + String(latitude, 6) +
", Lon: " + String(longitude, 6) +
", Peltier: " + (isPeltierOn ? "ON" : "OFF");
Serial.println("Sending packet: " + dataPacket);

// Transmit data via LoRa


LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();

delay(1000); // Wait 1 second before sending the next packet


}

Receiver code
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h> // Include the new LCD library

// Initialize the LCD (using LiquidCrystal_PCF8574 library)


LiquidCrystal_PCF8574 lcd(0x27); // I2C address for the LCD

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LCD
lcd.begin(16, 2); // Set the size of the LCD (16 columns, 2 rows)
lcd.setBacklight(1); // Turn on the backlight
lcd.setCursor(0, 0);
lcd.print("Initializing...");

// Initialize LoRa module


Serial.println("LoRa Receiver");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(433E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
lcd.setCursor(0, 1);
lcd.print("LoRa Init Failed");
while (1);
}
Serial.println("LoRa initialization successful!");
lcd.setCursor(0, 1);
lcd.print("LoRa Initialized");
}

void loop() {
// Check if LoRa data is available to read
int packetSize = LoRa.parsePacket();
if (packetSize) {
// Read the incoming packet
String receivedData = "";
while (LoRa.available()) {
receivedData += (char)LoRa.read();
}

// Print the received packet


Serial.println("Received packet:");
Serial.println(receivedData);

// Parse and display the received data


parseData(receivedData);
}

delay(1000); // Wait for a while before reading again


}

void parseData(String data) {


// Split the data into key-value pairs using commas
int startIndex = 0;
while (startIndex < data.length()) {
int delimiterIndex = data.indexOf(',', startIndex);
if (delimiterIndex == -1) {
delimiterIndex = data.length();
}

// Extract key-value pair


String pair = data.substring(startIndex, delimiterIndex);
pair.trim(); // Ensure no leading/trailing spaces
int separatorIndex = pair.indexOf(':');
if (separatorIndex != -1) {
String key = pair.substring(0, separatorIndex);
key.trim(); // Clean key
String value = pair.substring(separatorIndex + 1);
value.trim(); // Clean value

// Print the extracted key and value


Serial.print("Key: ");
Serial.print(key);
Serial.print(", Value: ");
Serial.println(value);

// Display the data based on the key


if (key == "Pulse") {
Serial.print("Pulse Rate: ");
Serial.println(value.toInt());
updateLCD("Pulse Rate", value);
} else if (key == "Accel X") {
Serial.print("Acceleration X: ");
Serial.println(value.toFloat());

} else if (key == "Accel Y") {


Serial.print("Acceleration Y: ");
Serial.println(value.toFloat());
} else if (key == "Accel Z") {
Serial.print("Acceleration Z: ");
Serial.println(value.toFloat());

} else if (key == "Resultant Acc") {


Serial.print("Resultant Acceleration: ");
Serial.println(value.toFloat());
updateLCD("Res Acc", value);
} else if (key == "Temp") {
Serial.print("Temperature: ");
Serial.println(value);
updateLCD("Temperature", value);
} else if (key == "Lat") {
Serial.print("Latitude: ");
Serial.println(value.toFloat());
updateLCD("Latitude", value);
} else if (key == "Lon") {
Serial.print("Longitude: ");
Serial.println(value.toFloat());
updateLCD("Longitude", value);
} else if (key == "Peltier") {
Serial.print("Peltier Status: ");
Serial.println(value);
updateLCD("Peltier", value);
}
}

// Move to the next key-value pair


startIndex = delimiterIndex + 1;
}
}

void updateLCD(String key, String value) {


lcd.clear();
lcd.setCursor(0, 0);
lcd.print(key);
lcd.setCursor(0, 1);
lcd.print(value.substring(0, 16)); // Truncate to fit 16 chars
delay(1000); // Wait for 1 second before displaying the next value
}

Transmitter code
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <MPU6050.h> // Include MPU6050 library
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TinyGPS++.h> // Include TinyGPS++ library for GPS parsing

// Pulse rate sensor setup


const int pulsePin = 26; // GPIO26 (Pin 31) for pulse rate sensor signal
int pulseValue = 0; // Variable to store pulse rate sensor reading

// Accelerometer (MPU6050) setup


MPU6050 accel;

// Temperature sensor (DS18B20) setup


const int tempPin = 22; // GPIO22 for DS18B20 data line
OneWire oneWire(tempPin);
DallasTemperature tempSensor(&oneWire);
float temperatureC = 0.0; // Variable to store temperature in Celsius

// GPS module setup


TinyGPSPlus gps; // GPS object
#define RXPin 1 // GPS TX to GPIO0 (UART RX)
#define TXPin 0 // GPS RX to GPIO1 (UART TX)
#define GPSBaud 9600 // GPS baud rate

// Peltier module setup


#define RELAY_PIN 3 // GPIO0 connected to relay control pin
#define TEMP_THRESHOLD 30.0 // Temperature threshold in °C
bool isPeltierOn = false; // Track Peltier status

// Fall detection thresholds


#define FALL_LOW_THRESHOLD 0.9 // Resultant acceleration below this indicates free fall (in g)
#define FALL_HIGH_THRESHOLD 0.9 // Resultant acceleration above this indicates impact (in g)
#define FALL_DETECTION_DELAY 500 // Delay in ms between free fall and impact detection

bool fallDetected = false; // Track fall status

void setup() {
// Initialize Serial communication
Serial.begin(9600);
while (!Serial);

// Initialize LoRa module


Serial.println("Starting LoRa Transmitter...");
LoRa.setPins(17, 14, 15); // NSS, RESET, DIO0

if (!LoRa.begin(433E6)) { // Set frequency (adjust as per region)


Serial.println("LoRa initialization failed!");
while (1);
}
Serial.println("LoRa initialization successful!");
LoRa.setTxPower(20); // Set transmission power to maximum (20 dBm)

// Initialize pulse rate sensor (analog)


pinMode(pulsePin, INPUT);

// Initialize I2C for the accelerometer


Wire.begin();
accel.initialize(); // Initialize the accelerometer
if (!accel.testConnection()) {
Serial.println("MPU6050 connection failed!");
while (1); // Halt if the accelerometer is not connected
}
Serial.println("MPU6050 initialized...");

// Initialize DS18B20 temperature sensor


tempSensor.begin();
Serial.println("DS18B20 temperature sensor initialized...");

// Initialize GPS module


Serial1.begin(GPSBaud);
Serial.println("GPS module initialized...");

// Initialize Relay for Peltier


pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Start with Peltier OFF
}

void loop() {
// Read pulse rate sensor value
pulseValue = analogRead(pulsePin);

// Read accelerometer data


int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);

// Convert accelerometer data to g


float ax_g = ax / 16384.0; // MPU6050 sensitivity scale factor (default)
float ay_g = ay / 16384.0;
float az_g = az / 16384.0;

// Compute resultant acceleration


float resultantAcceleration = sqrt(ax_g * ax_g + ay_g * ay_g + az_g * az_g);

// Fall detection logic


if (resultantAcceleration < FALL_LOW_THRESHOLD) {
delay(FALL_DETECTION_DELAY);
// Check again for impact
accel.getAcceleration(&ax, &ay, &az);
ax_g = ax / 16384.0;
ay_g = ay / 16384.0;
az_g = az / 16384.0;
resultantAcceleration = sqrt(ax_g * ax_g + ay_g * ay_g + az_g * az_g);

if (resultantAcceleration > FALL_HIGH_THRESHOLD) {


fallDetected = true;
Serial.println("Fall detected!");
} else {
fallDetected = false;
}
}

// Request temperature reading from DS18B20


tempSensor.requestTemperatures();
temperatureC = tempSensor.getTempCByIndex(0); // Get temperature in Celsius

// Read GPS data


while (Serial1.available() > 0) {
gps.encode(Serial1.read());
}

double latitude = 0.0, longitude = 0.0;


if (gps.location.isUpdated()) {
latitude = gps.location.lat();
longitude = gps.location.lng();
}

// Handle Peltier control logic


if (temperatureC < TEMP_THRESHOLD && !isPeltierOn) {
digitalWrite(RELAY_PIN, LOW); // Turn ON Peltier
isPeltierOn = true;
Serial.println("Peltier turned ON. Body temperature falling.");
} else if (temperatureC >= TEMP_THRESHOLD && isPeltierOn) {
digitalWrite(RELAY_PIN, HIGH); // Turn OFF Peltier
isPeltierOn = false;
Serial.println("Peltier turned OFF. Body temperature normal.");
}

// Print data to Serial Monitor


Serial.print("Pulse Value: ");
Serial.print(pulseValue);
Serial.print(", Accelerometer X: ");
Serial.print(ax_g, 3);
Serial.print(", Y: ");
Serial.print(ay_g, 3);
Serial.print(", Z: ");
Serial.print(az_g, 3);
Serial.print(", Resultant Acc: ");
Serial.print(resultantAcceleration, 3);
Serial.print(", Temperature: ");
Serial.print(temperatureC);
Serial.print(" °C, Latitude: ");
Serial.print(latitude, 6);
Serial.print(", Longitude: ");
Serial.println(longitude, 6);

// Prepare data packet


String dataPacket = "Pulse: " + String(pulseValue) +
", Accel X: " + String(ax_g, 3) +
", Accel Y: " + String(ay_g, 3) +
", Accel Z: " + String(az_g, 3) +
", Resultant Acc: " + String(resultantAcceleration, 3) +
", Temp: " + String(temperatureC) + " °C, " +
"Lat: " + String(latitude, 6) +
", Lon: " + String(longitude, 6) +
", Peltier: " + (isPeltierOn ? "ON" : "OFF") +
", Fall: " + (fallDetected ? "Yes" : "No");
Serial.println("Sending packet: " + dataPacket);

// Transmit data via LoRa


LoRa.beginPacket();
LoRa.print(dataPacket);
LoRa.endPacket();

delay(1000); // Wait 1 second before sending the next packet


}

You might also like