Untitled

 avatar
unknown
plain_text
10 months ago
18 kB
14
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