Bonjour,
Petit message pour des infos sur mon projet.
J'ai réussi à faire fonctionner ce code suivant en me servant de l'IDE 1.8 :
// Démo ArduCAM Mini (C)2017 Lee
// Web : http://www.ArduCAM.com
// Ce programme est une démonstration de l'utilisation de la plupart des fonctions
// de la bibliothèque avec caméra ArduCAM ESP32 2MP/5MP.
// Cette démo a été réalisée pour la caméra ArduCAM ESP32 2MP/5MP.
// Il peut prendre des photos et les envoyer sur le Web.
// Il peut prendre des photos en continu sous forme de flux vidéo et les envoyer sur le Web.
// L'esquisse de démonstration effectuera les tâches suivantes :
// 1. Réglez l'appareil photo sur le mode de sortie JPEG.
// 2. si le serveur reçoit "adresse IP/capture", il peut prendre une photo et l'envoyer sur le Web.
// 3.si le serveur reçoit "adresse IP/flux", il peut prendre des photos en continu en tant que vidéo
//streaming et envoi sur le Web.
// Ce programme nécessite la bibliothèque ArduCAM V4.0.0 (ou ultérieure) et la caméra ArduCAM ESP32 2MP/5MP
// et utilisez le compilateur Arduino IDE 1.8.1 ou supérieur
#include <WiFi.h>
#include <Wire.h>
#include <ESP32WebServer.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
#if !(defined ESP32 )
#error Please select the ArduCAM ESP32 UNO board in the Tools/Board
#endif
//Cette démo ne peut fonctionner que sur la plateforme OV2640_MINI_2MP ou ARDUCAM_SHIELD_V2.
#if !(defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS)||defined (OV5640_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_PLUS) \
|| defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) \
||(defined (ARDUCAM_SHIELD_V2) && (defined (OV2640_CAM) || defined (OV5640_CAM) || defined (OV5642_CAM))))
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
// définit GPIO17 comme esclave select :
const int CS = 17;
const int CAM_POWER_ON = D10;
#if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
ArduCAM myCAM(OV2640, CS);
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
ArduCAM myCAM(OV5640, CS);
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
ArduCAM myCAM(OV5642, CS);
#endif
// vous pouvez modifier la valeur de wifiType pour sélectionner le mode Station ou AP.
// La valeur par défaut est le mode AP.
int wifiType = 1; // 0:Station 1:AP
//Configuration du mode point d'accès
// La valeur par défaut est arducam_esp8266. Si vous le souhaitez, vous pouvez remplacer AP_aaid par votre nom préféré
const char *AP_ssid = "arducam_esp32";
// La valeur par défaut n'est pas un mot de passe. Si vous souhaitez définir un mot de passe, mettez votre mot de passe ici
const char *AP_password = NULL;
// En mode station, vous devez mettre votre ssid et votre mot de passe
const char *ssid = "******"; // Mettez votre SSID ici
const char *password = "*******"; // Mettez votre MOT DE PASSE ici
static const size_t bufferSize = 2048;
static uint8_t buffer[bufferSize] = {0xFF};
uint8_t temp = 0, temp_last = 0;
int i = 0;
bool is_header = false;
ESP32WebServer server(80);
void start_capture(){
myCAM.clear_fifo_flag();
myCAM.start_capture();
}
void camCapture(ArduCAM myCAM){
WiFiClient client = server.client();
uint32_t len = myCAM.read_fifo_length();
if (len >= MAX_FIFO_SIZE) //8M
//Lire les données JPEG du FIFO
{
Serial.println(F("Over size."));
}
if (len == 0 ) //0 kb
{
Serial.println(F("Size is 0."));
}
myCAM.CS_LOW();
myCAM.set_fifo_burst();
if (!client.connected()) return;
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-Type: image/jpeg\r\n";
response += "Content-len: " + String(len) + "\r\n\r\n";
server.sendContent(response);
i = 0;
while ( len-- )
{
temp_last = temp;
temp = SPI.transfer(0x00);
if ( (temp == 0xD9) && (temp_last == 0xFF) ) // Si trouver la fin, pause pendant,
{
buffer[i++] = temp; // enregistre le dernier 0XD9
//Écrit les octets restants dans le tampon
if (!client.connected()) break;
client.write(&buffer[0], i);
is_header = false;
i = 0;
myCAM.CS_HIGH();
break;
}
if (is_header == true)
{
// Écrit les données de l'image dans le tampon s'il n'est pas plein
if (i < bufferSize)
buffer[i++] = temp;
else
{
// Écrit bufferSize octets de données d'image dans le fichier
if (!client.connected()) break;
client.write(&buffer[0], bufferSize);
i = 0;
buffer[i++] = temp;
}
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
buffer[i++] = temp_last;
buffer[i++] = temp;
}
}
}
void serverCapture(){
delay(1000);
start_capture();
Serial.println(F("CAM Capturing"));
int total_time = 0;
total_time = millis();
while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
total_time = millis() - total_time;
Serial.print(F("capture total_time used (in miliseconds):"));
Serial.println(total_time, DEC);
total_time = 0;
Serial.println(F("CAM Capture Done."));
total_time = millis();
camCapture(myCAM);
total_time = millis() - total_time;
Serial.print(F("send total_time used (in miliseconds):"));
Serial.println(total_time, DEC);
Serial.println(F("CAM send Done."));
}
void serverStream(){
WiFiClient client = server.client();
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
server.sendContent(response);
while (1){
start_capture();
while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
size_t len = myCAM.read_fifo_length();
if (len >= MAX_FIFO_SIZE) //8M
{
Serial.println(F("Over size."));
continue;
}
if (len == 0 ) //0 kb
{
Serial.println(F("Size is 0."));
continue;
}
myCAM.CS_LOW();
myCAM.set_fifo_burst();
if (!client.connected()) break;
response = "--frame\r\n";
response += "Content-Type: image/jpeg\r\n\r\n";
server.sendContent(response);
while ( len-- )
{
temp_last = temp;
temp = SPI.transfer(0x00);
//Lire les données JPEG du FIFO
if ( (temp == 0xD9) && (temp_last == 0xFF) ) // Si trouver la fin, pause pendant,
{
buffer[i++] = temp; // enregistre le dernier 0XD9
//Écrit les octets restants dans le tampon
myCAM.CS_HIGH();;
if (!client.connected()) break;
client.write(&buffer[0], i);
is_header = false;
i = 0;
}
if (is_header == true)
{
// Écrit les données de l'image dans le tampon s'il n'est pas plein
if (i < bufferSize)
buffer[i++] = temp;
else
{
// Écrit bufferSize octets de données d'image dans le fichier
myCAM.CS_HIGH();
if (!client.connected()) break;
client.write(&buffer[0], bufferSize);
i = 0;
buffer[i++] = temp;
myCAM.CS_LOW();
myCAM.set_fifo_burst();
}
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
buffer[i++] = temp_last;
buffer[i++] = temp;
}
}
if (!client.connected()) break;
}
}
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);
Serial.println(message);
if (server.hasArg("ql")){
int ql = server.arg("ql").toInt();
#if defined (OV2640_MINI_2MP) || defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
myCAM.OV2640_set_JPEG_size(ql);
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
myCAM.OV5640_set_JPEG_size(ql);
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
myCAM.OV5642_set_JPEG_size(ql);
#endif
Serial.println("QL change to: " + server.arg("ql"));
}
}
void setup() {
uint8_t vid, pid;
uint8_t temp;
//définir le CS comme sortie :
pinMode(CS,OUTPUT);
pinMode(CAM_POWER_ON , OUTPUT);
digitalWrite(CAM_POWER_ON, HIGH);
#if defined(__SAM3X8E__)
Wire1.begin();
#else
Wire.begin();
#endif
Serial.begin(115200);
Serial.println(F("ArduCAM Start!"));
// initialise SPI :
SPI.begin();
SPI.setFrequency(4000000); //4MHz
//Réinitialiser le CPLD
myCAM.write_reg(0x07, 0x80);
delay(100);
myCAM.write_reg(0x07, 0x00);
delay(100);
//Vérifier si le bus ArduCAM SPI est OK
myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
temp = myCAM.read_reg(ARDUCHIP_TEST1);
if (temp != 0x55){
Serial.println(temp, HEX);
Serial.println(F("SPI1 interface Error!"));
while(1);
}
//Vérifier si le bus ArduCAM SPI est OK
myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
temp = myCAM.read_reg(ARDUCHIP_TEST1);
if (temp != 0x55){
Serial.println(F("SPI1 interface Error!"));
while(1);
}
#if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
//Vérifier si le type de module de caméra est OV2640
myCAM.wrSensorReg8_8(0xff, 0x01);
myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 )))
Serial.println(F("Can't find OV2640 module!"));
else
Serial.println(F("OV2640 detected."));
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
//Vérifier si le type de module de caméra est OV5640
myCAM.wrSensorReg16_8(0xff, 0x01);
myCAM.rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
myCAM.rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
if((vid != 0x56) || (pid != 0x40))
Serial.println(F("Can't find OV5640 module!"));
else
Serial.println(F("OV5640 detected."));
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
//Vérifier si le type de module de caméra est OV5642
myCAM.wrSensorReg16_8(0xff, 0x01);
myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
if((vid != 0x56) || (pid != 0x42)){
Serial.println(F("Can't find OV5642 module!"));
}
else
Serial.println(F("OV5642 detected."));
#endif
//Passez en mode de capture JPEG et initialisez le module OV2640
myCAM.set_format(JPEG);
myCAM.InitCAM();
#if defined (OV2640_MINI_2MP)|| defined (OV2640_MINI_2MP_PLUS) || defined (OV2640_CAM)
myCAM.OV2640_set_JPEG_size(OV2640_320x240);
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH
myCAM.OV5640_set_JPEG_size(OV5640_320x240);
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH
myCAM.OV5640_set_JPEG_size(OV5642_320x240);
#endif
myCAM.clear_fifo_flag();
if (wifiType == 0){
if(!strcmp(ssid,"SSID")){
Serial.println(F("Please set your SSID"));
while(1);
}
if(!strcmp(password,"PASSWORD")){
Serial.println(F("Please set your PASSWORD"));
while(1);
}
// Se connecter au réseau Wi-Fi
Serial.println();
Serial.println();
Serial.print(F("Connecting to "));
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(F("."));
}
Serial.println(F("WiFi connected"));
Serial.println("");
Serial.println(WiFi.localIP());
}else if (wifiType == 1){
Serial.println();
Serial.println();
Serial.print(F("Share AP: "));
Serial.println(AP_ssid);
Serial.print(F("The password is: "));
Serial.println(AP_password);
WiFi.mode(WIFI_AP);
WiFi.softAP(AP_ssid, AP_password);
Serial.println("");
Serial.println(WiFi.softAPIP());
}
// Démarre le serveur
server.on("/capture", HTTP_GET, serverCapture);
server.on("/stream", HTTP_GET, serverStream);
server.onNotFound(handleNotFound);
server.begin();
Serial.println(F("Server started"));
}
void loop() {
server.handleClient();
}
J'arrive à avoir un flux vidéo / photo avec option de résolution comme la photo suivante :

Il s'agit d'une URL local sur mon PC ( chemin de fichier ) qui récupère les données du flux vidéo via une adresse IP locale ( 192.168.1.26 dans mon cas )
Lorsque je tappe dans mon navigateur : http://192.168.1.26:80, je n'obtiens que l'état du serveur mais pas de flux d'image.
Ma question est la suivante :
Je cherche à afficher ce flux vidéo sur une URL web afin d'y avoir accès de partour et l'intégrer facilement dans un dashboard nodered.
Avez vous une idée de comment m'y prendre ?
Merci,
Ludo