arkhipenko / esp32-cam-mjpeg

ESP32 mjpeg streaming server
BSD 3-Clause "New" or "Revised" License
172 stars 76 forks source link

How to control cam and car together #2

Closed anuragmehra24 closed 3 years ago

anuragmehra24 commented 3 years ago

I am trying to create ESP32 Cam car using mjpeg code. I am able to modify the code and add command to control led and car. Independently cam, led lights and car wheels are working fine. However when i have to run camera and control the car together, it is not working. I am new to coding and not sure how to handle the multitasking. I am building app using mit app inventor to view the com as well as run the car. Please help me how to modify the code co that camera video can run alongside controlling the car. Below is the modified code.

/*

This is a simple MJPEG streaming webserver implemented for AI-Thinker ESP32-CAM and ESP32-EYE modules. This is tested to work with VLC and Blynk video widget.

Inspired by and based on this Instructable: $9 RTSP Video Streamer Using the ESP32-CAM Board (https://www.instructables.com/id/9-RTSP-Video-Streamer-Using-the-ESP32-CAM-Board/)

Board: AI-Thinker ESP32-CAM

*/

include "src/OV2640.h"

include

include

include

// 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"

extern int gpLb = 2; // Left 1 extern int gpLf = 14; // Left 2 extern int gpRb = 15; // Right 1 extern int gpRf = 13; // Right 2 extern int gpLed = 4; // Light

long previousMillis = 0; long interval = 500; /* Next one is an include with wifi credentials. This is what you need to do:

  1. Create a file called "home_wifi_multi.h" in the same folder OR under a separate subfolder of the "libraries" folder of Arduino IDE. (You are creating a "fake" library really - I called it "MySettings").
  2. Place the following text in the file:

    define SSID1 "replace with your wifi ssid"

    define PWD1 "replace your wifi password"

  3. Save.

Should work then */ //#include "home_wifi_multi.h"

define SSID1 "xxxxx"

define PWD1 "xxxxxxxxxx"

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; unsigned long currentMillis = millis();

WiFiClient client = server.client();

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

while (true) { if (!client.connected()) break; //Anurag //if(currentMillis - previousMillis > interval) { // previousMillis = currentMillis;
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); //}//Anurag }

}

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

if (!client.connected()) return; cam.run(); client.write(JHEADER, jhdLen); client.write((char *)cam.getfb(), cam.getSize()); }

const char CHEADER[] = "HTTP/1.1 200 OK\r\n" \ "Access-Control-Allow-Origin: *\r\n" \ "Content-type: text/html\r\n\r\n"; const int chdLen = strlen(CHEADER); void handle_forward(void) { WiFiClient client = server.client();

if (!client.connected()) return; WheelAct(HIGH, LOW, HIGH, LOW); Serial.println("Go"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; WheelAct(LOW, HIGH, LOW, HIGH); Serial.println("Back"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; WheelAct(HIGH, LOW, LOW, HIGH); Serial.println("Left"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; WheelAct(LOW, HIGH, HIGH, LOW); Serial.println("Right"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; WheelAct(LOW, LOW, LOW, LOW); Serial.println("Stop"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; digitalWrite(gpLed, HIGH); Serial.println("LED ON"); //client.write(CHEADER, chdLen); // client.write((char *)cam.getfb(), cam.getSize()); }

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

if (!client.connected()) return; digitalWrite(gpLed, LOW); Serial.println("LED OFF"); //client.write(CHEADER, chdLen); // 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 WheelAct(int nLf, int nLb, int nRf, int nRb) { digitalWrite(gpLf, nLf); digitalWrite(gpLb, nLb); digitalWrite(gpRf, nRf); digitalWrite(gpRb, nRb); }

void setup() {

Serial.begin(115200); //while (!Serial); //wait for serial connection. pinMode(gpLb, OUTPUT); //Left Backward pinMode(gpLf, OUTPUT); //Left Forward pinMode(gpRb, OUTPUT); //Right Forward pinMode(gpRf, OUTPUT); //Right Backward pinMode(gpLed, OUTPUT); //Light

//initialize digitalWrite(gpLb, LOW); digitalWrite(gpLf, LOW); digitalWrite(gpRb, LOW); digitalWrite(gpRf, LOW); digitalWrite(gpLed, LOW);

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;

// Frame parameters config.frame_size = FRAMESIZE_UXGA; //config.frame_size = FRAMESIZE_QVGA; config.jpeg_quality = 10; 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.on("/forward", HTTP_GET, handle_forward); server.on("/back", HTTP_GET, handle_back); server.on("/left", HTTP_GET, handle_left); server.on("/right", HTTP_GET, handle_right); server.on("/stop", HTTP_GET, handle_stop); server.on("/ledon", HTTP_GET, handle_ledon); server.on("/ledoff", HTTP_GET, handle_ledoff); server.onNotFound(handleNotFound); server.begin();

}

void loop() { server.handleClient(); delay(1); }

arkhipenko commented 3 years ago

I wish I had the time to support your project. What you are trying to achieve has been implemented in this project. However, I would not consider this to be a novice project, so you'll have to understand how it works.

https://www.hackster.io/anatoli-arkhipenko/minecraft-interactive-do-not-enter-sword-sign-esp32-cam-cd1b07