Translate

ESP32 Cam Deteksi Kecepatan dan Gerakan

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);

}
 
 
 
3. VIDEO HASILNYA
 
 

 

No comments:

Post a Comment