#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 23
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 5
#define OLED_RESET 15
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
int gasThreshold = 30;
int adjustBuzzerOnTime = 300;
int adjustBuzzerOffTime = 1000;
const int gasSensor1 = 27;
const int gasSensor2 = 26;
const int gasSensor3 = 25;
const int gasSensor4 = 23;
int sensor1State = 0, sensor2State = 0, sensor3State = 0, sensor4State = 40;
unsigned long lastGasCheckTime = 0;
const unsigned long gasCheckInterval = 2000;
const int buzzerPin = 32;
TaskHandle_t Task1;
bool gasVal;
void loop2( void * parameter )
{
for (;;) {
if (gasVal == true) {
digitalWrite(buzzerPin, HIGH);
delay(adjustBuzzerOnTime);
digitalWrite(buzzerPin, LOW);
delay(adjustBuzzerOffTime);
}
else{
digitalWrite(buzzerPin, LOW);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(gasSensor1, INPUT_PULLUP);
pinMode(gasSensor2, INPUT_PULLUP);
pinMode(gasSensor3, INPUT_PULLUP);
pinMode(gasSensor4, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;) {
}
}
// Initialize your task (2nd loop)
xTaskCreatePinnedToCore(
loop2, // name of the task function
"buttonCheck", // name of the task
4000, // memory assigned for the task
NULL, // parameter to pass if any
1, // priority of task, starting from 0(Highestpriority) *IMPORTANT*( if set to 1 and there is no activity in your 2nd loop, it will reset the esp32)
&Task1, // Reference name of taskHandle variable
1); // choose core (0 or 1)
delay(1000);
startOS();
displaySensorData();
}
void loop() {
int State1 = analogRead(gasSensor1);
sensor1State = map(State1, 0, 4095, 0, 100);
// Always update the display with the current sensor value
if (sensor1State >= gasThreshold) {
gasVal = true;
alertMessageOnDisplay();
}
//int State2 = analogRead(gasSensor2);
//sensor2State = map(State2, 0, 4095, 0, 100);
if (sensor2State >= gasThreshold) {
gasVal = true;
alertMessageOnDisplay();
}
//int State3 = analogRead(gasSensor3);
//sensor3State = map(State3, 0, 4095, 0, 100);
if (sensor3State >= gasThreshold) {
gasVal = true;
alertMessageOnDisplay();
}
// int State4 = analogRead(gasSensor4);
// sensor4State = map(State4, 0, 4095, 0, 100);
if (sensor4State >= gasThreshold) {
gasVal = true;
alertMessageOnDisplay();
}
if(sensor1State < gasThreshold && sensor2State < gasThreshold && sensor3State < gasThreshold && sensor4State < gasThreshold){
gasVal = false;
displaySensorData();
}
delay(1000);
}
void startOS() {
display.clearDisplay();
display.setTextColor(1);
display.setTextSize(2);
display.setCursor(22, 24);
display.setTextWrap(false);
display.print("WELCOME");
display.drawRect(18, 21, 89, 20, 1);
display.display();
delay(2000);
display.clearDisplay();
static const unsigned char PROGMEM image_signal_range__2__bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x1c, 0x1f, 0xf0, 0x00, 0x1c, 0x1f, 0xf0, 0x00, 0x1c, 0x0f, 0xe0, 0x00, 0x1c, 0x07, 0xc0, 0x03, 0x9c, 0x03, 0x80, 0x03, 0x9c, 0x03, 0x80, 0x03, 0x9c, 0x03, 0x80, 0x73, 0x9c, 0x03, 0x80, 0x73, 0x9c, 0x03, 0x80, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x03, 0x8e, 0x73, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
display.drawBitmap(6, 14, image_signal_range__2__bits, 32, 32, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(42, 23);
display.setTextWrap(false);
display.print("CONNECTING");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(105, 23);
display.setTextWrap(false);
display.print("TO");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(41, 33);
display.setTextWrap(false);
display.print("THE NETWORK...");
display.display();
}
// display alert message
void alertMessageOnDisplay() {
display.clearDisplay();
static const unsigned char PROGMEM image_bell__1__bits[] = { 0x01, 0x80, 0x31, 0x8c, 0x27, 0xe4, 0x6f, 0xf6, 0x4f, 0xf2, 0x5f, 0xfa, 0x5f, 0xfa, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x3f, 0xfc, 0x3f, 0xfc, 0x7f, 0xfe, 0x00, 0x00, 0x03, 0xc0, 0x01, 0x80 };
display.drawBitmap(91, 11, image_bell__1__bits, 16, 16, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(46, 7);
display.setTextWrap(false);
display.print(sensor2State); // 2
display.drawRect(4, 32, 26, 13, 1);
display.drawRect(42, 4, 26, 13, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(8, 35);
display.setTextWrap(false);
display.print(sensor3State); //3
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(46, 35);
display.setTextWrap(false);
display.print(sensor4State); // 4
display.drawRect(4, 4, 26, 13, 1);
display.drawRect(42, 32, 26, 13, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(8, 7);
display.setTextWrap(false);
display.print(sensor1State);//1
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(6, 20);
display.setTextWrap(false);
display.print("STA1");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(44, 19);
display.setTextWrap(false);
display.print("STA2");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(6, 48);
display.setTextWrap(false);
display.print("STA3");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(43, 48);
display.setTextWrap(false);
display.print("STA4");
display.drawRect(1, 1, 70, 58, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(91, 33);
display.setTextWrap(false);
display.print("GAS");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(77, 43);
display.setTextWrap(false);
display.print("DETECTED");
display.fillRect(1, 59, 70, 4, 1);
display.display();
}
// display normal mode
void displaySensorData() {
display.clearDisplay();
static const unsigned char PROGMEM image_search_bits[] = { 0x00, 0x0f, 0xc0, 0x00, 0x30, 0x30, 0x00, 0xcf, 0xc8, 0x01, 0xb0, 0x24, 0x01, 0x40, 0x12, 0x02, 0x82, 0x0a, 0x02, 0x83, 0x0e, 0x05, 0x05, 0x05, 0x05, 0x08, 0x85, 0x05, 0x11, 0xc5, 0x05, 0x10, 0x45, 0x05, 0x08, 0x45, 0x02, 0x8d, 0x8a, 0x02, 0xc2, 0x0a, 0x01, 0x60, 0x14, 0x03, 0xb0, 0x6c, 0x04, 0xcf, 0x98, 0x0a, 0xb0, 0x60, 0x11, 0x07, 0x80, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00 };
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(46, 7);
display.setTextWrap(false);
display.print(sensor2State); // 2
display.drawRect(4, 32, 26, 13, 1);
display.drawRect(42, 4, 26, 13, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(8, 35);
display.setTextWrap(false);
display.print(sensor3State); //3
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(46, 35);
display.setTextWrap(false);
display.print(sensor4State); // 4
display.drawRect(4, 4, 26, 13, 1);
// 4
display.drawRect(42, 32, 26, 13, 1);
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(8, 7);
display.setTextWrap(false);
display.print(sensor1State); // 1
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(6, 20);
display.setTextWrap(false);
display.print("STA1");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(44, 19);
display.setTextWrap(false);
display.print("STA2");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(6, 48);
display.setTextWrap(false);
display.print("STA3");
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(43, 48);
display.setTextWrap(false);
display.print("STA4");
display.drawRect(1, 1, 70, 58, 1);
display.drawBitmap(87, 19, image_search_bits, 24, 24, 1);
display.fillRect(1, 59, 70, 4, 1);
display.display();
}