Translate

Alat Penghitung / Counter Barang Benda Realtime dan Fitur Setting ID Barang

 Alat Penghitung / Counter Barang Benda Realtime dan Fitur Setting ID Barang

       
        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk menghitung jumlah barang yang lewat di depan sensor jarak sehingga akan terdeteksi dan alat akan melakukan counter +1 sehingga user akan tahu berapa jumlah barang yang lewat di area sensor tersebut. dan juga alat ini bisa disetting untuk ID barangnya sehingga jika terdapat lebih dari satu barang bisa dilakukan pemisahan berdasarkan ID barang. untuk lebih jelasnya berikut adalah koding dan daftar komponennya.



a. Arduino Nano




b. Sensor Jarak  




c. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;
volatile byte pulseCount;
unsigned long oldTime;
int btup = 3;
int btdown = 4;
int btupx = 0;
int btdownx = 0;
int id;

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  attachInterrupt(sensorInterrupt, pulseCounter, RISING);
  pinMode(btup,INPUT_PULLUP);
  pinMode(btdown,INPUT_PULLUP);   
}

void loop() {

btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

if(btupx == 0){
  id++;
  delay(500);
}

if(btdownx == 0){
  id--;
  delay(500);
}
  
 lcd.setCursor(0,0);
 lcd.print("ID= ");
 lcd.print(id);
 lcd.print("  ");
 
 lcd.setCursor(0,1);
 lcd.print("Qty= ");
 lcd.print(pulseCount);
 lcd.print("  ");

 Serial.print("ID= ");
 Serial.print(id);
 Serial.print(" Qty= ");
 Serial.println(pulseCount);

 delay(200);
}

void pulseCounter()
{
  pulseCount++;
}




d. VIDEO HASILNYA






Restaurant Ordering System Using Arduino and Proteus

Restaurant Ordering System Using Arduino and Proteus


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk melalukan order makanan minuman dan dessert. jadi alat ini hanyalah simulasi dengan menggunakan software proteus 7. jadi simulasi alat ini menggunakan 3 buah push button untuk memilih pilihan yang tersedia dan ada satu buah tombol untuk resetnya. untuk lebih jelasnya berikut adalah koding dan skemanya.



a. Skema Simulasi Alat




b. Program Arduino IDE

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 20, 4);

//mosi - 11
//miso - 12
//clk - 13
//cs - 4
File myFile;

int btmenu1 = 2;
int btmenu2 = 3;
int btmenu3 = 5;
int btmenu1x;
int btmenu2x;
int btmenu3x;
int cmenu1;
int cmenu2;
int cmenu3;

void setup() {

  pinMode(btmenu1,INPUT_PULLUP);
  pinMode(btmenu2,INPUT_PULLUP);
  pinMode(btmenu3,INPUT_PULLUP);
 
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();

}

void loop() {
menu1();
delay(200);
lcd.clear();
menu2();
delay(200);
lcd.clear();
menu3();
delay(200);
lcd.clear();
greeting();
lcd.clear();
delay(200);
}

void menu1(){
  
btmenu1x = digitalRead(btmenu1);
btmenu2x = digitalRead(btmenu2);
btmenu3x = digitalRead(btmenu3);

lcd.setCursor(0,0);
lcd.print("Choose Food ");
lcd.setCursor(0,1);
lcd.print("1. Chicken  ");
lcd.setCursor(0,2);
lcd.print("2. Burger   ");
lcd.setCursor(0,3);
lcd.print("3. Pizza    ");
   
if(btmenu1x == 0){
cmenu1 = 1;
return;
}

if(btmenu2x == 0){
cmenu1 = 2;
return;
}

if(btmenu3x == 0){
cmenu1 = 3;
return;
}

menu1();
}

void menu2(){
  
btmenu1x = digitalRead(btmenu1);
btmenu2x = digitalRead(btmenu2);
btmenu3x = digitalRead(btmenu3);

lcd.setCursor(0,0);
lcd.print("Choose Drink   ");
lcd.setCursor(0,1);
lcd.print("1. Tea  ");
lcd.setCursor(0,2);
lcd.print("2. Lemon Tea   ");
lcd.setCursor(0,3);
lcd.print("3. Milk       ");
   
if(btmenu1x == 0){
cmenu2 = 1;
return;
}

if(btmenu2x == 0){
cmenu2 = 2;
return;
}

if(btmenu3x == 0){
cmenu2 = 3;
return;
}

menu2();
}

