#include <WiFi.h>
#include <ThingSpeak.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <DHT.h>
// ThingSpeak settings
long myChannelNumber = 2658258;
const char *myWriteAPIKey = "3LMZX4SBTK8U87NP";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
WiFiClient client;
// Pin definitions
#define DHTPIN 15 // Pin for DHT22
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
#define POT_PIN 34 // Pin for potentiometer (simulated gas sensor)
#define LED_PIN 2 // Pin for LED
#define BUZZER_PIN 5 // Pin for buzzer
// OLED settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Thresholds
float gasThreshold = 300.0; // Gas threshold in ppm
float temperatureThreshold = 50.0; // Temperature threshold in °C
int statusCode;
void setup() {
// Initialize serial communication
Serial.begin(115200);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
// Initialize DHT22
dht.begin();
// Initialize OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED allocation failed"));
while (true);
}
display.clearDisplay();
// Set up the LED and Buzzer pins
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
Serial.println("System started");
}
void loop() {
// WiFi connection handling
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect");
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected");
}
// Read temperature and humidity from DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Check if readings are valid
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Read potentiometer value to simulate gas levels (0-4095 mapped to 0-1000 ppm)
int gasValue = analogRead(POT_PIN);
float gasPPM = map(gasValue, 0, 4095, 0, 1000); // Simulated gas sensor range
// Display readings on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("CBRN Defense System");
display.print("Temp: "); display.print(temperature); display.println(" C");
display.print("Humidity: "); display.print(humidity); display.println(" %");
display.print("Gas: "); display.print(gasPPM); display.println(" ppm");
display.display();
// Check for dangerous conditions
if (gasPPM > gasThreshold || temperature > temperatureThreshold) {
// Danger detected
digitalWrite(LED_PIN, HIGH); // Turn on LED
tone(BUZZER_PIN, 1000); // Activate buzzer
Serial.println("Danger! Gas or Temp alert!");
} else {
// Safe conditions
digitalWrite(LED_PIN, LOW); // Turn off LED
noTone(BUZZER_PIN); // Deactivate buzzer
}
// Send data to ThingSpeak
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, gasPPM);
statusCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (statusCode == 200) { // Successful writing code
Serial.println("Channel update successful.");
} else {
Serial.println("Problem writing data. HTTP error code: " + String(statusCode));
}
delay(2000); // Delay before next reading
}