Untitled
unknown
plain_text
10 months ago
18 kB
15
Indexable
#include <DHT.h>
#include <DHT_U.h>
#include "thingProperties.h"
#define buzzerPin 33
#define dhtSensorPin 32
#define DHTTYPE DHT22
DHT dht(dhtSensorPin, DHTTYPE);
#define windSpeedSensorPin 34
const float minVoltage = 0.054; // Voltage corresponding to 0 m/s
const float maxVoltage = 3.3; // Voltage corresponding to 32.4 m/s (max speed)
const float maxWindSpeed = 32.4; // Maximum wind speed in m/s
#define smokeSensorPin 35
const int numSamples = 10; // Moving average window size
float sensorMax = 5.0; // Sensor output range (0–5V)
float windMax = 30.0; // Adjust based on datasheet
float scaleFactor = 0.75; // Slope correction
float offset = -0.45; // Offset correction
float windBuffer[numSamples];
int bufferIndex = 0;
bool bufferFilled = false;
unsigned long startupTime;
float smokeThresholdLocal = 30;
void setup() {
Serial.begin(9600);
delay(1500);
initProperties();
fireAlertMessenger = "SYSTEM INITIALIZING...";
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
pinMode(dhtSensorPin, INPUT);
pinMode(windSpeedSensorPin, INPUT);
pinMode(smokeSensorPin, INPUT);
fireAlertMessenger = PropertyActions::CLEAR;
humidityLedCloud = false;
temperatureLedCloud = false;
smokeLedCloud = false;
windSpeedLedCloud = false;
//Initial Thresholds
humidityThreshold = 98;
temperatureThreshold = 32;
smokeThreshold = 30;
smokeThresholdLocal = 30;
windSpeedThreshold = 10;
ffwiThreshold = 8;
dht.begin();
startupTime = millis();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void setInitialThreshold () {
humidityThreshold = 98;
temperatureThreshold = 32;
smokeThreshold = 30;
smokeThresholdLocal = 30;
windSpeedThreshold = 10;
ffwiThreshold = 8;
}
void loop() {
ArduinoCloud.update();
if (ArduinoCloud.connected() == 0) {
Serial.println("Waiting for WiFi...");
digitalWrite(buzzerPin, LOW); // keep buzzer OFF
setInitialThreshold ();
delay(1000);
return; // don’t run system() yet
}
if (millis() - startupTime < 20000) {
Serial.println("Smoke sensor warming up...");
digitalWrite(buzzerPin, LOW);
return;
}
float humidity = readHumidity();
float temperature = readTemperature();
float windspeed = readWindSpeed();
float smoke = readSmoke();
float ffwi = ffwiConversion(humidity, temperature, windspeed);
updateVariables();
system(humidity, temperature, windspeed, smoke, ffwi);
delay(2000);
}
void updateVariables () {
smokeThresholdLocal = smokeThreshold;
}
void system(float humidity, float temperature, float windspeed, float smoke, float ffwi) {
// Humidity
if (humidity >= humidityThreshold) {
Serial.println("System A - Humidity is abnormal");
fireAlertMessenger = "System A - Humidity is abnormal";
humidityLedCloud = true;
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
} else {
Serial.println("System A - Humidity is normal");
digitalWrite(buzzerPin, LOW); // Turn buzzer off
humidityLedCloud = false;
}
// Temperature
if (temperature >= temperatureThreshold) {
Serial.println("System A - Temperature is abnormal");
fireAlertMessenger = "System A - Temperature is abnormal";
temperatureLedCloud = true;
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
} else {
Serial.println("System A - Temperature is normal");
digitalWrite(buzzerPin, LOW); // Turn buzzer off
temperatureLedCloud = false;
}
// Windspeed
if (windspeed >= windSpeedThreshold) {
Serial.println("System A - Windspeed is abnormal");
fireAlertMessenger = "System A - Windspeed is abnormal";
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
windSpeedLedCloud = true;
} else {
Serial.println("System A - Windspeed is normal");
digitalWrite(buzzerPin, LOW); // Turn buzzer off
windSpeedLedCloud = false;
}
// Smoke
if (smoke >= smokeThresholdLocal && smoke >= smokeThreshold) {
Serial.println("System A - Carbon monoxide quantity is abnormal");
fireAlertMessenger = "System A - Carbon monoxide quantity is abnormal";
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
digitalWrite(buzzerPin, LOW); // Turn buzzer off
smokeLedCloud = true;
} else {
Serial.println("System A - Carbon monoxide quantity is normal");
digitalWrite(buzzerPin, LOW); // Turn buzzer off
smokeLedCloud = false;
}
if (ffwi > ffwiThreshold) {
ffwiLedCloud = true;
Serial.println("System B - FFWI is abnormal");
if (ffwi <= 24.7 && ffwi >= 17.4) {
fireAlertMessenger = "System B - 🔥 PLEASE EVACUATE IMMEDIATELY!";
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
Serial.println("System B - FFWI Critical Level");
} else if (ffwi <= 17.3 && ffwi >= 8.5) {
fireAlertMessenger = "System B - 🔥 Elevated Fire Risk";
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
Serial.println("System B - FFWI Elevated Level");
} else {
// FFWI above threshold but in lower range
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
Serial.println("System B - FFWI above threshold");
}
} else {
digitalWrite(buzzerPin, LOW); // Turn buzzer off
ffwiLedCloud = false;
Serial.println("System B - FFWI is normal");
}
// digitalWrite(buzzerPin, LOW); // Turn buzzer off
}
float readHumidity() {
float h = dht.readHumidity();
// 10 offset
h = h - 10;
humidityCloud = h;
Serial.print(F("Humidity: "));
Serial.println(h);
return h;
}
float readTemperature() {
float t = dht.readTemperature();
temperatureCloud = t;
Serial.print(F("Temperature: "));
Serial.print(t);
Serial.println(F("°C "));
return t;
}
float readWindSpeed() {
int rawADC = analogRead(windSpeedSensorPin);
float voltage = (rawADC / 4095.0) * maxVoltage;
float sensorVoltage = voltage * (sensorMax / maxVoltage);
float windSpeed = (sensorVoltage / sensorMax) * windMax;
float calibratedWind = windSpeed * scaleFactor + offset;
windBuffer[bufferIndex] = calibratedWind;
bufferIndex++;
if (bufferIndex >= numSamples) {
bufferIndex = 0;
bufferFilled = true;
}
float sum = 0;
int count = bufferFilled ? numSamples : bufferIndex;
for (int i = 0; i < count; i++) sum += windBuffer[i];
float avgWindSpeed = sum / count;
// Serial output (debug)
Serial.print("Instant: ");
Serial.print(calibratedWind, 2);
Serial.print(" m/s | Avg: ");
Serial.print(avgWindSpeed, 2);
Serial.println(" m/s");
avgWindSpeed = constrain(avgWindSpeed, 0, 100);
windSpeedCloud = avgWindSpeed;
return avgWindSpeed;
}
float readSmoke() {
float smokeDensity = analogRead(smokeSensorPin);
smokeCloud = smokeDensity;
Serial.print("Smoke Density: ");
Serial.println(smokeDensity);
return smokeDensity;
}
float ffwiConversion(float humidity, float temperature, float windSpeed) {
float m;
float ffwi;
// Fuel moisture computation
if (humidity < 10) {
m = 0.03229 + 0.281073 * humidity - 0.000578 * humidity * temperature;
} else if (humidity >= 10 && humidity <= 50) {
m = 2.22749 + 0.160107 * humidity - 0.014784 * temperature;
} else {
m = 21.0606 + 0.005565 * pow(humidity, 2) - 0.00035 * humidity * temperature - 0.483199 * humidity;
}
// Clamp m to 0–30
m = constrain(m, 0.0, 30.0);
// Normalization and FFWI calculation
float n = 1.0 - 2.0 * m / 30.0 + 1.5 * pow(m / 30.0, 2) - 0.5 * pow(m / 30.0, 3);
ffwi = n * sqrt(1.0 + pow(windSpeed, 2)) / 0.3002;
// Clamp FFWI to 0–100
ffwi = constrain(ffwi, 0.0, 100.0);
// Print result
Serial.print("FFWI: ");
Serial.println(ffwi);
ffwiCloud = ffwi;
return ffwi;
}
void onFireAlertMessengerChange() {
// Add your code here to act upon FireAlertMessenger change
messenger1();
}
void messenger1 () {
if (fireAlertMessenger == "SYS1_RESET") {
humidityLedCloud = false;
temperatureLedCloud = false;
windSpeedLedCloud = false;
smokeLedCloud = false;
ffwiLedCloud = false;
Serial.println("System reset command received. All alarms cleared.1");
} else if (fireAlertMessenger == "SYS1_TEST") {
Serial.println("Running LED test sequence...");
humidityLedCloud = true;
temperatureLedCloud = true;
windSpeedLedCloud = true;
smokeLedCloud = true;
ffwiLedCloud = true;
delay(10000);
humidityLedCloud = false;
temperatureLedCloud = false;
windSpeedLedCloud = false;
smokeLedCloud = false;
ffwiLedCloud = false;
} else if (fireAlertMessenger == "SYS1_BUZZ") {
digitalWrite(buzzerPin, HIGH); // Turn buzzer on
delay(5000);
digitalWrite(buzzerPin, LOW); // Turn buzzer off
delay(5000);
} else if (fireAlertMessenger == "SYS1_ROBERT") {
fireAlertMessenger = "MIRANDA";
} else if (fireAlertMessenger == "SYS1_TEMP") {
float t = readTemperature();
fireAlertMessenger = String("System A - Temperature: ") + String(t) + " °C";
} else if (fireAlertMessenger == "SYS1_HUMID") {
float h = readHumidity();
fireAlertMessenger = String("System A - Humidity: ") + String(h);
} else if (fireAlertMessenger == "SYS1_WIND") {
float w = windSpeedCloud;
fireAlertMessenger = String("System A - Wind Speed: ") + String(w) + "m/s";
} else if (fireAlertMessenger == "SYS1_SMOKE") {
float s = smokeCloud;
fireAlertMessenger = String("System A - Smoke Density: ") + String(s);
}
else {
Serial.print("Received unrecognized command: ");
}
}
/*
Since TemperatureCloud is READ_WRITE variable, onTemperatureCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureCloudChange() {
// Add your code here to act upon TemperatureCloud change
}
/*
Since HumidityCloud is READ_WRITE variable, onHumidityCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityCloudChange() {
// Add your code here to act upon HumidityCloud change
}
/*
Since HumidityCloud1 is READ_WRITE variable, onHumidityCloud1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityCloud1Change() {
// Add your code here to act upon HumidityCloud1 change
}
/*
Since HumidityCloud2 is READ_WRITE variable, onHumidityCloud2Change() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityCloud2Change() {
// Add your code here to act upon HumidityCloud2 change
}
/*
Since HumidityCloud3 is READ_WRITE variable, onHumidityCloud3Change() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityCloud3Change() {
// Add your code here to act upon HumidityCloud3 change
}
/*
Since TemperatureCloud2 is READ_WRITE variable, onTemperatureCloud2Change() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureCloud2Change() {
// Add your code here to act upon TemperatureCloud2 change
}
/*
Since TemperatureCloud1 is READ_WRITE variable, onTemperatureCloud1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureCloud1Change() {
// Add your code here to act upon TemperatureCloud1 change
}
/*
Since TemperatureCloud3 is READ_WRITE variable, onTemperatureCloud3Change() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureCloud3Change() {
// Add your code here to act upon TemperatureCloud3 change
}
/*
Since FfwiCloud1 is READ_WRITE variable, onFfwiCloud1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiCloud1Change() {
// Add your code here to act upon FfwiCloud1 change
}
/*
Since FfwiCloud2 is READ_WRITE variable, onFfwiCloud2Change() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiCloud2Change() {
// Add your code here to act upon FfwiCloud2 change
}
/*
Since FfwiCloud3 is READ_WRITE variable, onFfwiCloud3Change() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiCloud3Change() {
// Add your code here to act upon FfwiCloud3 change
}
/*
Since WindSpeedCloud1 is READ_WRITE variable, onWindSpeedCloud1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedCloud1Change() {
// Add your code here to act upon WindSpeedCloud1 change
}
/*
Since WindSpeedCloud2 is READ_WRITE variable, onWindSpeedCloud2Change() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedCloud2Change() {
// Add your code here to act upon WindSpeedCloud2 change
}
/*
Since WindSpeedCloud3 is READ_WRITE variable, onWindSpeedCloud3Change() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedCloud3Change() {
// Add your code here to act upon WindSpeedCloud3 change
}
/*
Since TemperatureLedCloud is READ_WRITE variable, onTemperatureLedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureLedCloudChange() {
// Add your code here to act upon TemperatureLedCloud change
}
/*
Since WindSpeedLedCLoud is READ_WRITE variable, onWindSpeedLedCLoudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedLedCLoudChange() {
// Add your code here to act upon WindSpeedLedCLoud change
}
/*
Since HumidityLedCloud is READ_WRITE variable, onHumidityLedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityLedCloudChange() {
// Add your code here to act upon HumidityLedCloud change
}
/*
Since FfwiLedCloud is READ_WRITE variable, onFfwiLedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiLedCloudChange() {
// Add your code here to act upon FfwiLedCloud change
}
/*
Since FireAlertMessenger is READ_WRITE variable, onFireAlertMessengerChange() is
executed every time a new value is received from IoT Cloud.
*/
/*
Since WindSpeedThreshold is READ_WRITE variable, onWindSpeedThresholdChange() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedThresholdChange() {
// Add your code here to act upon WindSpeedThreshold change
}
/*
Since TemperatureThreshold is READ_WRITE variable, onTemperatureThresholdChange() is
executed every time a new value is received from IoT Cloud.
*/
void onTemperatureThresholdChange() {
// Add your code here to act upon TemperatureThreshold change
}
/*
Since HumidityThreshold is READ_WRITE variable, onHumidityThresholdChange() is
executed every time a new value is received from IoT Cloud.
*/
void onHumidityThresholdChange() {
// Add your code here to act upon HumidityThreshold change
}
/*
String fireAlertMessenger;
float ffwiCloud1;
float ffwiCloud2;
float ffwiCloud3;
float humidityCloud1;
float humidityCloud2;
float humidityCloud3;
float humidityThreshold;
bool ffwiLedCloud;
bool humidityLedCloud;
bool temperatureLedCloud;
bool windSpeedLedCLoud;
CloudTemperature temperatureCloud1;
CloudTemperature temperatureCloud2;
CloudTemperature temperatureCloud3;
CloudTemperature temperatureThreshold;
CloudVelocity windSpeedCloud1;
CloudVelocity windSpeedCloud2;
CloudVelocity windSpeedCloud3;
CloudVelocity windSpeedThreshold;
*/
/*
Since SmokeLedCloud is READ_WRITE variable, onSmokeLedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeLedCloudChange() {
// Add your code here to act upon SmokeLedCloud change
}
/*
Since SmokeCloud1 is READ_WRITE variable, onSmokeCloud1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeCloud1Change() {
// Add your code here to act upon SmokeCloud1 change
}
/*
Since SmokeCloud2 is READ_WRITE variable, onSmokeCloud2Change() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeCloud2Change() {
// Add your code here to act upon SmokeCloud2 change
}
/*
Since SmokeCloud3 is READ_WRITE variable, onSmokeCloud3Change() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeCloud3Change() {
// Add your code here to act upon SmokeCloud3 change
}
/*
Since SmokeThreshold is READ_WRITE variable, onSmokeThresholdChange() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeThresholdChange() {
// Add your code here to act upon SmokeThreshold change
}
/*
Since FfwiCloud is READ_WRITE variable, onFfwiCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiCloudChange() {
// Add your code here to act upon FfwiCloud change
}
/*
Since SmokeCloud is READ_WRITE variable, onSmokeCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onSmokeCloudChange() {
// Add your code here to act upon SmokeCloud change
}
/*
Since WindSpeedCloud is READ_WRITE variable, onWindSpeedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedCloudChange() {
// Add your code here to act upon WindSpeedCloud change
}
/*
Since WindSpeedLedCloud is READ_WRITE variable, onWindSpeedLedCloudChange() is
executed every time a new value is received from IoT Cloud.
*/
void onWindSpeedLedCloudChange() {
// Add your code here to act upon WindSpeedLedCloud change
}
/*
Since FfwiThreshold is READ_WRITE variable, onFfwiThresholdChange() is
executed every time a new value is received from IoT Cloud.
*/
void onFfwiThresholdChange() {
// Add your code here to act upon FfwiThreshold change
}Editor is loading...
Leave a Comment