void menu3(){
  
btmenu1x = digitalRead(btmenu1);
btmenu2x = digitalRead(btmenu2);
btmenu3x = digitalRead(btmenu3);

lcd.setCursor(0,0);
lcd.print("Choose Fruit   ");
lcd.setCursor(0,1);
lcd.print("1. Manggo  ");
lcd.setCursor(0,2);
lcd.print("2. Orange   ");
lcd.setCursor(0,3);
lcd.print("3. Grape      ");
   
if(btmenu1x == 0){
cmenu3 = 1;
return;
}

if(btmenu2x == 0){
cmenu3 = 2;
return;
}

if(btmenu3x == 0){
cmenu3 = 3;
return;
}

menu3();
}

void greeting(){
  
Serial.print("Order Menu1: ");  
Serial.println(cmenu1);
Serial.print("Order Menu2: ");
Serial.println(cmenu2);
Serial.print("Order Menu3: ");
Serial.println(cmenu3);

lcd.setCursor(0,0);
lcd.print("Thankyou for order");
lcd.setCursor(0,1);
lcd.print("Please wait");
lcd.setCursor(0,2);
lcd.print("Save to SD");
delay(1000);
savetosd();
}

void savetosd(){

while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  //Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    //Serial.println("initialization failed!");
    return;
  }
  //Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
     
    myFile.print("choose1= ");
    myFile.println(cmenu1);
    myFile.print("choose2= ");
    myFile.println(cmenu2);
    myFile.print("choose3= ");
    myFile.println(cmenu2);
     
    // close the file:
    myFile.close();
    //Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    //Serial.println("error opening test.txt");
  }

}




c. VIDEO HASILNYA





KENDALI KIPAS ANGIN / FAN MENGGUNAKAN GESTURE TANGAN SENSOR APDS 9960

KENDALI KIPAS ANGIN / FAN MENGGUNAKA GESTURE TANGAN SENSOR APDS 9960 

            Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara untuk membuat sebuah alat yang bisa mengendalikan kipas angin menggunakan gesture tangan, jadi gesture tangan yang diberikan hanya swap ke kanan dan swap ke kiri untuk mengendalikan on/off kipas angin, sensor yang dipakai yaitu apds9960. untuk lebih jelasnya berikut adalah koding dan komponenya.

 

a. Arduino Uno


 

b. Sensor APDS9960


 

c. Modul Relay




d. Skema 




 

e. Program Arduino IDE 

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

int speedx;

void setup() {
 
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
 
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);

  // Set interrupt pin as input
  pinMode(APDS9960_INT, INPUT);

  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("Y-GESTURE APDS - GestureTest"));
  Serial.println(F("--------------------------------"));
 
  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }
 
 //  Start running the APDS-9960 gesture sensor engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }

