リアルタイム森林火災監視システム: SMSアラート機能付き
必要な部品と材料
![]() |
Itead Gboard Pro 800 SIM800 GSM/GPRSモジュール 3.3V ATmega2560 メインボード (Arduino用) | × | 1 |
![]() |
Arduino UNO | × | 1 |
![]() |
DHT11温湿度センサー (3ピン) | × | 2 |
![]() |
ジャンパーワイヤー (汎用) | × | 1 |
アプリとオンラインサービス
![]() |
Arduino IDE |
このプロジェクトについて
森林火災の検出プロセスは、森林内の木に設置された任意のノードで開始されます。森林には適切な間隔でノードネットワークが配置され、各ノードはデバイス (このケースではRFモジュール) とArduinoを通じて通信可能です。何らかのノード (送信元ノード) 付近で大気パラメータ (温度上昇、煙による大気汚染など) が閾値を超える変化を検知すると、その情報は最寄りの中継ノードを経由してメイン/ヘッド端末まで伝達されます。メイン端末はGSMモデムを使用して携帯電話 (森林火災監視センター) に情報を送信します。
物理モデルの送信部
森林火災検出モジュールは3つの段階で動作します。第1段階は温度や煙などの外部環境パラメータの読み取りです。センサーを使用して温度、湿度、空気質を検知し、アナログデータをデジタルデータに変換して次のノードに送信します。このプロセスは最終ノードまたはメイン端末 (第2段階) に情報が到達するまで続きます。第3段階は、情報を森林火災監視ユニットに送信する段階です。
各ノードには温湿度センサー、煙センサー、マイクロコントローラーユニット (Arduino) を搭載。センサーはArduinoと連携し、情報を比較処理用に保存します。各パラメータには事前定義された閾値があり、マイクロプロセッサーが定期的にセンサー値と閾値を比較。入力値が閾値を超えると、そのノードは隣のノードに情報を送信し、さらに次のノードへと伝達されます。こうしてメッセージフローが制御されます。
装置の物理モデル

送信部の物理モデル (詳細)

シリアルモニターでの読み取り

GSMモジュールで受信したメッセージ

