Friday, 28 August 2026

Adaptive Self-Healing LoRa-Based Emergency Communication Network for Disaster Management


Based on your uploaded project concept, here is the complete implementation structure for the Adaptive Self-Healing LoRa-Based Emergency Communication Network for Disaster Management. The system uses ESP32 + LoRa disaster-sensing nodes, relay nodes, and an emergency control receiver.

1. Complete Project Units

Unit 1: Disaster Sensing / Transmitter Node

Function: Detect disaster conditions and transmit emergency data.

Components:

  • ESP32
  • SX1278 LoRa
  • MPU6050 vibration/earthquake sensor
  • Capacitive soil moisture sensor
  • BME280
  • Rain sensor
  • Water-level sensor
  • NEO-6M GPS
  • OLED display
  • SOS push button
  • Buzzer and LED
  • Battery supply

Working:

  1. ESP32 reads all sensors.
  2. Sensor values are compared with threshold values.
  3. GPS location is collected.
  4. If danger is detected, an emergency priority is assigned.
  5. ESP32 creates a data packet.
  6. LoRa transmits the packet to the nearest available node.

Example packet:

SRC:NODE1|TYPE:EMERGENCY|VIB:HIGH|SOIL:85|WATER:70|LAT:17.3850|LON:78.4867|HOP:0


2. Unit 2: LoRa Relay / Self-Healing Node

Components:

  • ESP32
  • SX1278 LoRa
  • OLED optional
  • Green/red LED
  • Buzzer optional

Working

The relay node:

  1. Receives the LoRa packet.
  2. Checks the packet ID to avoid duplicate forwarding.
  3. Checks whether the destination/control center is reachable.
  4. Forwards the packet to the next available route.
  5. Increases the hop count.
  6. If one route/node fails, forwards through another active relay.

Self-healing example

Normal:
NODE 1 → RELAY 1 → RELAY 2 → CONTROL CENTER

If RELAY 1 fails:
NODE 1 → RELAY 3 → RELAY 2 → CONTROL CENTER

This multi-hop alternate-path concept is the main innovation of the project.

Relay Node Software Logic

loop()
{
   checkIncomingLoRa();

   if(packetReceived)
   {
      if(packetNotPreviouslyReceived)
      {
         savePacketID();

         if(nextRouteAvailable)
         {
            forwardPacket();
         }
         else
         {
            selectAlternateRoute();
            forwardPacket();
         }
      }
   }

   sendHeartbeat();
   checkNeighbourStatus();
}


3. Unit 3: Emergency Control Receiver

Components:

  • ESP32
  • SX1278 LoRa
  • 16×2 LCD or OLED
  • Red LED
  • Green LED
  • Buzzer
  • Laptop/PC connection

Working

  1. Receiver continuously listens for LoRa packets.
  2. Receives disaster/emergency information.
  3. Displays node ID and emergency status.
  4. Activates red LED and buzzer for high-priority alerts.
  5. Sends the information to the PC dashboard through Wi-Fi/Serial/local network.
  6. Stores/display node status and routing information.

The receiver/control architecture in your project includes monitoring node status, emergency alerts, locations, and routing paths.


4. Unit 4: PC Emergency Monitoring Dashboard

The dashboard can display:

---------------------------------------------
 EMERGENCY COMMUNICATION CONTROL CENTER
---------------------------------------------
NODE ID       : NODE_01
STATUS        : EMERGENCY
VIBRATION     : HIGH
SOIL MOISTURE : 85 %
WATER LEVEL   : 72 %
TEMPERATURE   : 31.5 C
LOCATION      : GPS AVAILABLE
ROUTE         : N1 → R3 → R2 → CONTROL
HOP COUNT     : 3
LAST UPDATE   : ACTIVE
---------------------------------------------

Dashboard functions

  • Node online/offline status
  • Sensor monitoring
  • Emergency messages
  • GPS location
  • Route visualization
  • Relay node status
  • Packet/hop information
  • Emergency priority

5. Complete Step-by-Step Implementation