if(speedx == 0){
        digitalWrite(3, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
  }

if(speedx == 1){
        digitalWrite(3, HIGH);
        digitalWrite(5, LOW);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
  }

if(speedx == 2){
        digitalWrite(3, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
  }  

if(speedx == 3){
        digitalWrite(3, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
  }  


if(speedx > 3){  
  speedx = 3;
}

if(speedx < 0){  
  speedx = 0;
}
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("ATAS");
        speedx++;
        break;
        
      case DIR_DOWN:
        Serial.println("BAWAH");
        speedx--;        
        break;
        
      case DIR_LEFT:
        Serial.println("KIRI");
        digitalWrite(4, HIGH);
        digitalWrite(3, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        break;
        
      case DIR_RIGHT:
        Serial.println("KANAN");

        digitalWrite(4, LOW);
        digitalWrite(3, HIGH);
        digitalWrite(5, LOW);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        break;
        
      case DIR_NEAR:
        Serial.println("NEAR");

        break;
      case DIR_FAR:
        Serial.println("FAR");

        break;
      default:
        Serial.println("NONE");
    }
  }
}

  

 

 f. VIDEO HASILNYA




Monitor Suhu Tubuh / Object Non-Contact MLX90614 via BLYNK ESPDUINO32 ESP32 ARDUINO

Monitor Suhu Tubuh / Object Non-Contact MLX90614 via BLYNK ESPDUINO32 ESP32
 

           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu tubuh maupun suhu object yang berada di depan sensor, sensor yang dipakai pada alat ini yaitu mlx90614 dan monitor dilakukan via aplikasi Blynk. untuk lebih jelasnya berikut adalah skema dan programnya.

 

a. Skema Alat
 
 
 

b. ESPDUINO-32
 

 
 
c. LCD 16x2 I2C
 

 
 
d. Sensor Suhu Non-contact MLX90614
 

 
 
 
e. Program Arduino IDE
 
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

float TargetC;
BlynkTimer timer;
int dataadc1;
int dataadc2;
 
char auth[] = "hgjhgjttdgf778t87fg7hhuhkjbhvgcgcbjbjh";
char ssid[] = "hotspothpku";
char pass[] = "123456789";

void senddata() {
    Blynk.virtualWrite(V4, TargetC);
}

void setup() {
  mlx.begin();
  pinMode(18,OUTPUT);
  pinMode(19,OUTPUT);
  pinMode(23,OUTPUT);
  pinMode(5,OUTPUT);
 
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(1000L, senddata);
}

void loop() {
 
   TargetC = mlx.readObjectTempC();

   lcd.setCursor(0,0);
   lcd.print("Suhu= ");
   lcd.print(TargetC);
   lcd.print(" C    ");

  delay(200);
      
  Blynk.run();
  timer.run();
}
 
 
 
 
f. VIDEO HASILNYA
 
 

 
 


Tutorial ESPDUINO-32 (ESP-32) Monitor ADC Connect to Blynk

Tutorial ESPDUINO-32 (ESP-32) Monitor ADC Connect to Blynk

            Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengakses pin ADC ESPDUINO-32 dan terkoneksi ke Blynk. jadi pada aplikasi Blynk akan tertampil nilai 2 buah adc yang mana nilai adc tersebut adalah input dari dua buah potensiometer yang dihubungkan ke pin ADC tersebut. untuk lebih jelasnya berikut adalah koding dan daftar komponennya.


a. ESPDUINO-32


b. LCD 16x2 + I2C
 


c. Potensiometer
 



d. Program Arduino IDE

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

BlynkTimer timer;
int dataadc1;
int dataadc2;
 
char auth[] = "hgfhgytddytgfhgjhku768768fgfwqw1265";
char ssid[] = "hotspothp";
char pass[] = "123456789";

void senddata() {
    Blynk.virtualWrite(V4, dataadc1);
    Blynk.virtualWrite(V5, dataadc2);
}

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(1000L, senddata);
}

void loop() {

  dataadc1 = analogRead(34);
  dataadc2 = analogRead(35);

   lcd.setCursor(0,0);
   lcd.print("ADC1=");
   lcd.print(dataadc1);
   lcd.print("     ");
   lcd.setCursor (0,1);
   lcd.print("ADC2=");
   lcd.print(dataadc2);
   lcd.print("     ");

  delay(200);
      
  Blynk.run();
  timer.run();
}



e. VIDEO HASILNYA
 



TUTORIAL UPLOAD CODING / SKETCH ESPDUINO-32 (ESP-32)

TUTORIAL UPLOAD CODING / SKETCH ESPDUINO-32 (ESP-32) 


          Pada kesempatan kali ini saya akan memberikan tutorial mengenai bagaimana cara upload sketch atau koding ke board espduino-32 yang mana board ini berbasis esp-32. yang harus diperhatikan yaitu penambahan kapasitor 4.7 uF agar koding / sketch dapat terupload ke dalam board espduino-32. untuk lebih jelasnya berikut adalah komponen dan programnya.



a. ESPDUINO-32




b. Capasitor 4.7 uF





c. Error yang terjadi jika upload tanpa capasitor (ERROR SOLVED)





d Program Arduino IDE

void setup() {                
  pinMode(2, OUTPUT);     
}

void loop() {
  digitalWrite(2, HIGH);   
  delay(1000);               
  digitalWrite(2, LOW);    
  delay(1000);               
}



