erp32_sendpic_php.ino 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. Rui Santos
  3. Complete project details at https://RandomNerdTutorials.com/esp32-cam-post-image-photo-server/
  4. Permission is hereby granted, free of charge, to any person obtaining a copy
  5. of this software and associated documentation files.
  6. The above copyright notice and this permission notice shall be included in all
  7. copies or substantial portions of the Software.
  8. */
  9. #include <Arduino.h>
  10. #include <WiFi.h>
  11. #include "soc/soc.h"
  12. #include "soc/rtc_cntl_reg.h"
  13. #include "esp_camera.h"
  14. #include <ArduinoWebsockets.h>
  15. const char* ssid = "goldin_lab1";
  16. const char* password = "goldin53743001";
  17. String serverName = "60.250.156.230"; // REPLACE WITH YOUR Raspberry Pi IP ADDRESS
  18. //String serverName = "example.com"; // OR REPLACE WITH YOUR DOMAIN NAME
  19. String serverPath = "/upload.php"; // The default serverPath should be upload.php
  20. const int serverPort = 80;
  21. const char* websocket_server_host = "60.250.156.230";
  22. const uint16_t websocket_server_port = 8093;
  23. void startCameraServer();
  24. using namespace websockets;
  25. WebsocketsClient webSocketClient;
  26. WiFiClient client;
  27. // CAMERA_MODEL_AI_THINKER
  28. #define PWDN_GPIO_NUM 32
  29. #define RESET_GPIO_NUM -1
  30. #define XCLK_GPIO_NUM 0
  31. #define SIOD_GPIO_NUM 26
  32. #define SIOC_GPIO_NUM 27
  33. #define Y9_GPIO_NUM 35
  34. #define Y8_GPIO_NUM 34
  35. #define Y7_GPIO_NUM 39
  36. #define Y6_GPIO_NUM 36
  37. #define Y5_GPIO_NUM 21
  38. #define Y4_GPIO_NUM 19
  39. #define Y3_GPIO_NUM 18
  40. #define Y2_GPIO_NUM 5
  41. #define VSYNC_GPIO_NUM 25
  42. #define HREF_GPIO_NUM 23
  43. #define PCLK_GPIO_NUM 22
  44. const int timerInterval = 30000; // time between each HTTP POST image
  45. unsigned long previousMillis = 0; // last time image was sent
  46. void setup() {
  47. WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
  48. Serial.begin(115200);
  49. webSocketClient.send("Hi Server!");
  50. WiFi.mode(WIFI_STA);
  51. Serial.println();
  52. Serial.print("Connecting to ");
  53. Serial.println(ssid);
  54. WiFi.begin(ssid, password);
  55. while (WiFi.status() != WL_CONNECTED) {
  56. Serial.print(".");
  57. delay(500);
  58. }
  59. Serial.println();
  60. Serial.print("ESP32-CAM IP Address: ");
  61. Serial.println(WiFi.localIP());
  62. camera_config_t config;
  63. config.ledc_channel = LEDC_CHANNEL_0;
  64. config.ledc_timer = LEDC_TIMER_0;
  65. config.pin_d0 = Y2_GPIO_NUM;
  66. config.pin_d1 = Y3_GPIO_NUM;
  67. config.pin_d2 = Y4_GPIO_NUM;
  68. config.pin_d3 = Y5_GPIO_NUM;
  69. config.pin_d4 = Y6_GPIO_NUM;
  70. config.pin_d5 = Y7_GPIO_NUM;
  71. config.pin_d6 = Y8_GPIO_NUM;
  72. config.pin_d7 = Y9_GPIO_NUM;
  73. config.pin_xclk = XCLK_GPIO_NUM;
  74. config.pin_pclk = PCLK_GPIO_NUM;
  75. config.pin_vsync = VSYNC_GPIO_NUM;
  76. config.pin_href = HREF_GPIO_NUM;
  77. config.pin_sscb_sda = SIOD_GPIO_NUM;
  78. config.pin_sscb_scl = SIOC_GPIO_NUM;
  79. config.pin_pwdn = PWDN_GPIO_NUM;
  80. config.pin_reset = RESET_GPIO_NUM;
  81. config.xclk_freq_hz = 20000000;
  82. config.pixel_format = PIXFORMAT_JPEG;
  83. // init with high specs to pre-allocate larger buffers
  84. if(psramFound()){
  85. config.frame_size = FRAMESIZE_SVGA;
  86. config.jpeg_quality = 10; //0-63 lower number means higher quality
  87. config.fb_count = 2;
  88. } else {
  89. config.frame_size = FRAMESIZE_CIF;
  90. config.jpeg_quality = 12; //0-63 lower number means higher quality
  91. config.fb_count = 1;
  92. }
  93. // camera init
  94. esp_err_t err = esp_camera_init(&config);
  95. if (err != ESP_OK) {
  96. Serial.printf("Camera init failed with error 0x%x", err);
  97. delay(1000);
  98. ESP.restart();
  99. }
  100. sendPhoto();
  101. while(!webSocketClient.connect(websocket_server_host, websocket_server_port, "/")){
  102. delay(500);
  103. Serial.print(".");
  104. }
  105. Serial.println("Websocket Connected!");
  106. }
  107. void loop() {
  108. unsigned long currentMillis = millis();
  109. if (currentMillis - previousMillis >= timerInterval) {
  110. sendPhoto();
  111. previousMillis = currentMillis;
  112. }
  113. }
  114. String sendPhoto() {
  115. String getAll;
  116. String getBody;
  117. camera_fb_t * fb = NULL;
  118. fb = esp_camera_fb_get();
  119. if(!fb) {
  120. Serial.println("Camera capture failed");
  121. delay(1000);
  122. ESP.restart();
  123. }
  124. webSocketClientent.sendBinary((const char*) fb->buf, fb->len);
  125. while(!webSocketClient.connect(websocket_server_host, websocket_server_port, "/")){
  126. delay(500);
  127. Serial.print(".");
  128. }
  129. Serial.println("Websocket Connected!");
  130. Serial.println("Connecting to server: " + serverName);
  131. if (client.connect(serverName.c_str(), serverPort)) {
  132. Serial.println("Connection successful!");
  133. String head = "--RandomNerdTutorials\r\nContent-Disposition: form-data; name=\"imageFile\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
  134. String tail = "\r\n--RandomNerdTutorials--\r\n";
  135. uint32_t imageLen = fb->len;
  136. uint32_t extraLen = head.length() + tail.length();
  137. uint32_t totalLen = imageLen + extraLen;
  138. client.println("POST " + serverPath + " HTTP/1.1");
  139. client.println("Host: " + serverName);
  140. client.println("Content-Length: " + String(totalLen));
  141. client.println("Content-Type: multipart/form-data; boundary=RandomNerdTutorials");
  142. client.println();
  143. client.print(head);
  144. uint8_t *fbBuf = fb->buf;
  145. size_t fbLen = fb->len;
  146. for (size_t n=0; n<fbLen; n=n+1024) {
  147. if (n+1024 < fbLen) {
  148. client.write(fbBuf, 1024);
  149. fbBuf += 1024;
  150. }
  151. else if (fbLen%1024>0) {
  152. size_t remainder = fbLen%1024;
  153. client.write(fbBuf, remainder);
  154. }
  155. }
  156. client.print(tail);
  157. esp_camera_fb_return(fb);
  158. int timoutTimer = 10000;
  159. long startTimer = millis();
  160. boolean state = false;
  161. while ((startTimer + timoutTimer) > millis()) {
  162. Serial.print(".");
  163. delay(100);
  164. while (client.available()) {
  165. char c = client.read();
  166. if (c == '\n') {
  167. if (getAll.length()==0) { state=true; }
  168. getAll = "";
  169. }
  170. else if (c != '\r') { getAll += String(c); }
  171. if (state==true) { getBody += String(c); }
  172. startTimer = millis();
  173. }
  174. if (getBody.length()>0) { break; }
  175. }
  176. Serial.println();
  177. client.stop();
  178. Serial.println(getBody);
  179. }
  180. else {
  181. getBody = "Connection to " + serverName + " failed.";
  182. Serial.println(getBody);
  183. }
  184. return getBody;
  185. }