ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Появилась идея, от ESP32 Cam, получать фото либо видео в момент, когда срабатывает датчик движения (картинка 1) либо датчик открытия. Но, возникла проблема. Если использовать скетч (https://github.com/sui77/rc-switch/tree ... emo_Simple) не инициализируя камеру, то все прекрасно работает (картинка 2). А если камеру инициализировать, то контроллер уходит в постоянный ребут.
Решение проблемы было найдено в интернете https://github.com/espressif/esp-who/is ... -518142982 . T.e. attachInterrupt не дружит с камерой. Я пробовал лезть в библиотеку RCSwitch и править ее, но у меня не получилось.
В RCSwitch.cpp, методом тыка, правил 562, добавив 565-573 и 685 заменил 686 строкой. Так же в RCSwitch.h убрал/добавил 159/160 строки.
Прошу помочь. Спасибо.
Решение проблемы было найдено в интернете https://github.com/espressif/esp-who/is ... -518142982 . T.e. attachInterrupt не дружит с камерой. Я пробовал лезть в библиотеку RCSwitch и править ее, но у меня не получилось.
В RCSwitch.cpp, методом тыка, правил 562, добавив 565-573 и 685 заменил 686 строкой. Так же в RCSwitch.h убрал/добавил 159/160 строки.
Прошу помочь. Спасибо.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Тему глянул. В проектах отсутствуют прерывания. В случае с RCSwitch, сигнал приходит на ножку МК, что вызывает прерывания, а attachInterrupt в ESP32 Cam, наверное конфликтует с другими, используемыми алгоритмом камеры, прерываниями.
Отправлено спустя 15 минут 21 секунду:
Сижу играюсь с настройками. Подозревал, что не выдает камера UXGA (1600x1200) по качеству. И на самом деле, фото получаются 1280х960. А если заменить на FRAMESIZE_SXGA (1280x1024), то фото 1280x1024, т.е. даже лучше. Не пойму. PSRAM Enabled.
Отправлено спустя 15 минут 21 секунду:
Сижу играюсь с настройками. Подозревал, что не выдает камера UXGA (1600x1200) по качеству. И на самом деле, фото получаются 1280х960. А если заменить на FRAMESIZE_SXGA (1280x1024), то фото 1280x1024, т.е. даже лучше. Не пойму. PSRAM Enabled.
-
- Полковник
- Сообщения: 3360
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 14 раз
- Поблагодарили: 100 раз
- Контактная информация:
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Выложите хотя бы скетч свой, который грузите, если нет проекта в флпроге.
Зачем именно рссвитч?
Зачем именно рссвитч?
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
На основании вашего проекта, сымитировал обозначенную выше проблему. После компиляции скетча, камера уходит в panic rebut. Если же закомментировать 67 и 226-229 строчки в скетче (прерывания и обработчик), то камера работает.
Зачем рссвитч. Ставлю несколько камер на участке, где то внутри... Каждый датчик-сенсор имеет свой посылаемый код... На всякий случай, шлет несколько раз.
Камера получает двоичный сигнал, дешифрует, а дальше
if (Sensor == 15556553 || Sensor == xxxxxxxx || Sensor == xxxxxxxx ...) {
SendPhoto....;
}
Другая камера отсылает фото с задержкой (майл, телеграмм, чтобы не гневить), ну и так далее... Таким образом я избавлюсь от оплаты за симку в китайской сигнализации, которая при срабатывании сенсоров, звонит мне на телефон, а вместо звонка, я сразу буду видеть, что творится. Китайская сигнализация "Ввести войска для обороны", так она говорит
Отправлено спустя 2 часа 14 минут 16 секунд:
... 33 PIN на ESP32 Cam, он OUTPUT, это LED маленький красненький. В своих проектах я его выпаивал под другие дела, чтобы освободить ПИН под INPUT.
Зачем рссвитч. Ставлю несколько камер на участке, где то внутри... Каждый датчик-сенсор имеет свой посылаемый код... На всякий случай, шлет несколько раз.
Камера получает двоичный сигнал, дешифрует, а дальше
if (Sensor == 15556553 || Sensor == xxxxxxxx || Sensor == xxxxxxxx ...) {
SendPhoto....;
}
Другая камера отсылает фото с задержкой (майл, телеграмм, чтобы не гневить), ну и так далее... Таким образом я избавлюсь от оплаты за симку в китайской сигнализации, которая при срабатывании сенсоров, звонит мне на телефон, а вместо звонка, я сразу буду видеть, что творится. Китайская сигнализация "Ввести войска для обороны", так она говорит

Отправлено спустя 2 часа 14 минут 16 секунд:
... 33 PIN на ESP32 Cam, он OUTPUT, это LED маленький красненький. В своих проектах я его выпаивал под другие дела, чтобы освободить ПИН под INPUT.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Полковник
- Сообщения: 3360
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 14 раз
- Поблагодарили: 100 раз
- Контактная информация:
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch

ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Вот честно....то же самое что и с ЕСП8266 -- модуль кое как справляется с видео и ВиФи ....а вы навешиваете на него еще что то.....
У меня два ESP32CAM и то постоянно висли от компутерного блока питания......
Мораль такова - поиграться пойдет...а для надежного видео наблюденения не думаете что лучше использовать специальные контроллеры .....а не платку за 300р?
У меня два ESP32CAM и то постоянно висли от компутерного блока питания......
Мораль такова - поиграться пойдет...а для надежного видео наблюденения не думаете что лучше использовать специальные контроллеры .....а не платку за 300р?
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Потому я разбиваю работу видео и ВиФи по разным ядрам и, все ОК.Anydy писал(а): 11 ноя 2021, 20:13 У меня два ESP32CAM и то постоянно висли от компутерного блока питания......

ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
[ref]AndrejK[/ref], Так давайте скетчи.....именно работа по RTSP никак иначе.....библиотеку я грузил....глюк был сплошной...а отправка фоток --что то мне думается это побаловаться.....
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Я совсем не программист!
... тут как обычно
заканчиваем этим...
TaskHandle_t Task1;
TaskHandle_t Task2;
...
void setup() {...
... стандартно
добавляем...
//создаем задачу, которая будет выполняться на ядре 0 с максимальным приоритетом (1)
xTaskCreatePinnedToCore(
Task1code, /* Функция задачи. */
"Task1", /* Ее имя. */
10000, /* Размер стека функции */
NULL, /* Параметры */
1, /* Приоритет */
&Task1, /* Дескриптор задачи для отслеживания */
0); /* Указываем пин для данного ядра */
delay(500);
//Создаем задачу, которая будет выполняться на ядре 1 с наивысшим приоритетом (1)
xTaskCreatePinnedToCore(
Task2code, /* Функция задачи. */
"Task2", /* Имя задачи. */
10000, /* Размер стека */
NULL, /* Параметры задачи */
1, /* Приоритет */
&Task2, /* Дескриптор задачи для отслеживания */
1); /* Указываем пин для этой задачи */
delay(500);
} // закрыли void setup()
void Task1code( void * pvParameters ) {
for (;;) {
//...............................ota
if (ESPControllerWifiClient_IsNeedReconect)
{
_esp32WifiModuleClientReconnect();
ESPControllerWifiClient_IsNeedReconect = 0;
}
ESPControllerWifiClient_status = WiFi.status() == WL_CONNECTED;
if (_otaUpadterStatus)
{
ArduinoOTA.handle();
}
else
{
if (ESPControllerWifiClient_status)
{
ArduinoOTA.setHostname ("xxxxxxxxxxx");
ArduinoOTA.setPassword((const char *)"xxxxxxxxxx");
ArduinoOTA.begin();
_otaUpadterStatus = 1;
}
}
if (ESPControllerWifiClient_status)
{
if (! ESPControllerWifiClient_HRD)
{
ESPControllerWifiClient_ip = WiFi.localIP();
ESPControllerWifiClient_subnet = WiFi.subnetMask();
ESPControllerWifiClient_gateway = WiFi.gatewayIP();
ESPControllerWifiClient_dns = WiFi.dnsIP();
ESPControllerWifiClient_HRD = 1;
}
}
else
{
ESPControllerWifiClient_HRD = 0;
}
//......................................ota
// -----------------reshenie problemy s WD--------------
TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE;
TIMERG0.wdt_feed = 1;
TIMERG0.wdt_wprotect = 0;
// -----------------reshenie problemy s WD--------------
}
}
//--------------------------------------End Task1-------------
void Task2code( void * pvParameters ) {
for (;;) {
Сюда пишем все остальное.
}
}
//А так выглядит void loop
void loop() {
}
... тут как обычно
заканчиваем этим...
TaskHandle_t Task1;
TaskHandle_t Task2;
...
void setup() {...
... стандартно
добавляем...
//создаем задачу, которая будет выполняться на ядре 0 с максимальным приоритетом (1)
xTaskCreatePinnedToCore(
Task1code, /* Функция задачи. */
"Task1", /* Ее имя. */
10000, /* Размер стека функции */
NULL, /* Параметры */
1, /* Приоритет */
&Task1, /* Дескриптор задачи для отслеживания */
0); /* Указываем пин для данного ядра */
delay(500);
//Создаем задачу, которая будет выполняться на ядре 1 с наивысшим приоритетом (1)
xTaskCreatePinnedToCore(
Task2code, /* Функция задачи. */
"Task2", /* Имя задачи. */
10000, /* Размер стека */
NULL, /* Параметры задачи */
1, /* Приоритет */
&Task2, /* Дескриптор задачи для отслеживания */
1); /* Указываем пин для этой задачи */
delay(500);
} // закрыли void setup()
void Task1code( void * pvParameters ) {
for (;;) {
//...............................ota
if (ESPControllerWifiClient_IsNeedReconect)
{
_esp32WifiModuleClientReconnect();
ESPControllerWifiClient_IsNeedReconect = 0;
}
ESPControllerWifiClient_status = WiFi.status() == WL_CONNECTED;
if (_otaUpadterStatus)
{
ArduinoOTA.handle();
}
else
{
if (ESPControllerWifiClient_status)
{
ArduinoOTA.setHostname ("xxxxxxxxxxx");
ArduinoOTA.setPassword((const char *)"xxxxxxxxxx");
ArduinoOTA.begin();
_otaUpadterStatus = 1;
}
}
if (ESPControllerWifiClient_status)
{
if (! ESPControllerWifiClient_HRD)
{
ESPControllerWifiClient_ip = WiFi.localIP();
ESPControllerWifiClient_subnet = WiFi.subnetMask();
ESPControllerWifiClient_gateway = WiFi.gatewayIP();
ESPControllerWifiClient_dns = WiFi.dnsIP();
ESPControllerWifiClient_HRD = 1;
}
}
else
{
ESPControllerWifiClient_HRD = 0;
}
//......................................ota
// -----------------reshenie problemy s WD--------------
TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE;
TIMERG0.wdt_feed = 1;
TIMERG0.wdt_wprotect = 0;
// -----------------reshenie problemy s WD--------------
}
}
//--------------------------------------End Task1-------------
void Task2code( void * pvParameters ) {
for (;;) {
Сюда пишем все остальное.
}
}
//А так выглядит void loop
void loop() {
}
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
у нас принято писать какую библиотеку используем....и конечно ссылку на гитхаб этой библиотеки.......
Куски кода что вы выложили ничего не дадут....
Ну и конечно проект в FLprog
Отправлено спустя 56 секунд:

Куски кода что вы выложили ничего не дадут....
Ну и конечно проект в FLprog
Отправлено спустя 56 секунд:


ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
... из void loop()
Функции оставляем за рамками void loop()
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Может я что то не понимаю? Но Loop это основной цикл в работе......как МК запустился....выполняется ТОЛЬКО LOOP и ничего больше
А воз из Loop можно уже запускать другие функции!
У вас же Loop пустой....тоесть проинициализировали МК и он как бы на паузе...
А воз из Loop можно уже запускать другие функции!
У вас же Loop пустой....тоесть проинициализировали МК и он как бы на паузе...
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
По ядрам я раскидывал не в FLprog. Я об этом писал, показывал, и после этого на сайте появились блоки по рассредотачиванию задач по двум ядрам.Anydy писал(а): 11 ноя 2021, 21:39 Куски кода что вы выложили ничего не дадут....
Ну и конечно проект в FLprog
В void loop() идет сначала вифи, ОТА. Кидаете в задачи Task1, а остальное из void loop() в задачи Task2. Переменные ядра видят. Т.е. если в первом ядре булевая xxxx приняла 1, то действие на нулевом ядре, как пример, в цикле if (xxxx == 1) {выполнится}.
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Ну молодец что соображаешь! Создай отдельную тему и подробно опиши как это сделать на Flprog!
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Loop по умолчанию выполняется либо на первом, либо на нулевом ядре. Не помню. А Task1 и Task2 - это Loop для каждого ядра по отдельности. Потому стандартный Loop на уже ничему.
Отправлено спустя 8 минут 3 секунды:
Я с этими блоками еще не ознакомился. У меня на повестке, в выходные, подключение китайского инфракрасного фонаря и проверка качества ночного фото и видео.Anydy писал(а): 11 ноя 2021, 21:55 Ну молодец что соображаешь! Создай отдельную тему и подробно опиши как это сделать на Flprog!
Скиньте свой скетч, раскидаю по ядрам как пример.
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Интересно.....то есть МК запустился....периферия зависла...и нам Loop ни к чему....пусть МК крутится хоть и все остальное висит? Так?
Отправлено спустя 2 минуты 34 секунды:
Отправлено спустя 2 минуты 34 секунды:
Не моё -- https://github.com/geeksville/Micro-RTSP
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
Не. Такое, что выделено я не знаю.
--------------------------------------
void loop()
{
#ifdef ENABLE_WEBSERVER
server.handleClient();
#endif
#ifdef ENABLE_RTSPSERVER
uint32_t msecPerFrame = 100;
static uint32_t lastimage = millis();
--------------------------------------
Давайте скетч из FLprog. Где нам знакомо...
if (ESPControllerWifiClient_IsNeedReconect)
{
_esp32WifiModuleClientReconnect();
ESPControllerWifiClient_IsNeedReconect = 0;
}
ESPControllerWifiClient_status = WiFi.status() == WL_CONNECTED;
--------------------------------------
void loop()
{
#ifdef ENABLE_WEBSERVER
server.handleClient();
#endif
#ifdef ENABLE_RTSPSERVER
uint32_t msecPerFrame = 100;
static uint32_t lastimage = millis();
--------------------------------------
Давайте скетч из FLprog. Где нам знакомо...
if (ESPControllerWifiClient_IsNeedReconect)
{
_esp32WifiModuleClientReconnect();
ESPControllerWifiClient_IsNeedReconect = 0;
}
ESPControllerWifiClient_status = WiFi.status() == WL_CONNECTED;
ESP32 Cam, датчики-сенсоры 433МГц, RCSwitch
// я и сам далеко не программист.....но вроде по логике должно быть понятно ---
#ifdef ENABLE_WEBSERVER
server.handleClient();
//-- если сервер по умолчанию подключен -- #ifdef ENABLE_WEBSERVER---вот этот -- server.handleClient(); // конечно он должен быть прописан раньше ...
#endif
//Значит перестаем делать проверку
Ну вроде и дальше в таком же стиле!
Отправлено спустя 14 минут 58 секунд:
ЗЫ.. это кусок кода для датчика температуры
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
dtostrf(temp, 3, 2, tempchar);//преобразуем float - char
String payload = "{\"data\":";
payload += tempchar;
payload += ",\"write\":true";
//payload += counter;
payload += "}";
вот это тут мало кто знает --- dtostrf(temp, 3, 2, tempchar);
#ifdef ENABLE_WEBSERVER
server.handleClient();
//-- если сервер по умолчанию подключен -- #ifdef ENABLE_WEBSERVER---вот этот -- server.handleClient(); // конечно он должен быть прописан раньше ...
#endif
//Значит перестаем делать проверку
Ну вроде и дальше в таком же стиле!
Отправлено спустя 14 минут 58 секунд:
Нее раз уж взялись писать на С++ то элементарные конструкции языка С++ вам должны быть знакомы.....например для mqttAndrejK писал(а): 11 ноя 2021, 22:18 Давайте скетч из FLprog. Где нам знакомо...
if (ESPControllerWifiClient_IsNeedReconect)
{
_esp32WifiModuleClientReconnect();
ESPControllerWifiClient_IsNeedReconect = 0;
}
ESPControllerWifiClient_status = WiFi.status() == WL_CONNECTED;
ЗЫ.. это кусок кода для датчика температуры
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
dtostrf(temp, 3, 2, tempchar);//преобразуем float - char
String payload = "{\"data\":";
payload += tempchar;
payload += ",\"write\":true";
//payload += counter;
payload += "}";
вот это тут мало кто знает --- dtostrf(temp, 3, 2, tempchar);
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя