Voila mis la 1.5 ce matin et tout fonctionne
Pour moi, il reste à voir:
- les deux serveurs web qui tournent
- pouvoir activer/desactiver des flux (comme le rstp par exemple)
Mais j’en suis pas capable, moi
Voila mis la 1.5 ce matin et tout fonctionne
Pour moi, il reste à voir:
Mais j’en suis pas capable, moi
Faut voir précise un peut ton idée !
Waouu olive. Super.
Est il possible de trouver sur l. Esp32 un dio pour en contact sec pour piloter des infrarouge et bien sûr avec le code associer pour créer des scenario sur jeedom.
Pas capable non plus d’écrire une ligne de code.
Ben faut voir mais la sortie led pourrait être équipée d’un relais.
pour le reste il faut étudier si il y a des gpio de libre ou pas.
edit oui il y en a des utilisable :
Les broches GPIO2, GPIO4, GPIO12, GPIO13, GPIO14, GPIO15 et GPIO16 sont disponibles pour vos projets.
il n’y a pas de contact sec mais tu peut ajouter un ou des modules relais
Voila la version 1.6 qui ajoute la gestion du GPIO12
//---------------------------------------------------------------------------------------------------------------------
// DOCS UTILES:
// ------------
// SERVEUR WEB CAM: https://community.jeedom.com/t/tuto-camera-a-focale-fixe-basee-sur-esp32/17587/49
// LED WIFI: https://techtutorialsx.com/2018/02/03/esp32-arduino-async-server-controlling-http-methods-allowed/
// Installing Asyncwebserver: https://techtutorialsx.com/2017/12/01/esp32-arduino-asynchronous-http-webserver/
// IMAGE PARAMS: https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/
// @drs
// modified @olive v1.5 mercredi 20 mai 2020 12h30
//
// PARAMETRES A MODIFIER:
// ----------------------
// RESOLUTION: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA / QUALITY (10-63)
// WSPORT: port web (pour affichage images)
// ASYNCPORT: port AsyncWebServer (pour gestion LED)
// Paramètres image
//
// USAGE:
// ------
// http://ip-esp:WSPORT/ page d'accueil
// http://ip-esp:WSPORT/_ac page de config
// http://ip-esp:WSPORT/mjpg: stream
// http://ip-esp:WSPORT/snapshot.jpg image
//
// GESTION DE LA LED:
// ------------------
// http://ip-esp:ASYNCPORT/relay Etat de la led (format binaire)
// http://ip-esp:ASYNCPORT/relay/on Allume la LED
// http://ip-esp:ASYNCPORT/relay/off Eteint la LED
// http://ip-esp:ASYNCPORT/relay/toggle Allume/Eteint la LED
//
// GESTION DU GPIO12:
// ------------------
// http://ip-esp:ASYNCPORT/gpio12 Etat du gpio12 (format binaire)
// http://ip-esp:ASYNCPORT/gpio12/on Allume gpio12
// http://ip-esp:ASYNCPORT/gpio12/off Eteint gpio12
// http://ip-esp:ASYNCPORT/gpio12/toggle Allume/Eteint gpio12
//
// INTEGRATION JEEDOM:
// -------------------
// Plugin Camera:
// Laisser le type de camera sur "Aucun"
// Renseigner l'IP et le port (webserver)
// URL de snapshot: /snapshot.jpg
// URL de flux: /mjpg
//
// Script gestion led:
// Action/Default
// URL: voir ci-dessus
// Cocher "Pas d'erreurs"
// La réponse doit contenir: ok (en minuscule)
// Timeout: si besoin (pas nécessaire)
//
//---------------------------------------------------------------------------------------------------------------------
#include <WiFi.h>
#include <WebServer.h>
#include <ESPAsyncWebServer.h> //permet la connexion simultanee pour la gestion de la LED
#include <WiFiClient.h>
#include <AutoConnect.h> // Needs AutoConnect, PageBuilder libraries!
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_camera.h" // Pas sur de l'utilité. A vérifier
#define ENABLE_RTSPSERVER
#define ENABLE_WEBSERVER
#define RESOLUTION FRAMESIZE_XGA // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
#define QUALITY 10 // JPEG quality 10-63 (lower means better quality)
// PARAMETRES IMAGE
#define BRIGHT 1 // Brightness: -2 to 2
#define CONTRAST 0 // Contrast: -2 to 2
#define SATUR 0 // Color Saturation: -2 to 2
#define SPECIAL 0 // Special effects: 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
#define WHITEBAL 1 // White Balance: 0 = disable , 1 = enable
#define AWBGAIN 1 // White Balance Gain: 0 = disable , 1 = enable
#define AWBMODE 3 // White Balance Mode: 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
#define EXPOS 1 // Exposure Control: 0 = disable , 1 = enable
#define AEC2 0 // 0 = disable , 1 = enable
#define AELEV 0 // -2 to 2
#define AECVAL 300 // 0 to 1200
#define GAINCT 1 // 0 = disable , 1 = enable
#define GAINAGC 0 // 0 = disable , 1 = enable
#define GAINCELL 0 // 0 = disable , 1 = enable
#define BPC 0 // 0 = disable , 1 = enable
#define WPC 1 // 0 = disable , 1 = enable
#define RAWGMA 1 // 0 = disable , 1 = enable
#define LENC 1 // Lens Correction: 0 = disable , 1 = enable
#define MIRROR 0 // Horizontal Mirror: 0 = disable , 1 = enable
#define FLIP 0 // Vertical Flip: 0 = disable , 1 = enable
#define DCW 1 // 0 = disable , 1 = enable
#define CBAR 0 // Set a colorBar: 0 = disable , 1 = enable
#define LED_BUILTIN 4 // VA SERVIR POUR ALLUMER et ETEINDRE LA LED - NE PAS MODIFIER CETTE VALEUR (GPIO4)
#include "OV2640.h"
#ifdef ENABLE_RTSPSERVER
#include "OV2640Streamer.h"
#include "CRtspSession.h"
#endif
OV2640 cam;
boolean useRTSP = true;
#define WSPORT 80 // modifier le port pour Webserver Image
#define ASYNCPORT 81 // modifier le port pour Webserver LED
WebServer server(WSPORT);
AsyncWebServer serverasync(ASYNCPORT);
AutoConnect Portal(server);
AutoConnectConfig acConfig;
#ifdef ENABLE_RTSPSERVER
WiFiServer rtspServer(554);
CStreamer *streamer;
#endif
void handle_jpg_stream(void)
{
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)
{
cam.run();
if (!client.connected())
break;
response = "--frame\r\n";
response += "Content-Type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
server.sendContent("\r\n");
if (!client.connected())
break;
}
}
void handle_jpg(void)
{
WiFiClient client = server.client();
cam.run();
if (!client.connected())
{
return;
}
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-disposition: inline; filename=snapshot.jpg\r\n";
response += "Content-type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
}
void handle_root(void)
{
String reply = F("<!doctype html><html><H1>ESP32CAM</H1>");
reply += F("<p>Resolution: ");
switch(RESOLUTION) {
case FRAMESIZE_QVGA:
reply += F("QVGA (320x240)");
break;
case FRAMESIZE_CIF:
reply += F("CIF (400x296)");
break;
case FRAMESIZE_VGA:
reply += F("VGA (640x480)");
break;
case FRAMESIZE_SVGA:
reply += F("SVGA (800x600)");
break;
case FRAMESIZE_XGA:
reply += F("XGA (1024x768)");
break;
case FRAMESIZE_SXGA:
reply += F("SXGA (1280x1024)");
break;
case FRAMESIZE_UXGA:
reply += F("UXGA (1600x1200)");
break;
default:
reply += F("Unknown");
break;
}
reply += F("<p>PSRAM found: ");
if (psramFound()){
reply += F("TRUE");
} else {
reply += F("FALSE");
}
String IP = WiFi.localIP().toString();
String IPH = "http://" + IP + ":" + WSPORT;
String IPA = "http://" + IP + ":" + ASYNCPORT;
String IPR = "rstp://" + IP + ":554";
String url = IPH + "/snapshot.jpg";
reply += "<p>Snapshot URL:<br> <a href='" + url + "'>" + url + "</a>";
url = IPH + "/mjpg";
reply += "<p>HTTP MJPEG URL:<br> <a href='" + url + "'>" + url + "</a>";
url = IPR + "/mjpeg/1";
reply += "<p>RTSP MJPEG URL:<br> " + url;
url = IPH + "/_ac";
reply += "<p>WiFi settings page:<br> <a href='" + url + "'>" + url + "</a>";
//LED
url = IPA + "/relay/on";
reply += "<p>Led_on:<br> <a href='" + url + "'>" + url + "</a>";
url = IPA + "/relay/off";
reply += "<p>Led_off:<br> <a href='" + url + "'>" + url + "</a>";
//GPIO12
url = IPA + "/gpio12/on";
reply += "<p>gpio12_on:<br> <a href='" + url + "'>" + url + "</a>";
url = IPA + "/gpio12/off";
reply += "<p>gpio12_off:<br> <a href='" + url + "'>" + url + "</a>";
reply += F("</body></html>");
server.send(200, "text/html", reply);
}
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(){
pinMode(LED_BUILTIN, OUTPUT); // pour LED
digitalWrite(LED_BUILTIN, LOW); // pour LED
pinMode(12, OUTPUT); // pour RELAIS SUR GPIO12
digitalWrite(12, LOW); // pour RELAIS SUR GPIO12
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
// while (!Serial){;} // debug only
camera_config_t cconfig;
cconfig = esp32cam_aithinker_config;
if (psramFound()) {
cconfig.frame_size = RESOLUTION; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
cconfig.jpeg_quality = QUALITY;
cconfig.fb_count = 2;
} else {
if (RESOLUTION>FRAMESIZE_SVGA) {
cconfig.frame_size = FRAMESIZE_SVGA;
}
cconfig.jpeg_quality = 12;
cconfig.fb_count = 1;
}
cam.init(cconfig);
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, BRIGHT);
s->set_contrast(s, CONTRAST);
s->set_saturation(s, SATUR);
s->set_special_effect(s, SPECIAL);
s->set_whitebal(s, WHITEBAL);
s->set_awb_gain(s, AWBGAIN);
s->set_wb_mode(s, AWBMODE);
s->set_exposure_ctrl(s, EXPOS);
s->set_aec2(s, AEC2);
s->set_ae_level(s, AELEV);
s->set_aec_value(s, AECVAL);
s->set_gain_ctrl(s, GAINCT);
s->set_agc_gain(s, GAINAGC);
s->set_gainceiling(s, (gainceiling_t)GAINCELL);
s->set_bpc(s, BPC);
s->set_wpc(s, WPC);
s->set_raw_gma(s, RAWGMA);
s->set_lenc(s, LENC);
s->set_hmirror(s, MIRROR);
s->set_vflip(s, FLIP);
s->set_dcw(s, DCW);
s->set_colorbar(s, CBAR);
server.on("/", handle_root);
server.on("/mjpg", HTTP_GET, handle_jpg_stream);
server.on("/snapshot.jpg", HTTP_GET, handle_jpg);
Portal.onNotFound(handleNotFound);
acConfig.apid = "ESP-" + String((uint32_t)(ESP.getEfuseMac() >> 32), HEX);
acConfig.psk = "configesp";
acConfig.apip = IPAddress(192,168,4,1);
acConfig.hostName = acConfig.apid;
acConfig.autoReconnect = true;
Portal.config(acConfig);
Portal.begin();
Serial.println(" ");
Serial.println("Adresse IP: " + WiFi.localIP().toString() );
Serial.println(" ");
// POUR LED
serverasync.on("/relay/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(LED_BUILTIN, LOW);
Serial.println("LED TURNED OFF");
});
serverasync.on("/relay/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("LED TURNED ON");
});
serverasync.on("/relay/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Serial.println("LED TURNED TOGGLE");
});
serverasync.on("/relay", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(LED_BUILTIN)));
});
// POUR GPIO 12
serverasync.on("/gpio12/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(12, LOW);
Serial.println("gpio12 TURNED OFF");
});
serverasync.on("/gpio12/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, HIGH);
Serial.println("gpio12 TURNED ON");
});
serverasync.on("/gpio12/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, !digitalRead(12));
Serial.println("gpio12 TURNED TOGGLE");
});
serverasync.on("/gpio12", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(12)));
});
serverasync.begin();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
rtspServer.begin();
streamer = new OV2640Streamer(cam); // our streamer for UDP/TCP based RTP transport
}
#endif
}
void loop()
{
//server.handleClient();
Portal.handleClient();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
uint32_t msecPerFrame = 100;
static uint32_t lastimage = millis();
// If we have an active client connection, just service that until gone
streamer->handleRequests(0); // we don't use a timeout here,
// instead we send only if we have new enough frames
uint32_t now = millis();
if (streamer->anySessions()) {
if (now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
streamer->streamImage(now);
lastimage = now;
// check if we are overrunning our max frame rate
now = millis();
if (now > lastimage + msecPerFrame) {
printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
}
}
}
WiFiClient rtspClient = rtspServer.accept();
if (rtspClient) {
Serial.print("client: ");
Serial.print(rtspClient.remoteIP());
Serial.println();
streamer->addSession(rtspClient);
}
}
#endif
}
A vos marques pret … téléverser
Je n’ai volontairement pas ajouter trop de fonctions dans le menu
mais vous avez en plus comme pour la LED :
http://ip-esp:ASYNCPORT/gpio12 Etat du gpio12 (format binaire)
http://ip-esp:ASYNCPORT/gpio12/toggle Allume/Eteint gpio12
Mon idée c’est que actuellement, il y a:
Si on ne laisse que le serveur async, cela permettrait d’effectuer les deux connexions en même temps non? Dans ce cas, il pourrait gérer les images et la led.
Si tu fait un flux mpeg ca va pas le faire …
Bon voila la version 1.7 un peut de présentation sur la page … tableau et css …
//---------------------------------------------------------------------------------------------------------------------
// DOCS UTILES:
// ------------
// SERVEUR WEB CAM: https://community.jeedom.com/t/tuto-camera-a-focale-fixe-basee-sur-esp32/17587/49
// LED WIFI: https://techtutorialsx.com/2018/02/03/esp32-arduino-async-server-controlling-http-methods-allowed/
// Installing Asyncwebserver: https://techtutorialsx.com/2017/12/01/esp32-arduino-asynchronous-http-webserver/
// IMAGE PARAMS: https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/
// @drs
// modified @olive v1.7 jeudi 21 mai 2020 17h30
//
// PARAMETRES A MODIFIER:
// ----------------------
// RESOLUTION: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA / QUALITY (10-63)
// WSPORT: port web (pour affichage images)
// ASYNCPORT: port AsyncWebServer (pour gestion LED)
// Paramètres image
//
// USAGE:
// ------
// http://ip-esp:WSPORT/ page d'accueil
// http://ip-esp:WSPORT/_ac page de config
// http://ip-esp:WSPORT/mjpg: stream
// http://ip-esp:WSPORT/snapshot.jpg image
//
// GESTION DE LA LED:
// ------------------
// http://ip-esp:ASYNCPORT/relay Etat de la led (format binaire)
// http://ip-esp:ASYNCPORT/relay/on Allume la LED
// http://ip-esp:ASYNCPORT/relay/off Eteint la LED
// http://ip-esp:ASYNCPORT/relay/toggle Allume/Eteint la LED
//
// GESTION DU GPIO12:
// ------------------
// http://ip-esp:ASYNCPORT/gpio12 Etat du gpio2 (format binaire)
// http://ip-esp:ASYNCPORT/gpio12/on Allume gpio12
// http://ip-esp:ASYNCPORT/gpio12/off Eteint gpio12
// http://ip-esp:ASYNCPORT/gpio12/toggle Allume/Eteint gpio12
//
// INTEGRATION JEEDOM:
// -------------------
// Plugin Camera:
// Laisser le type de camera sur "Aucun"
// Renseigner l'IP et le port (webserver)
// URL de snapshot: /snapshot.jpg
// URL de flux: /mjpg
//
// Script gestion led:
// Action/Default
// URL: voir ci-dessus
// Cocher "Pas d'erreurs"
// La réponse doit contenir: ok (en minuscule)
// Timeout: si besoin (pas nécessaire)
//
//---------------------------------------------------------------------------------------------------------------------
#include <WiFi.h>
#include <WebServer.h>
#include <ESPAsyncWebServer.h> //permet la connexion simultanee pour la gestion de la LED
#include <WiFiClient.h>
#include <AutoConnect.h> // Needs AutoConnect, PageBuilder libraries!
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_camera.h" // Pas sur de l'utilité. A vérifier
#define ENABLE_RTSPSERVER
#define ENABLE_WEBSERVER
#define RESOLUTION FRAMESIZE_XGA // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
#define QUALITY 10 // JPEG quality 10-63 (lower means better quality)
// PARAMETRES IMAGE
#define BRIGHT 1 // Brightness: -2 to 2
#define CONTRAST 0 // Contrast: -2 to 2
#define SATUR 0 // Color Saturation: -2 to 2
#define SPECIAL 0 // Special effects: 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
#define WHITEBAL 1 // White Balance: 0 = disable , 1 = enable
#define AWBGAIN 1 // White Balance Gain: 0 = disable , 1 = enable
#define AWBMODE 3 // White Balance Mode: 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
#define EXPOS 1 // Exposure Control: 0 = disable , 1 = enable
#define AEC2 0 // 0 = disable , 1 = enable
#define AELEV 0 // -2 to 2
#define AECVAL 300 // 0 to 1200
#define GAINCT 1 // 0 = disable , 1 = enable
#define GAINAGC 0 // 0 = disable , 1 = enable
#define GAINCELL 0 // 0 = disable , 1 = enable
#define BPC 0 // 0 = disable , 1 = enable
#define WPC 1 // 0 = disable , 1 = enable
#define RAWGMA 1 // 0 = disable , 1 = enable
#define LENC 1 // Lens Correction: 0 = disable , 1 = enable
#define MIRROR 0 // Horizontal Mirror: 0 = disable , 1 = enable
#define FLIP 0 // Vertical Flip: 0 = disable , 1 = enable
#define DCW 1 // 0 = disable , 1 = enable
#define CBAR 0 // Set a colorBar: 0 = disable , 1 = enable
#define LED_BUILTIN 4 // VA SERVIR POUR ALLUMER et ETEINDRE LA LED - NE PAS MODIFIER CETTE VALEUR (GPIO4)
#include "OV2640.h"
#ifdef ENABLE_RTSPSERVER
#include "OV2640Streamer.h"
#include "CRtspSession.h"
#endif
OV2640 cam;
boolean useRTSP = true;
#define WSPORT 80 // modifier le port pour Webserver Image
#define ASYNCPORT 81 // modifier le port pour Webserver LED
WebServer server(WSPORT);
AsyncWebServer serverasync(ASYNCPORT);
AutoConnect Portal(server);
AutoConnectConfig acConfig;
#ifdef ENABLE_RTSPSERVER
WiFiServer rtspServer(554);
CStreamer *streamer;
#endif
void handle_jpg_stream(void)
{
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)
{
cam.run();
if (!client.connected())
break;
response = "--frame\r\n";
response += "Content-Type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
server.sendContent("\r\n");
if (!client.connected())
break;
}
}
void handle_jpg(void)
{
WiFiClient client = server.client();
cam.run();
if (!client.connected())
{
return;
}
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-disposition: inline; filename=snapshot.jpg\r\n";
response += "Content-type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
}
void handle_root(void)
{
String reply ="<style>th, td {border: 1px solid black;}table {border-collapse: collapse;}</style>";
reply +=F("<!doctype html><html><table><tr><td colspan='2'><H1>ESP32CAM</H1></td></tr>");
reply += F("<tr><td>Resolution</td>");
switch(RESOLUTION) {
case FRAMESIZE_QVGA:
reply += F("<td>QVGA (320x240)</td>");
break;
case FRAMESIZE_CIF:
reply += F("<td>CIF (400x296)</td>");
break;
case FRAMESIZE_VGA:
reply += F("<td>VGA (640x480)</td>");
break;
case FRAMESIZE_SVGA:
reply += F("<td>SVGA (800x600)</td>");
break;
case FRAMESIZE_XGA:
reply += F("<td>XGA (1024x768)</td>");
break;
case FRAMESIZE_SXGA:
reply += F("<td>SXGA (1280x1024)</td>");
break;
case FRAMESIZE_UXGA:
reply += F("<td>UXGA (1600x1200)</td>");
break;
default:
reply += F("<td>Unknown</td>");
break;
}
reply += F("</tr><tr><td>PSRAM found</td>");
if (psramFound()){
reply += F("<td>TRUE</td></tr>");
} else {
reply += F("<td>FALSE</td></tr></tr>");
}
String IP = WiFi.localIP().toString();
String IPH = "http://" + IP + ":" + WSPORT;
String IPA = "http://" + IP + ":" + ASYNCPORT;
String IPR = "rstp://" + IP + ":554";
String url = IPH + "/snapshot.jpg";
reply += "<tr><td>Snapshot URL</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPH + "/mjpg";
reply += "<tr><td>HTTP MJPEG URL</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPR + "/mjpeg/1";
reply += "<tr><td>RTSP MJPEG URL</td><td>" + url;
url = IPH + "/_ac";
reply += "<tr><td>WiFi settings page</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
//LED
url = IPA + "/relay/on";
reply += "<tr><td>Led_on</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/relay/off";
reply += "<tr><td>Led_off</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/relay/toggle";
reply += "<tr><td>Led_toggle</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/relay";
reply += "<tr><td>Led_etat</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
//GPIO12
url = IPA + "/gpio12/on";
reply += "<tr><td>gpio12_on</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12/off";
reply += "<tr><td>gpio12_off</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12/toggle";
reply += "<tr><td>gpio12_toggle</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12";
reply += "<tr><td>gpio12_etat</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
reply += F("</table></body></html>");
server.send(200, "text/html", reply);
}
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(){
pinMode(LED_BUILTIN, OUTPUT); // pour LED
digitalWrite(LED_BUILTIN, LOW); // pour LED
pinMode(12, OUTPUT); // pour RELAIS SUR GPIO12
digitalWrite(12, LOW); // pour RELAIS SUR GPIO12
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
// while (!Serial){;} // debug only
camera_config_t cconfig;
cconfig = esp32cam_aithinker_config;
if (psramFound()) {
cconfig.frame_size = RESOLUTION; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
cconfig.jpeg_quality = QUALITY;
cconfig.fb_count = 2;
} else {
if (RESOLUTION>FRAMESIZE_SVGA) {
cconfig.frame_size = FRAMESIZE_SVGA;
}
cconfig.jpeg_quality = 12;
cconfig.fb_count = 1;
}
cam.init(cconfig);
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, BRIGHT);
s->set_contrast(s, CONTRAST);
s->set_saturation(s, SATUR);
s->set_special_effect(s, SPECIAL);
s->set_whitebal(s, WHITEBAL);
s->set_awb_gain(s, AWBGAIN);
s->set_wb_mode(s, AWBMODE);
s->set_exposure_ctrl(s, EXPOS);
s->set_aec2(s, AEC2);
s->set_ae_level(s, AELEV);
s->set_aec_value(s, AECVAL);
s->set_gain_ctrl(s, GAINCT);
s->set_agc_gain(s, GAINAGC);
s->set_gainceiling(s, (gainceiling_t)GAINCELL);
s->set_bpc(s, BPC);
s->set_wpc(s, WPC);
s->set_raw_gma(s, RAWGMA);
s->set_lenc(s, LENC);
s->set_hmirror(s, MIRROR);
s->set_vflip(s, FLIP);
s->set_dcw(s, DCW);
s->set_colorbar(s, CBAR);
server.on("/", handle_root);
server.on("/mjpg", HTTP_GET, handle_jpg_stream);
server.on("/snapshot.jpg", HTTP_GET, handle_jpg);
Portal.onNotFound(handleNotFound);
acConfig.apid = "ESP-" + String((uint32_t)(ESP.getEfuseMac() >> 32), HEX);
acConfig.psk = "configesp";
acConfig.apip = IPAddress(192,168,4,1);
acConfig.hostName = acConfig.apid;
acConfig.autoReconnect = true;
Portal.config(acConfig);
Portal.begin();
Serial.println(" ");
Serial.println("Adresse IP: " + WiFi.localIP().toString() );
Serial.println(" ");
// POUR LED
serverasync.on("/relay/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(LED_BUILTIN, LOW);
Serial.println("LED TURNED OFF");
});
serverasync.on("/relay/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("LED TURNED ON");
});
serverasync.on("/relay/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Serial.println("LED TURNED TOGGLE");
});
serverasync.on("/relay", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(LED_BUILTIN)));
});
// POUR GPIO 12
serverasync.on("/gpio12/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(12, LOW);
Serial.println("gpio12 TURNED OFF");
});
serverasync.on("/gpio12/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, HIGH);
Serial.println("gpio12 TURNED ON");
});
serverasync.on("/gpio12/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, !digitalRead(12));
Serial.println("gpio12 TURNED TOGGLE");
});
serverasync.on("/gpio12", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(12)));
});
serverasync.begin();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
rtspServer.begin();
streamer = new OV2640Streamer(cam); // our streamer for UDP/TCP based RTP transport
}
#endif
}
void loop()
{
//server.handleClient();
Portal.handleClient();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
uint32_t msecPerFrame = 100;
static uint32_t lastimage = millis();
// If we have an active client connection, just service that until gone
streamer->handleRequests(0); // we don't use a timeout here,
// instead we send only if we have new enough frames
uint32_t now = millis();
if (streamer->anySessions()) {
if (now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
streamer->streamImage(now);
lastimage = now;
// check if we are overrunning our max frame rate
now = millis();
if (now > lastimage + msecPerFrame) {
printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
}
}
}
WiFiClient rtspClient = rtspServer.accept();
if (rtspClient) {
Serial.print("client: ");
Serial.print(rtspClient.remoteIP());
Serial.println();
streamer->addSession(rtspClient);
}
}
#endif
}
Hello,
J’ai à peine eu le temps de tester la v1.6 qu’il y a déjà une 1.7… bon, je reflashe !
mdr
bon si vous voulez d’autre choses …
capteurs de température de lumière de pression humidité …
tout est presque possible tant qu’il reste de la place !
Heuuuu, tant que tu es bien parti… tu arriverais à intégrer les réglages d’image directement dans le serveur comme dans l’exemple présent sur Arduino (juste les paramètres basiques, pas la reconnaissance faciale, bien sûr) ?
ben donne moi les sources de tes exemples arduino que je perde pas trop de temps.
Ha oui j’avais pas vue c’est bien ça …
Et pourquoi pas la reconnaissance facial justement
je verrais bien un truc du genre un info-virtuel qui donne le N° ou le nom du sujet reconnu …
Mais… fais-toi plaisir !!!
Bon en tout cas la dernière version fonctionne nickel.
Je mettrai à jour le tuto avec les deux bibliothèques à ajouter.
Cà pourrait prendre un peut de temps faut que j’analyse l’exemple…
Pour les futures versions je suggère de renommer « relay » en « led ». Pour éviter les confusions.
Voilà relay remplacé par led
//---------------------------------------------------------------------------------------------------------------------
// DOCS UTILES:
// ------------
// SERVEUR WEB CAM: https://community.jeedom.com/t/tuto-camera-a-focale-fixe-basee-sur-esp32/17587/49
// LED WIFI: https://techtutorialsx.com/2018/02/03/esp32-arduino-async-server-controlling-http-methods-allowed/
// Installing Asyncwebserver: https://techtutorialsx.com/2017/12/01/esp32-arduino-asynchronous-http-webserver/
// IMAGE PARAMS: https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/
// @drs
// modified @olive v1.71 jeudi 21 mai 2020 21h27
//
// PARAMETRES A MODIFIER:
// ----------------------
// RESOLUTION: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA / QUALITY (10-63)
// WSPORT: port web (pour affichage images)
// ASYNCPORT: port AsyncWebServer (pour gestion LED)
// Paramètres image
//
// USAGE:
// ------
// http://ip-esp:WSPORT/ page d'accueil
// http://ip-esp:WSPORT/_ac page de config
// http://ip-esp:WSPORT/mjpg: stream
// http://ip-esp:WSPORT/snapshot.jpg image
//
// GESTION DE LA LED:
// ------------------
// http://ip-esp:ASYNCPORT/led Etat de la led (format binaire)
// http://ip-esp:ASYNCPORT/led/on Allume la LED
// http://ip-esp:ASYNCPORT/led/off Eteint la LED
// http://ip-esp:ASYNCPORT/led/toggle Allume/Eteint la LED
//
// GESTION DU GPIO12:
// ------------------
// http://ip-esp:ASYNCPORT/gpio12 Etat du gpio2 (format binaire)
// http://ip-esp:ASYNCPORT/gpio12/on Allume gpio12
// http://ip-esp:ASYNCPORT/gpio12/off Eteint gpio12
// http://ip-esp:ASYNCPORT/gpio12/toggle Allume/Eteint gpio12
//
// INTEGRATION JEEDOM:
// -------------------
// Plugin Camera:
// Laisser le type de camera sur "Aucun"
// Renseigner l'IP et le port (webserver)
// URL de snapshot: /snapshot.jpg
// URL de flux: /mjpg
//
// Script gestion led:
// Action/Default
// URL: voir ci-dessus
// Cocher "Pas d'erreurs"
// La réponse doit contenir: ok (en minuscule)
// Timeout: si besoin (pas nécessaire)
//
//---------------------------------------------------------------------------------------------------------------------
#include <WiFi.h>
#include <WebServer.h>
#include <ESPAsyncWebServer.h> //permet la connexion simultanee pour la gestion de la LED
#include <WiFiClient.h>
#include <AutoConnect.h> // Needs AutoConnect, PageBuilder libraries!
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_camera.h" // Pas sur de l'utilité. A vérifier
#define ENABLE_RTSPSERVER
#define ENABLE_WEBSERVER
#define RESOLUTION FRAMESIZE_XGA // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
#define QUALITY 10 // JPEG quality 10-63 (lower means better quality)
// PARAMETRES IMAGE
#define BRIGHT 1 // Brightness: -2 to 2
#define CONTRAST 0 // Contrast: -2 to 2
#define SATUR 0 // Color Saturation: -2 to 2
#define SPECIAL 0 // Special effects: 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
#define WHITEBAL 1 // White Balance: 0 = disable , 1 = enable
#define AWBGAIN 1 // White Balance Gain: 0 = disable , 1 = enable
#define AWBMODE 3 // White Balance Mode: 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
#define EXPOS 1 // Exposure Control: 0 = disable , 1 = enable
#define AEC2 0 // 0 = disable , 1 = enable
#define AELEV 0 // -2 to 2
#define AECVAL 300 // 0 to 1200
#define GAINCT 1 // 0 = disable , 1 = enable
#define GAINAGC 0 // 0 = disable , 1 = enable
#define GAINCELL 0 // 0 = disable , 1 = enable
#define BPC 0 // 0 = disable , 1 = enable
#define WPC 1 // 0 = disable , 1 = enable
#define RAWGMA 1 // 0 = disable , 1 = enable
#define LENC 1 // Lens Correction: 0 = disable , 1 = enable
#define MIRROR 0 // Horizontal Mirror: 0 = disable , 1 = enable
#define FLIP 0 // Vertical Flip: 0 = disable , 1 = enable
#define DCW 1 // 0 = disable , 1 = enable
#define CBAR 0 // Set a colorBar: 0 = disable , 1 = enable
#define LED_BUILTIN 4 // VA SERVIR POUR ALLUMER et ETEINDRE LA LED - NE PAS MODIFIER CETTE VALEUR (GPIO4)
#include "OV2640.h"
#ifdef ENABLE_RTSPSERVER
#include "OV2640Streamer.h"
#include "CRtspSession.h"
#endif
OV2640 cam;
boolean useRTSP = true;
#define WSPORT 80 // modifier le port pour Webserver Image
#define ASYNCPORT 81 // modifier le port pour Webserver LED
WebServer server(WSPORT);
AsyncWebServer serverasync(ASYNCPORT);
AutoConnect Portal(server);
AutoConnectConfig acConfig;
#ifdef ENABLE_RTSPSERVER
WiFiServer rtspServer(554);
CStreamer *streamer;
#endif
void handle_jpg_stream(void)
{
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)
{
cam.run();
if (!client.connected())
break;
response = "--frame\r\n";
response += "Content-Type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
server.sendContent("\r\n");
if (!client.connected())
break;
}
}
void handle_jpg(void)
{
WiFiClient client = server.client();
cam.run();
if (!client.connected())
{
return;
}
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-disposition: inline; filename=snapshot.jpg\r\n";
response += "Content-type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write((char *)cam.getfb(), cam.getSize());
}
void handle_root(void)
{
String reply ="<style>th, td {border: 1px solid black;}table {border-collapse: collapse;}</style>";
reply +=F("<!doctype html><html><table><tr><td colspan='2'><H1>ESP32CAM</H1></td></tr>");
reply += F("<tr><td>Resolution</td>");
switch(RESOLUTION) {
case FRAMESIZE_QVGA:
reply += F("<td>QVGA (320x240)</td>");
break;
case FRAMESIZE_CIF:
reply += F("<td>CIF (400x296)</td>");
break;
case FRAMESIZE_VGA:
reply += F("<td>VGA (640x480)</td>");
break;
case FRAMESIZE_SVGA:
reply += F("<td>SVGA (800x600)</td>");
break;
case FRAMESIZE_XGA:
reply += F("<td>XGA (1024x768)</td>");
break;
case FRAMESIZE_SXGA:
reply += F("<td>SXGA (1280x1024)</td>");
break;
case FRAMESIZE_UXGA:
reply += F("<td>UXGA (1600x1200)</td>");
break;
default:
reply += F("<td>Unknown</td>");
break;
}
reply += F("</tr><tr><td>PSRAM found</td>");
if (psramFound()){
reply += F("<td>TRUE</td></tr>");
} else {
reply += F("<td>FALSE</td></tr></tr>");
}
String IP = WiFi.localIP().toString();
String IPH = "http://" + IP + ":" + WSPORT;
String IPA = "http://" + IP + ":" + ASYNCPORT;
String IPR = "rstp://" + IP + ":554";
String url = IPH + "/snapshot.jpg";
reply += "<tr><td>Snapshot URL</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPH + "/mjpg";
reply += "<tr><td>HTTP MJPEG URL</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPR + "/mjpeg/1";
reply += "<tr><td>RTSP MJPEG URL</td><td>" + url;
url = IPH + "/_ac";
reply += "<tr><td>WiFi settings page</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
//LED
url = IPA + "/led/on";
reply += "<tr><td>Led_on</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/led/off";
reply += "<tr><td>Led_off</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/led/toggle";
reply += "<tr><td>Led_toggle</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/led";
reply += "<tr><td>Led_etat</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
//GPIO12
url = IPA + "/gpio12/on";
reply += "<tr><td>gpio12_on</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12/off";
reply += "<tr><td>gpio12_off</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12/toggle";
reply += "<tr><td>gpio12_toggle</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
url = IPA + "/gpio12";
reply += "<tr><td>gpio12_etat</td><td><a href='" + url + "'>" + url + "</a></td></tr>";
reply += F("</table></body></html>");
server.send(200, "text/html", reply);
}
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(){
pinMode(LED_BUILTIN, OUTPUT); // pour LED
digitalWrite(LED_BUILTIN, LOW); // pour LED
pinMode(12, OUTPUT); // pour RELAIS SUR GPIO12
digitalWrite(12, LOW); // pour RELAIS SUR GPIO12
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
// while (!Serial){;} // debug only
camera_config_t cconfig;
cconfig = esp32cam_aithinker_config;
if (psramFound()) {
cconfig.frame_size = RESOLUTION; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
cconfig.jpeg_quality = QUALITY;
cconfig.fb_count = 2;
} else {
if (RESOLUTION>FRAMESIZE_SVGA) {
cconfig.frame_size = FRAMESIZE_SVGA;
}
cconfig.jpeg_quality = 12;
cconfig.fb_count = 1;
}
cam.init(cconfig);
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, BRIGHT);
s->set_contrast(s, CONTRAST);
s->set_saturation(s, SATUR);
s->set_special_effect(s, SPECIAL);
s->set_whitebal(s, WHITEBAL);
s->set_awb_gain(s, AWBGAIN);
s->set_wb_mode(s, AWBMODE);
s->set_exposure_ctrl(s, EXPOS);
s->set_aec2(s, AEC2);
s->set_ae_level(s, AELEV);
s->set_aec_value(s, AECVAL);
s->set_gain_ctrl(s, GAINCT);
s->set_agc_gain(s, GAINAGC);
s->set_gainceiling(s, (gainceiling_t)GAINCELL);
s->set_bpc(s, BPC);
s->set_wpc(s, WPC);
s->set_raw_gma(s, RAWGMA);
s->set_lenc(s, LENC);
s->set_hmirror(s, MIRROR);
s->set_vflip(s, FLIP);
s->set_dcw(s, DCW);
s->set_colorbar(s, CBAR);
server.on("/", handle_root);
server.on("/mjpg", HTTP_GET, handle_jpg_stream);
server.on("/snapshot.jpg", HTTP_GET, handle_jpg);
Portal.onNotFound(handleNotFound);
acConfig.apid = "ESP-" + String((uint32_t)(ESP.getEfuseMac() >> 32), HEX);
acConfig.psk = "configesp";
acConfig.apip = IPAddress(192,168,4,1);
acConfig.hostName = acConfig.apid;
acConfig.autoReconnect = true;
Portal.config(acConfig);
Portal.begin();
Serial.println(" ");
Serial.println("Adresse IP: " + WiFi.localIP().toString() );
Serial.println(" ");
// POUR LED
serverasync.on("/led/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(LED_BUILTIN, LOW);
Serial.println("LED TURNED OFF");
});
serverasync.on("/led/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("LED TURNED ON");
});
serverasync.on("/led/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Serial.println("LED TURNED TOGGLE");
});
serverasync.on("/led", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(LED_BUILTIN)));
});
// POUR GPIO 12
serverasync.on("/gpio12/off", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "ok");
digitalWrite(12, LOW);
Serial.println("gpio12 TURNED OFF");
});
serverasync.on("/gpio12/on", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, HIGH);
Serial.println("gpio12 TURNED ON");
});
serverasync.on("/gpio12/toggle", HTTP_ANY, [](AsyncWebServerRequest *request){
request->send(200, "text/plain","ok");
digitalWrite(12, !digitalRead(12));
Serial.println("gpio12 TURNED TOGGLE");
});
serverasync.on("/gpio12", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(digitalRead(12)));
});
serverasync.begin();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
rtspServer.begin();
streamer = new OV2640Streamer(cam); // our streamer for UDP/TCP based RTP transport
}
#endif
}
void loop()
{
//server.handleClient();
Portal.handleClient();
#ifdef ENABLE_RTSPSERVER
if (useRTSP) {
uint32_t msecPerFrame = 100;
static uint32_t lastimage = millis();
// If we have an active client connection, just service that until gone
streamer->handleRequests(0); // we don't use a timeout here,
// instead we send only if we have new enough frames
uint32_t now = millis();
if (streamer->anySessions()) {
if (now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
streamer->streamImage(now);
lastimage = now;
// check if we are overrunning our max frame rate
now = millis();
if (now > lastimage + msecPerFrame) {
printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
}
}
}
WiFiClient rtspClient = rtspServer.accept();
if (rtspClient) {
Serial.print("client: ");
Serial.print(rtspClient.remoteIP());
Serial.println();
streamer->addSession(rtspClient);
}
}
#endif
}
Bonjour,
Finalement j’ai pris le temps de remplacer mon .ino d’origine avec votre code.
Je suis sous Linux et arduino ide 1.8.9.
J’ai un pb avec l’include ESPAsyncWebServer.h :
error: ESPAsyncWebServer.h: No such file or directory
J’ai cherché dans le Gestionnaire de bibli et il m’a proposé ça :
que j’ai installé en étant bien sur la carte ESP32 Wrover.
Mais toujours pb de compilation et lorsque je cherche le fichier ESPAsyncWebServer.h via explorateur, il ne le trouve nul part.
Quelqu’un aurait une idée ?
Pourquoi? Le webserver async ne peut pas gérer?
A moins que je n’ai rien compris…