コード
受信側と送信側Arduinoモジュールコード Python
このコードは受信側Arduinoモジュールを温湿度監視用に設定し、値が閾値を超えた場合にSMSを基地局に送信します。送信側ノードで値の上昇があった場合、送信側Arduino UnoのRF送信モジュールから受信側Arduino UnoのRF受信モジュールへ通信されます。注意: 以下のコードは「受信側Arduino」と「送信側Arduino」の2部構成です
########( PART-1 )###### 受信側 Arduino CODE ##########################
// RadioHead ASKライブラリをインクルード
#include <SoftwareSerial.h>
#include <RH_ASK.h>
// 依存するSPIライブラリをインクルード
#include <SPI.h>
#include <DHT.h>
SoftwareSerial mySerial(4, 3); // GSM用シリアル
// 定数
#define DHTPIN 2 // 接続ピン
#define DHTTYPE DHT11 // DHT11
int smokeA0 = A5; // 煙センサーピン
int sensorThres = 400; // 閾値
// 変数定義
DHT dht(DHTPIN, DHTTYPE); // 16MHz Arduino用にDHTセンサー初期化
float hum; // 湿度値格納
float temp; // 温度値格納
// 出力文字列
String str_humid;
String str_temp;
String str_smk;
String str_out;
// ASKオブジェクト作成
RH_ASK rf_driver;
void setup() {
pinMode(smokeA0, INPUT);
dht.begin();
rf_driver.init(); // ASKオブジェクト初期化
Serial.begin(9600); // シリアルモニター
mySerial.begin(115200); // GSMモジュール用
}
void loop() {
delay(2000);
hum = dht.readHumidity();
temp = dht.readTemperature();
Serial.print("Reciever Humidity = ");
Serial.print(hum);
Serial.print('\n');
Serial.print("Reciever Temperature = ");
Serial.println(temp);
int analogSensor = analogRead(smokeA0);
String smk;
// 閾値チェック
if (analogSensor > sensorThres) {
Serial.print("Smoke at Reciever");
Serial.print('\n');
smk = "Smoke";
} else {
Serial.print("Clean at Reciever");
Serial.print('\n');
smk = "Clean";
}
// 受信バッファ
uint8_t buf[20];
uint8_t buflen = sizeof(buf);
// パケット受信チェック
if (rf_driver.recv(buf, &buflen)) {
str_out = String((char*)buf);
for (int i = 0; i < str_out.length(); i++) {
if (str_out.substring(i, i+1) == ",") {
str_humid = str_out.substring(0, i);
str_temp = str_out.substring(i+1, i+6);
str_smk = str_out.substring(i+7, i+12);
break;
}
}
}
// シリアルモニター出力
Serial.print("Humidity: ");
Serial.print(str_humid);
Serial.print(" - Temperature: ");
Serial.println(str_temp);
Serial.print(" - Air Quality: ");
Serial.println(str_smk);
// 受信側で火災検知
if (hum >= 60 && temp >= 25) {
Serial.print("Fire Detected at Reciever ");
sendSMS("Fire at Reciever Node", temp, hum, smk);
}
// 送信側からのデータで火災検知
if (str_humid.toInt() >= 60 && str_temp.toInt() >= 25) {
Serial.print("Fire Detected at Transmitter ");
sendSMS("Fire at Transmitter Node", str_temp.toFloat(), str_humid.toFloat(), str_smk);
}
}
// SMS送信ヘルパー関数
void sendSMS(String location, float temp, float hum, String airQuality) {
mySerial.println("AT+CMGF=1"); // テキストモード設定
delay(1000);
mySerial.println("AT+CMGS=\"+918744984131\"\r"); // 電話番号を置き換え
delay(1000);
mySerial.println(" FIRE ALERT !! ");
Serial.println('\n');
mySerial.println(location);
Serial.println('\n');
mySerial.println("Temperature: " + String(temp));
Serial.print('\n');
mySerial.println("Humidity: " + String(hum));
Serial.print('\n');
mySerial.println("Air Quality: " + airQuality);
delay(100);
mySerial.println((char)26); // CTRL+Z (ASCII 26)
delay(1000);
}
#######( PART-2 )############ 送信側 Arduino Code ############
############################################################################
#include <RH_ASK.h>
#include <SPI.h>
#include <DHT.h>
// 定数
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
int smokeA0 = A5;
int sensorThres = 400;
// 変数
float hum;
float temp;
float smk;
String str_humid;
String str_temp;
String str_smk;
String str_out;
RH_ASK rf_driver;
void setup() {
dht.begin();
pinMode(smokeA0, INPUT);
rf_driver.init();
}
void loop() {
delay(2000); // DHT安定化待ち
hum = dht.readHumidity();
temp = dht.readTemperature();
str_humid = String(hum);
Serial.print(hum);
str_temp = String(temp);
Serial.print(temp);
int analogSensor = analogRead(smokeA0);
if (analogSensor > sensorThres) {
str_smk = "1";
} else {
str_smk = "0";
}
// データ結合
if (str_smk == "1") {
str_out = str_humid + "," + str_temp + "," + "Smoke";
}
if (str_smk == "0") {
str_out = str_humid + "," + str_temp + "," + "Clean";
}
// 送信
const char *msg = str_out.c_str();
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
}
回路図
製造プロセス
- Raspberry Piでサーバークローゼットの温度を正確に監視
- Samsung SAMI、Arduino UNO、Raspberry Piで高速・信頼性の高い火災検知システムを構築
- スマートホテル&ホーム監視システム:クラウドベース自動制御
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- Arduino Unoベースの人間検知レスキューロボット:センサー統合ステップバイステップ
- K30 CO2センサで室内空気質をリアルタイム監視する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- SERENA:Arduino Mega 2560とTFT LCDタッチスクリーン搭載カスタムアラームシステム
- Arduinoで作る全自動植物水やりシステム - 湿度センサーとRTCで最適制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- AI搭載IoTシステムで森林火災を超早期検知・樹木健康を監視