e. VIDEO HASILNYA




Tutorial ESP32-CAM Membuat CCTV dan Connect to Blynk

Tutorial ESP32-CAM Membuat CCTV dan Connect to Blynk
 
        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengakses ESP32-CAM untuk menjadi CCTV dan bisa terhubung ke aplikasi Blynk secara wireless, untuk melakukan percobaan ini yang dibutuhkan yaitu ESP32-CAM dan modul downloadernya kemudian handphone yang sudah terinstal aplikasi Blynk. untuk lebih jelasnya berikut adalah komponen dan kodingnya. 
 
 
 
 
a. ESP32-CAM + Downloader



b. Program Arduino ESP32-CAM Camera WebServer 

#include "esp_camera.h"
#include <WiFi.h>

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

const char* ssid = "hotspot hpku";
const char* password = "123456789";

void startCameraServer();

void setup() {
  Serial.begin(115200);
  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;
  //init with high specs to pre-allocate larger buffers
  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;
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

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

#if defined(CAMERA_MODEL_M5STACK_WIDE)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

  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());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}


 
 
c. Program Arduino ESP32-CAM Connect to Blynk
 
#include "src/OV2640.h"
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>

#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

#define SSID1 "hotspot hpku"
#define PWD1 "123456789"

OV2640 cam;

WebServer server(80);

const char HEADER[] = "HTTP/1.1 200 OK\r\n" \
                      "Access-Control-Allow-Origin: *\r\n" \
                      "Content-Type: multipart/x-mixed-replace; boundary=123456789000000000000987654321\r\n";
const char BOUNDARY[] = "\r\n--123456789000000000000987654321\r\n";
const char CTNTTYPE[] = "Content-Type: image/jpeg\r\nContent-Length: ";
const int hdrLen = strlen(HEADER);
const int bdrLen = strlen(BOUNDARY);
const int cntLen = strlen(CTNTTYPE);

void handle_jpg_stream(void)
{
  char buf[32];
  int s;

  WiFiClient client = server.client();

  client.write(HEADER, hdrLen);
  client.write(BOUNDARY, bdrLen);

  while (true)
  {
    if (!client.connected()) break;
    cam.run();
    s = cam.getSize();
    client.write(CTNTTYPE, cntLen);
    sprintf( buf, "%d\r\n\r\n", s );
    client.write(buf, strlen(buf));
    client.write((char *)cam.getfb(), s);
    client.write(BOUNDARY, bdrLen);
  }
}

const char JHEADER[] = "HTTP/1.1 200 OK\r\n" \
                       "Content-disposition: inline; filename=capture.jpg\r\n" \
                       "Content-type: image/jpeg\r\n\r\n";
const int jhdLen = strlen(JHEADER);

void handle_jpg(void)
{
  WiFiClient client = server.client();

  cam.run();
  if (!client.connected()) return;

  client.write(JHEADER, jhdLen);
  client.write((char *)cam.getfb(), cam.getSize());
}

void handleNotFound()
{
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text / plain", message);
}

void setup()
{

  Serial.begin(115200);
  //while (!Serial);            //wait for serial connection.

  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;
  }
*/

  // Frame parameters
  //  config.frame_size = FRAMESIZE_UXGA;
  config.frame_size = FRAMESIZE_QVGA; //UXGA,SXGA,XGA,SVGA,VGA,CIF,QVGA,HQVGA,QQVGA
  config.jpeg_quality = 12;
  config.fb_count = 2;


#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  cam.init(config);

  IPAddress ip;

  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID1, PWD1);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(F("."));
  }
  ip = WiFi.localIP();
  Serial.println(F("WiFi connected"));
  Serial.println("");
  Serial.println(ip);
  Serial.print("Stream Link: http://");
  Serial.print(ip);
  Serial.println("/mjpeg/1");
  server.on("/mjpeg/1", HTTP_GET, handle_jpg_stream);
  server.on("/jpg", HTTP_GET, handle_jpg);
  server.onNotFound(handleNotFound);
  server.begin();
}

void loop()
{
  server.handleClient();
}
 
 
 
 
d. VIDEO TUTORIALNYA
 




 
 
Link Sumber: 
https://www.youtube.com/watch?v=ukWvHX-JTgI