Step 1: First Test ESP32

Install ESP32 board support in Arduino IDE and upload a basic Blink program.

Step 2: Test SX1278 LoRa

Connect ESP32 and SX1278 using SPI.

Example wiring

SX1278 ESP32
VCC 3.3V
GND GND
SCK GPIO 18
MISO GPIO 19
MOSI GPIO 23
NSS GPIO 5
RST GPIO 14
DIO0 GPIO 26

Important: SX1278 must use 3.3V, not 5V.

Step 3: Test LoRa Transmitter and Receiver

First send a simple message:

HELLO FROM NODE 1

Then verify it at the receiver.

Step 4: Add MPU6050

Use the MPU6050 to measure:

  • Acceleration X
  • Acceleration Y
  • Acceleration Z

If vibration exceeds the selected threshold:

EARTHQUAKE ALERT

is generated.

Step 5: Add Soil Moisture Sensor

Read the analog value and convert it to percentage.

Possible use:

High soil moisture → Landslide risk indication

Step 6: Add Water-Level Sensor

Use it for flood detection.

Water level > threshold → FLOOD ALERT

Step 7: Add BME280

Measure:

  • Temperature
  • Humidity
  • Atmospheric pressure

Step 8: Add GPS

GPS provides:

Latitude
Longitude

The location is attached to every emergency packet.

Step 9: Add SOS Button

When pressed:

MANUAL SOS ALERT

is immediately transmitted with high priority.

Step 10: Combine All Sensors

ESP32 reads all sensor values and creates one structured packet.

NODE1,EMERGENCY,32.5,78,85,60,17.XXXX,78.XXXX

Step 11: Implement Relay Nodes

Build at least 2 relay nodes for a convincing demonstration.

Recommended prototype:

Sensor Node A ──┐
                ├── Relay Node 1 ── Receiver
Sensor Node B ──┘          │
                           X Failure

Alternative:
Sensor Node A → Relay Node 2 → Receiver

Step 12: Add Heartbeat Monitoring

Every node periodically sends:

NODE1,HEARTBEAT

If a heartbeat is not received for a specified time, the node is considered unavailable.

if(millis() - lastHeartbeat > TIMEOUT)
{
   nodeStatus = OFFLINE;
   selectAlternateRoute();
}

Step 13: Test Self-Healing

  1. Start all nodes.
  2. Send an emergency message.
  3. Confirm the normal route.
  4. Switch OFF one relay node.
  5. Send another emergency message.
  6. Demonstrate that another relay forwards the message.

This directly demonstrates the project's adaptive/self-healing functionality.


6. Software Code Structure

I recommend creating separate software for each unit.

Software 1

Disaster_Sensor_Node.ino

Read Sensors
     ↓
Check Thresholds
     ↓
Get GPS
     ↓
Generate Alert
     ↓
Create LoRa Packet
     ↓
Transmit

Software 2

LoRa_Relay_Node.ino

Receive Packet
     ↓
Check Packet ID
     ↓
Check Route
     ↓
Select Best Route
     ↓
Alternate Route if Required
     ↓
Forward Packet

Software 3

Emergency_Receiver.ino

Receive LoRa Data
     ↓
Decode Packet
     ↓
Display Information
     ↓
Emergency Alarm
     ↓
Send to Dashboard

Software 4

PC Dashboard

Receive ESP32 Data
     ↓
Update Node Status
     ↓
Display Sensor Data
     ↓
Show Emergency Message
     ↓
Display Route Information


7. Basic Transmitter ESP32 Software

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

#define LORA_SS   5
#define LORA_RST  14
#define LORA_DIO0 26

#define SOIL_PIN 34
#define WATER_PIN 35
#define SOS_PIN 27

#define BUZZER 25
#define RED_LED 2

String nodeID = "NODE1";

void setup()
{
  Serial.begin(115200);

  pinMode(SOS_PIN, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
  pinMode(RED_LED, OUTPUT);

  SPI.begin(18, 19, 23, 5);

  LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);

  if (!LoRa.begin(433E6))
  {
    Serial.println("LoRa initialization failed!");
    while (1);
  }

  Serial.println("Disaster Sensor Node Started");
}

