ESP32 Cam Deteksi Kecepatan dan Gerakan
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara untuk membuat sebuah alat yang bisa untuk mendeteksi kecepatan dan gerakan menggunakan ESP32 Cam yang mana deteksinya menggunakan kamera. untuk lebih jelasnya berikut kodingnya.
1. Interface
2. Program ESP32 Cam
#include "esp_camera.h"
#include <WiFi.h>
#include <WebServer.h>
//================ WIFI =================
const char* ssid="ESP32-SPEED";
const char* password="12345678";
WebServer server(80);
//================ CAMERA AI THINKER =================
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
//================ ROI DETEKSI =================
#define ROI_X 40
#define ROI_Y 30
#define ROI_W 80
#define ROI_H 60
uint8_t frameLama[ROI_W*ROI_H];
bool pertama=true;
int nilaiMotion=0;
//================ SPEED =================
// perkiraan jarak perpindahan objek
float jarakObjek=2.0;
unsigned long waktuMulai=0;
unsigned long waktuTerakhir=0;
bool objekAktif=false;
float speedKMH=0;
//================ DETEKSI MOTION =================
void detectMotion()
{
camera_fb_t *fb =
esp_camera_fb_get();
if(!fb)
return;
int bedaPixel=0;
int totalPixel=0;
int indexROI=0;
for(int y=ROI_Y;
y<ROI_Y+ROI_H;
y++)
{
for(int x=ROI_X;
x<ROI_X+ROI_W;
x++)
{
int index =
y*fb->width+x;
uint8_t pixel =
fb->buf[index];
if(!pertama)
{
int beda =
abs(pixel-frameLama[indexROI]);
if(beda>25)
{
bedaPixel++;
}
}
frameLama[indexROI]=pixel;
indexROI++;
totalPixel++;
}
}
esp_camera_fb_return(fb);
if(pertama)
{
pertama=false;
return;
}
nilaiMotion =
(bedaPixel*100)/totalPixel;
Serial.print("Motion : ");
Serial.print(nilaiMotion);
Serial.println("%");
//================ HITUNG SPEED =================
if(nilaiMotion > 15)
{
if(!objekAktif)
{
waktuMulai=millis();
objekAktif=true;
Serial.println("OBJEK TERDETEKSI");
}
waktuTerakhir=millis();
}
else
{
if(objekAktif &&
millis()-waktuTerakhir>700)
{
unsigned long waktuAkhir =
millis();
float waktu =
(waktuAkhir-waktuMulai)/1000.0;
if(waktu>0)
{
float speedMS =
jarakObjek/waktu;
speedKMH =
speedMS*3.6;
}
objekAktif=false;
Serial.print("Speed : ");
Serial.print(speedKMH);
Serial.println(" Km/h");
}
if(millis()-waktuTerakhir>2000)
{
speedKMH=0;
}
}
}
//================ WEB DATA =================
void dataSpeed()
{
String json="{";
json+="\"motion\":";
json+=String(nilaiMotion);
json+=",";
json+="\"speed\":";
json+=String(speedKMH,2);
json+="}";
server.send(
200,
"application/json",
json
);
}
//================ WEB =================
void home()
{
String html=R"rawliteral(
<html>
<head>
<meta name='viewport' content='width=device-width'>
</head>
<body style='text-align:center;font-family:Arial'>
<h2>
ESP32 CAMERA SPEED
</h2>
<h3>
Motion :
<span id="motion">
0
</span>
%
</h3>
<h1>
<span id="speed">
0
</span>
Km/h
</h1>
<script>
setInterval(()=>{
fetch('/data')
.then(x=>x.json())
.then(d=>{
motion.innerHTML=d.motion;
speed.innerHTML=d.speed;
});
},500);
</script>
</body>
</html>
)rawliteral";
server.send(
200,
"text/html",
html
);
}
//================ SETUP =================
void setup()
{
Serial.begin(115200);
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_GRAYSCALE;
config.frame_size=
FRAMESIZE_QQVGA;
config.fb_count=1;
esp_camera_init(&config);
// WIFI AP
WiFi.mode(WIFI_AP);
WiFi.softAP(
ssid,
password
);
Serial.println(
WiFi.softAPIP()
);
server.on(
"/",
home
);
server.on(
"/data",
dataSpeed
);
server.begin();
}
//================ LOOP =================
void loop()
{
server.handleClient();
detectMotion();
delay(100);
}
#include <WiFi.h>
#include <WebServer.h>
//================ WIFI =================
const char* ssid="ESP32-SPEED";
const char* password="12345678";
WebServer server(80);
//================ CAMERA AI THINKER =================
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
//================ ROI DETEKSI =================
#define ROI_X 40
#define ROI_Y 30
#define ROI_W 80
#define ROI_H 60
uint8_t frameLama[ROI_W*ROI_H];
bool pertama=true;
int nilaiMotion=0;
//================ SPEED =================
// perkiraan jarak perpindahan objek
float jarakObjek=2.0;
unsigned long waktuMulai=0;
unsigned long waktuTerakhir=0;
bool objekAktif=false;
float speedKMH=0;
//================ DETEKSI MOTION =================
void detectMotion()
{
camera_fb_t *fb =
esp_camera_fb_get();
if(!fb)
return;
int bedaPixel=0;
int totalPixel=0;
int indexROI=0;
for(int y=ROI_Y;
y<ROI_Y+ROI_H;
y++)
{
for(int x=ROI_X;
x<ROI_X+ROI_W;
x++)
{
int index =
y*fb->width+x;
uint8_t pixel =
fb->buf[index];
if(!pertama)
{
int beda =
abs(pixel-frameLama[indexROI]);
if(beda>25)
{
bedaPixel++;
}
}
frameLama[indexROI]=pixel;
indexROI++;
totalPixel++;
}
}
esp_camera_fb_return(fb);
if(pertama)
{
pertama=false;
return;
}
nilaiMotion =
(bedaPixel*100)/totalPixel;
Serial.print("Motion : ");
Serial.print(nilaiMotion);
Serial.println("%");
//================ HITUNG SPEED =================
if(nilaiMotion > 15)
{
if(!objekAktif)
{
waktuMulai=millis();
objekAktif=true;
Serial.println("OBJEK TERDETEKSI");
}
waktuTerakhir=millis();
}
else
{
if(objekAktif &&
millis()-waktuTerakhir>700)
{
unsigned long waktuAkhir =
millis();
float waktu =
(waktuAkhir-waktuMulai)/1000.0;
if(waktu>0)
{
float speedMS =
jarakObjek/waktu;
speedKMH =
speedMS*3.6;
}
objekAktif=false;
Serial.print("Speed : ");
Serial.print(speedKMH);
Serial.println(" Km/h");
}
if(millis()-waktuTerakhir>2000)
{
speedKMH=0;
}
}
}
//================ WEB DATA =================
void dataSpeed()
{
String json="{";
json+="\"motion\":";
json+=String(nilaiMotion);
json+=",";
json+="\"speed\":";
json+=String(speedKMH,2);
json+="}";
server.send(
200,
"application/json",
json
);
}
//================ WEB =================
void home()
{
String html=R"rawliteral(
<html>
<head>
<meta name='viewport' content='width=device-width'>
</head>
<body style='text-align:center;font-family:Arial'>
<h2>
ESP32 CAMERA SPEED
</h2>
<h3>
Motion :
<span id="motion">
0
</span>
%
</h3>
<h1>
<span id="speed">
0
</span>
Km/h
</h1>
<script>
setInterval(()=>{
fetch('/data')
.then(x=>x.json())
.then(d=>{
motion.innerHTML=d.motion;
speed.innerHTML=d.speed;
});
},500);
</script>
</body>
</html>
)rawliteral";
server.send(
200,
"text/html",
html
);
}
//================ SETUP =================
void setup()
{
Serial.begin(115200);
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_GRAYSCALE;
config.frame_size=
FRAMESIZE_QQVGA;
config.fb_count=1;
esp_camera_init(&config);
// WIFI AP
WiFi.mode(WIFI_AP);
WiFi.softAP(
ssid,
password
);
Serial.println(
WiFi.softAPIP()
);
server.on(
"/",
home
);
server.on(
"/data",
dataSpeed
);
server.begin();
}
//================ LOOP =================
void loop()
{
server.handleClient();
detectMotion();
delay(100);
}
3. VIDEO HASILNYA


No comments:
Post a Comment