Flame sensor with esp32 cam

Hardware model + communication type: esp32-cam with wifi
Smartphone OS (iOS or Android) + version: Android 11
Blynk server, Blynk Library version: 0.6.1

Hi, I’m trying to make a alarm system that when the flame sensor detects the fire, it takes the photo and sends alarm to blynk. It is not working so far but I want to know what part is not working. It would be very helpful if you give me any advice.
Thank you.

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
BlynkTimer timer; //

// Select camera model
#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#include "camera_pins.h"

#define FLAME 13
#define PHOTO 14
#define LED 4

const char* ssid = "wifiname";
const char* password = "password";
char auth[] = "0123456789";  //sent by Blynk
int flag=0; //

String local_IP;

void startCameraServer();

void takePhoto()
{
  digitalWrite(LED, HIGH);
  delay(200);
  uint32_t randomNum = random(50000);
  Serial.println("http://"+local_IP+"/capture?_cb="+ (String)randomNum);
  Blynk.setProperty(V1, "urls", "http://"+local_IP+"/capture?_cb="+(String)randomNum);
  digitalWrite(LED, LOW);
  delay(1000);
}

void notifyOnFire() //
{
  int isButtonPressed = digitalRead(FLAME);
  if (isButtonPressed==1 && flag==0) {
    Serial.println("Fire in the House");
    Blynk.notify("Alert : Fire in the House");
    takePhoto();
    flag=1;
  }
  else if (isButtonPressed==0)
  {
    flag=0;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(LED,OUTPUT);
  pinMode(FLAME,INPUT_PULLUP); //
  timer.setInterval(1000L,notifyOnFire); //
  Serial.setDebugOutput(true);
  Serial.println();
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  local_IP = WiFi.localIP().toString();
  Serial.println("' to connect");
  Blynk.begin(auth, ssid, password);
}

void loop() {
  // put your main code here, to run repeatedly:
  Blynk.run();
  timer.run();
  }

I’m not sure how you expect us to know that, asked on the information you’ve provided.
Does the code compile?
Does the device connect to Blynk and show as online?
Can you view the images via the URL?
Which part isn’t working from your perspective?

What widgets wo you have in your app, and which pins are they connected to?

What type of flame sensor?
What is it connected to?
How does it notify your hardware of a fire?

Pete.

I’m sorry for the insufficiency of information.

The code did compile but when I see the serial monitor, the figure of the flame sensor didn’t change even though I put the flame on the sensor.

I used image gallery widget which is connected to virtual V1 pin, styled button widget which is connected to digital gp14 pin and notification widget.

I used the flame sensor named KY-026. It is connected to GPIO 13.

What is the purpose of the resistors, transistor and LED?
Why isn’t the data pin on the KY-026 connected directly to GPIO13?

Pete.

Actually, I referenced this circuit and codes.

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//

// Select camera model
#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#include "camera_pins.h"

#define PIR 13
#define PHOTO 14
#define LED 4

const char* ssid = "Jang wifi";
const char* password = "94047960";
char auth[] = "Io_v5QZsyr50Pwue9hElEAXaESfFQTkfV";  //sent by Blynk

String local_IP;

void startCameraServer();

void takePhoto()
{
  digitalWrite(LED, HIGH);
  delay(200);
  uint32_t randomNum = random(50000);
  Serial.println("http://"+local_IP+"/capture?_cb="+ (String)randomNum);
  Blynk.setProperty(V1, "urls", "http://"+local_IP+"/capture?_cb="+(String)randomNum);
  digitalWrite(LED, LOW);
  delay(1000);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED,OUTPUT);
  Serial.setDebugOutput(true);
  Serial.println();
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  local_IP = WiFi.localIP().toString();
  Serial.println("' to connect");
  Blynk.begin(auth, ssid, password);
}

void loop() {
  // put your main code here, to run repeatedly:
  Blynk.run();
  if(digitalRead(PIR) == LOW){
  Serial.println("Send Notification");
  Blynk.notify("Intruder Detected...");
  Serial.println("Capture Photo");
  takePhoto();
  delay(3000);
  }
  if(digitalRead(PHOTO) == HIGH){
  Serial.println("Capture Photo");
  takePhoto();
  }  
}

I’m trying to use both flame sensor and PIR sensor for surveillance camera.
However, I couldn’t find the examples of the esp32-cam including flame sensor.
Therefore, I adjusted some codes from this code for esp8266.

//Ravi Teja Creative Catchers !!
//Blynk Fire Alert system
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
BlynkTimer timer;
char auth[] = "*****************"; //Auth code sent via Email
char ssid[] = "****************"; //Wifi name
char pass[] = "*********";  //Wifi Password
int flag=0;
void notifyOnFire()
{
  int isButtonPressed = digitalRead(D1);
  if (isButtonPressed==1 && flag==0) {
    Serial.println("Ravi Teja Fire in the House");
    Blynk.notify("Alert : Ravi Teja Fire in the House");
    flag=1;
  }
  else if (isButtonPressed==0)
  {
    flag=0;
  }
}
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(D1,INPUT_PULLUP);
timer.setInterval(1000L,notifyOnFire); 
}
void loop()
{
  Blynk.run();
  timer.run();
}

Well, I’d dump all of that unnecessary electronics and connect the digital output pin of the flame sensor to a GPIO on the ESP32 and poll the GPIO with a timer.
Get this working without Blynk first.

Pete.

2 Likes

Thank you for your advice

Hardware model + communication type: esp32-cam with wifi
Smartphone OS (iOS or Android) + version: Android 11
Blynk server, Blynk Library version: 0.6.1

I simplified the code which is uploaded. It detects motion and flame and then alarms and sends a photo to Blynk app. It worked but I want to make a button and timer for on and off.
I need help for the code to make the Function() is off when the BUTTON or TIMER is off.
I made button widget to GPIO15, Timer widget to GPIO2.
The code copiles but I don’t know how to shut on and off with the button and timer.
any comment would be helpful. thanks.


#define FLAME 12
#define PIR 13
#define LED 4
#define BUTTON 15
#define TIMER 2


void loop() {
  Blynk.run();
  Function();
}

void Function(){
if(digitalRead(FLAME) == LOW ){
  Serial.println("Send Notification");
  Blynk.notify("Fire Detected...");
  Serial.println("Capture Photo");
  takePhoto();
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());
  takeSavePhoto(path);
  pictureNumber++;
  delay(3000);
  }
  
  if(digitalRead(PIR) == LOW){
  Serial.println("Send Notification");
  Blynk.notify("Intruder Detected...");
  Serial.println("Capture Photo");
  takePhoto();
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());
  takeSavePhoto(path);
  pictureNumber++;
  delay(3000);
  }
  
  if(digitalRead(PHOTO) == HIGH){
  Serial.println("Capture Photo");
  takePhoto();
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());
  takeSavePhoto(path);
  pictureNumber++;
  }
}

@giittte96 I’ve merged your new topic back in to this one, as it’s about the same thing. Please don’t keep creating new topics on the same subject.

First of all, I’d try to avoid names like “Function” for functions, and “BUTTON” and “TIMER” for variables, It will get confusing at some point, especially when you start using timers.

Which brings me on to the fact that you are calling your Function function from from your void loop, instead of using a timer.
Read this:
http://help.blynk.cc/getting-started-library-auth-token-code-examples/blynk-basics/keep-your-void-loop-clean

I think you should read the “Overriding a Timer (auto/manual mode)” section of this topic:

Pete.

Depending on the type of chemical material that generated the fire, its radiation spectrum may not be visible by your sensors.