void loop()
{
  int soilValue = analogRead(SOIL_PIN);
  int waterValue = analogRead(WATER_PIN);

  bool sos = digitalRead(SOS_PIN) == LOW;

  String status = "NORMAL";

  if (soilValue > 2500)
    status = "LANDSLIDE_RISK";

  if (waterValue > 2000)
    status = "FLOOD_ALERT";

  if (sos)
    status = "SOS_EMERGENCY";

  if (status != "NORMAL")
  {
    digitalWrite(RED_LED, HIGH);
    digitalWrite(BUZZER, HIGH);
  }
  else
  {
    digitalWrite(RED_LED, LOW);
    digitalWrite(BUZZER, LOW);
  }

  String packet =
    "SRC=" + nodeID +
    "|TYPE=" + status +
    "|SOIL=" + String(soilValue) +
    "|WATER=" + String(waterValue) +
    "|HOP=0";

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

  Serial.println(packet);

  delay(5000);
}


8. Basic Relay Node Software

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

#define LORA_SS   5
#define LORA_RST  14
#define LORA_DIO0 26

String relayID = "RELAY1";

void setup()
{
  Serial.begin(115200);

  SPI.begin(18, 19, 23, 5);

  LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);

  if (!LoRa.begin(433E6))
  {
    while (1);
  }

  Serial.println("Relay Node Started");
}

void loop()
{
  int packetSize = LoRa.parsePacket();

  if (packetSize)
  {
    String received = "";

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

    Serial.println("Received: " + received);

    received += "|VIA=" + relayID;

    delay(200);

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

    Serial.println("Forwarded: " + received);
  }
}


9. Basic Receiver Software

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

#define LORA_SS   5
#define LORA_RST  14
#define LORA_DIO0 26

#define RED_LED 2
#define GREEN_LED 4
#define BUZZER 25

void setup()
{
  Serial.begin(115200);

  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);

  SPI.begin(18, 19, 23, 5);

  LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);

  if (!LoRa.begin(433E6))
  {
    while (1);
  }

  Serial.println("Emergency Receiver Started");
}

void loop()
{
  int packetSize = LoRa.parsePacket();

  if (packetSize)
  {
    String message = "";

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

    Serial.println(message);

    if (message.indexOf("EMERGENCY") >= 0 ||
        message.indexOf("ALERT") >= 0 ||
        message.indexOf("RISK") >= 0)
    {
      digitalWrite(RED_LED, HIGH);
      digitalWrite(GREEN_LED, LOW);
      digitalWrite(BUZZER, HIGH);

      delay(1000);

      digitalWrite(BUZZER, LOW);
    }
    else
    {
      digitalWrite(RED_LED, LOW);
      digitalWrite(GREEN_LED, HIGH);
    }
  }
}


Recommended Final Prototype

For the best final-year demonstration:

                    ┌──────────────────┐
                    │ SENSOR NODE 1    │
                    │ ESP32 + Sensors  │
                    └────────┬─────────┘
                             │
                           LoRa
                             │
                    ┌────────▼─────────┐
                    │ RELAY NODE 1     │
                    │ ESP32 + LoRa     │
                    └────────┬─────────┘
                             │
                    Normal Route
                             │
                    ┌────────▼─────────┐
                    │ CONTROL RECEIVER │
                    └──────────────────┘

       Alternative / Self-Healing Route
                    ┌──────────────────┐
                    │ RELAY NODE 2     │
                    │ ESP32 + LoRa     │
                    └──────────────────┘

Next development stage: the basic code above should be upgraded into a complete integrated system with MPU6050 + BME280 + GPS + water level + soil sensor, packet IDs, duplicate prevention, heartbeat monitoring, route tables, acknowledgements, and actual alternate-route selection. This matches the uploaded project's intended ESP32/LoRa sensing, multi-hop routing, and emergency-control architecture.

No comments:

Post a Comment