Meine Erfahrungen mit der Programmierung von Arduinos ist eher beschränkt obwohl ich inzwischen schon einige Boards hier habe.
Jetzt suche ich ein Prog. um ein ESP32-CAM als Accesspoint zu betreiben. Also kein Server der zusätzlich noch mit dem WLAN-Netz im Haus verbunden werden muss sondern einfach nur den Videostream der Kamera per WLAN ans Handy oder Notebook übertragen.
Mehrere Stunden habe ich inzwischen im Netz nach funktionierenden Progs verbracht und auch einiges gefunden aber keins das funktionierte. Die Verbindung mit dem AP kann zwar immer hergestellt werden aber wenn ich dann im Browser die IP angebe dann wird die Seite nicht gefunden.
Grundsätzlich ist die Hardware ok weil ein Beispielprogramm, bei dem es über das WLAN-Netz läuft funktioniert.
Kann mir jemand einen Tipp geben wo es ein funktionierendes Prog. dafür gibt?
Im Idealfall möchte ich die IP des AP im Programm vorgeben können.
Hallo Wolfgang,
mit ESP32-CAM kenne ich mich leider nicht aus. Mit einem "normalen" ESP32 konnte ich Esp32 Access Point Tab erfolgreich einsetzen. Das Beispiel "Esp32 BME280 Tab" hat sofort funktioniert.
Da der Autor dieser Seiten auch hier im Forum aktiv ist, könntest Du sogar Fragen loswerden.
mit ESP32-CAM kenne ich mich nicht aus. Mit dem Esp32 Access Point Tab funktioniert aber alles wie gewohnt.
Spätestens Morgen Früh dürfte Forumsteilnehmer "amithlon" wieder hier rein geschaut haben.
Dieser kennt sich sehr gut mit dem Esp32-Cam aus. Solange wirst du dich mit speziellen Fragen gedulden müssen.
Möglicherweise unterläuft Dir ein grundlegender Fehler. So muß ich nach Reset meinen ESP32 als Access Point am Läppi (Win10) immer neu anmelden. Wenn man das nicht macht, geht nix. Oder Du verwendest die falsche IP, den falschen Port oder irgendeine Firewall schlägt zu.
heinz24:
Inzwischen hab ich bestimmt schon 5 bis 6 verschiedene Programme getestet aber keins funktioniert.
Is echt schade!
Jammern hilft nicht, so kann Dir niemand helfen.
Also die notwendigen Tabs von Fips auf den ESP32 laden und nachvollziehbar beschreiben, was geht und was nicht.
Gestern Abend um kurz vor 12 hab ich etwas herausgefunden und zwar dass ich mit meinem Notebook die Seite mit 192.168.4.1 starten konnte und im Handy, mit dem ich die ganze Zeit getestet hatte, wieder nicht.
Habe eben nochmal getestet ob es vielleicht daran lag, dass kein Passwort beim Anmelden gestzt war, aber daran lag / liegt es nicht. Mit dem Notebook gehts und mit meinem Handy nicht. Mit dem Handy meiner Frau kann ich immerhin die Seite aufrufen, die dann allerdings hängt.
Den aktuellen Test hab ich mit dem Programm vom Scout32 gemacht, dass ist ein kleines, ferngesteuertes Fahrzeug. Das kommt meinem Endziel so nahe wie kein anderes Prog. da ich neben dem Kamerabild auch noch die Möglichkeit haben möchte etwas fernzusteuern.
So sieht der Code aus:
/*
Pilot Hobbies Scout32 - For ESP32
*/
// Define Network SSID & Password
// Set ap to 1 to use Scout32 as Standalone Access Point with default IP 192.168.4.1
// Set ap to 0 to connect to a router using DHCP with hostname espressif
bool ap = 1;
const char* ssid = "Scout32"; //AP Name or Router SSID
const char* password = "12345678"; //Password. Leave blank for open network.
//AP Settings
int channel = 11; // Channel for AP Mode
int hidden = 0; // Probably leave at zero
int maxconnection = 1; // Only allow one at a time
// Libraries. If you get errors compiling, please downgrade ESP32 by Espressif.
// Use version 1.0.2 (Tools, Manage Libraries).
#include <WiFi.h>
#include "esp_wifi.h"
#include "esp_camera.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
// Camera Pin Definitions - Don't heckin' touch.
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
// Webserver / Controls Function
void startCameraServer();
//Define Servos
const int ServoPinL = 12; // Left Servo assigned to GPIO 12
const int ServoPinR = 13; // Right Servo assigned to GPIO 13
void initServo() // Here we setup PWM, and attach it to physical pins.
{
ledcSetup(3, 50, 16); // 50 hz PWM, 16-bit resolution. Servo uses 1ms - 2ms pulse width as a fraction of 20ms period.
ledcSetup(4, 50, 16); // 50 hz PWM, 16-bit resolution. Pulse width is represented as integer fraction of 65536 ie 2ms = 6553.
ledcAttachPin(ServoPinL, 3); // Attach PWM 3 to GPIO 12
ledcAttachPin(ServoPinR, 4); // Attach PWM 4 to GPIO 13
}
void setup()
{
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Prevent brownouts by silencing them. You probably want to keep this.
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
// Camera Configuration - Again, don't touch.
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_QVGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_QVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
// 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;
}
//drop down frame size for higher initial frame rate
sensor_t * s = esp_camera_sensor_get();
s->set_framesize(s, FRAMESIZE_QVGA);
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
// Initialize Servos & LEDs
initServo();
ledcSetup(7, 5000, 8);
ledcAttachPin(4, 7); //GPIO 4 is LED
if(!ap){
// Connect to Router
Serial.println("ssid: " + (String)ssid);
Serial.println("password: " + (String)password);
Serial.println("WiFi is Client Scout32");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
} else {
// Setup Access Point
Serial.println("ssid: " + (String)ssid);
Serial.println("password: " + (String)password);
Serial.println("WiFi is Standalone Scout32");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid,password,channel,hidden,maxconnection);
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.softAPIP());
Serial.println("' to connect");
}
//Flash LED as ready indicator
for (int i=0;i<5;i++)
{
ledcWrite(7,0); // flash led
delay(200);
ledcWrite(7,10);
delay(200);
}
//Start Webserver
startCameraServer();
}
void loop() {
// put your main code here, to run repeatedly:
delay(1000);
Serial.printf("RSSi: %ld dBm\n",WiFi.RSSI());
}
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.
Wie kann ich denn hier den bestehenden Beitrag ändern???
Irgendwie fehlt mir auch, wie ich den Forumseditor starten kann. Hier wird nur Quick Reply angezeigt.
Jetzt haben wirs!
Habs jetzt noch mal mit einem zweiten Programm getestet, da ist es das gleiche Verhalten.
Mit meinem Handy wird im Browser die Seite nicht aufgebaut, im mehreren PCs aber schon.
Irgendwie liegt es dann offenbar an Einstellungen im Handy aber an welchen?
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/
IMPORTANT!!!
- Select Board "AI Thinker ESP32-CAM"
- GPIO 0 must be connected to GND to upload a sketch
- After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_http_server.h"
// Replace with your network credentials
const char* ssid = "ESP32-Access-Point";
const char* password = "123456789";
#define PART_BOUNDARY "123456789000000000000987654321"
// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM
// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT
#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 21
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 19
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 5
#define Y2_GPIO_NUM 4
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM 15
#define XCLK_GPIO_NUM 27
#define SIOD_GPIO_NUM 25
#define SIOC_GPIO_NUM 23
#define Y9_GPIO_NUM 19
#define Y8_GPIO_NUM 36
#define Y7_GPIO_NUM 18
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 5
#define Y4_GPIO_NUM 34
#define Y3_GPIO_NUM 35
#define Y2_GPIO_NUM 32
#define VSYNC_GPIO_NUM 22
#define HREF_GPIO_NUM 26
#define PCLK_GPIO_NUM 21
#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM 15
#define XCLK_GPIO_NUM 27
#define SIOD_GPIO_NUM 25
#define SIOC_GPIO_NUM 23
#define Y9_GPIO_NUM 19
#define Y8_GPIO_NUM 36
#define Y7_GPIO_NUM 18
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 5
#define Y4_GPIO_NUM 34
#define Y3_GPIO_NUM 35
#define Y2_GPIO_NUM 17
#define VSYNC_GPIO_NUM 22
#define HREF_GPIO_NUM 26
#define PCLK_GPIO_NUM 21
#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#else
#error "Camera model not selected"
#endif
static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
httpd_handle_t stream_httpd = NULL;
static esp_err_t stream_handler(httpd_req_t *req){
camera_fb_t * fb = NULL;
esp_err_t res = ESP_OK;
size_t _jpg_buf_len = 0;
uint8_t * _jpg_buf = NULL;
char * part_buf[64];
res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
if(res != ESP_OK){
return res;
}
while(true){
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
res = ESP_FAIL;
} else {
if(fb->width > 400){
if(fb->format != PIXFORMAT_JPEG){
bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
esp_camera_fb_return(fb);
fb = NULL;
if(!jpeg_converted){
Serial.println("JPEG compression failed");
res = ESP_FAIL;
}
} else {
_jpg_buf_len = fb->len;
_jpg_buf = fb->buf;
}
}
}
if(res == ESP_OK){
size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
}
if(res == ESP_OK){
res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
}
if(res == ESP_OK){
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
}
if(fb){
esp_camera_fb_return(fb);
fb = NULL;
_jpg_buf = NULL;
} else if(_jpg_buf){
free(_jpg_buf);
_jpg_buf = NULL;
}
if(res != ESP_OK){
break;
}
//Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
}
return res;
}
void startCameraServer(){
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.server_port = 80;
httpd_uri_t index_uri = {
.uri = "/",
.method = HTTP_GET,
.handler = stream_handler,
.user_ctx = NULL
};
//Serial.printf("Starting web server on port: '%d'\n", config.server_port);
if (httpd_start(&stream_httpd, &config) == ESP_OK) {
httpd_register_uri_handler(stream_httpd, &index_uri);
}
}
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
Serial.setDebugOutput(false);
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;
}
// 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;
}
// Connect to Wi-Fi network with SSID and password
Serial.print("Setting AP (Access Point)…");
// Remove the password parameter, if you want the AP (Access Point) to be open
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("Camera Stream Ready! Connect to the ESP32 AP and go to: http://");
Serial.println(IP);
// Start streaming web server
startCameraServer();
}
void loop() {
delay(1);
}
Bei Android 10 dürfte es wohl Abweichungen geben. Bei mir "Einstellungen/Verbindungen/WLAN/Aktuelles Netzwerk" finde ich den ESP32 als "Ohne Internet verbunden".
Habe ein ähnliches Beobachtungssystem auch mit einem Raspberry aufgebaut da läuft es bisher auf allen getesteten Geräten. Wenn ich jetzt die Infos die ich auf meinem Handy beim Rapbi und bei ESP32 bezüglich der Verbindung vergleiche kann ich keinen Unterschied sehen aber trotzdem wird beim ESP32 nichts angezeigt bzw. im Browser: "Fehler, Verbindung fehlgeschlagen"
Gibts vielleicht im Arduinoprog. Parameter die testweise mal geändert werden könnten?
Meinem Händy ist das egal! Hat sich nichts geändert.
Ich versuche jetzt nochmal eine Verbindung übers HausWLAN und dann mit dem Handy aufrufen....
So, jetzt mal anders herum!
Wenn ich aus den Beispielen -ESP32 - Webserver installiere dann kann ich mit dem Handy darauf zugreifen. Vielleicht kann man das Beispiel ja einfach auf Accesspoint umbauen / erweitern?
Im Beispiel für den Scout32 gibt es hier ja die Auswahl, vielleicht kannst du mir sagen wie man die in das Webserverprog. einbaut??
if(!ap){
// Connect to Router
Serial.println("ssid: " + (String)ssid);
Serial.println("password: " + (String)password);
Serial.println("WiFi is Client Scout32");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
} else {
// Setup Access Point
Serial.println("ssid: " + (String)ssid);
Serial.println("password: " + (String)password);
Serial.println("WiFi is Standalone Scout32");
WiFi.mode(WIFI_AP);
// WiFi.softAP(ssid,password,channel,hidden,maxconnection);
WiFi.softAP(ssid,password);
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.softAPIP());
Serial.println("' to connect");
}
Dieses Programm hat den Vorteil, dass man da sehr gut mit den Parametern der Kamera spielen kann! Wäre auch sehr interessant!
heinz24:
So, jetzt mal anders herum!
Wenn ich aus den Beispielen -ESP32 - Webserver installiere dann kann ich mit dem Handy darauf zugreifen. Vielleicht kann man das Beispiel ja einfach auf Accesspoint umbauen / erweitern?
Unter esp32\1.0.4\libraries\WebServer\examples\ finde ich neun Beispiele, welches meinst Du?
Vorab ich habe 1.0.2 ESP
Das hab ich geladen weil ich in einem Video gehört habe, dass es bei der 1.0.4 Probleme geben kann.
Beispiele - ESP32 - Camera - CameraWebServer
#include "esp_camera.h"
#include <WiFi.h>
//
// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
// or another board which has PSRAM enabled
//
// 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 = "********";
const char* password = "********";
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);
}