FreeRTOS не решает мою проблему с параллельным выполнением задач
Я новичок в esp32, и я пытаюсь объединить два кода в один, это простые коды из проектов, которые я нашел в Интернете, первый использует датчик PIR для отправки сообщения в телеграмму каждый раз при обнаружении движения, второй код использует RFID для открытия дверного замка. Когда я попытался напрямую объединить два кода вместе, esp32 сошел с ума на последовательном мониторе, и ничего не работало, даже не удалось подключиться к WIFI.
Затем я попытался создать задачу для каждого из них, используя freeRTOS, и сделал это следующим образом:
task1: для соединения Wi-Fi, работающего на CORE 0 //функция Wi-Fi взята из скетча 1
задача 2: для RFID и дверного замка, работающего на CORE 1 //взято из скетча 2
task3: для обнаружения движения и отправки сообщения телеграммы выполняется на CORE 0 //взято из скетча 1
Опять esp32 сошел с ума, когда я открыл последовательный монитор, и он выдал мне эту ошибку: " Ошибка медитации гуру: ядро 1 запаниковало (недопустимая инструкция). Исключение не было обработано. "
Я понятия не имею, почему это происходит, действительно ли требуется, чтобы RTOS объединила два скетча и запустила их одновременно, или простая задержка и операторы if решат проблему? Мне нужна помощь, пожалуйста.
Скетч 1: Обнаружение движения из введите здесь описание ссылки
/*
Руи Сантос
Полная информация о проекте на https://RandomNerdTutorials.com/telegram-esp32-motion-detection-arduino/
Проект создан с использованием библиотеки универсальных ботов Telegram Брайана Лоха: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot.
*/
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Замените учетными данными вашей сети
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Инициализировать Telegram BOT
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // ваш токен бота (получить от Botfather)
// Используйте @myidbot, чтобы узнать идентификатор чата отдельного человека или группы
// Также обратите внимание, что вам нужно нажать "старт" на бота, прежде чем он сможет
// сообщение вам
#define CHAT_ID "XXXXXXXXXX"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
const int motionSensor = 27; // ИК-датчик движения
bool motionDetected = false;
// Указывает, когда обнаружено движение
void IRAM_ATTR detectsMovement() {
//Serial.println("ОБНАРУЖЕНО ДВИЖЕНИЕ!!!");
motionDetected = true;
}
void setup() {
Serial.begin(115200);
// Режим ИК-датчика движения INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Установите контакт датчика движения как прерывание, назначьте функцию прерывания и установите режим RISING
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
// Попытка подключиться к сети Wi-Fi:
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Добавляем корневой сертификат для api.telegram.org
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, "Bot started up", "");
}
void loop() {
if(motionDetected){
bot.sendMessage(CHAT_ID, "Motion detected!!", "");
Serial.println("Motion Detected");
motionDetected = false;
}
}
Скетч 2: дверной замок RFID из введите описание ссылки здесь
/*
* Этот код ESP32 создан esp32io.com
*
* Этот код ESP32 опубликован в открытом доступе.
*
* Для получения более подробной информации (инструкция и схема подключения) посетите https://esp32io.com/tutorials/esp32-rfid-nfc-door-lock-system
*/
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 5 // контакт ESP32 GIOP5
#define RST_PIN 27 // контакт ESP32 GIOP27
#define RELAY_PIN 22 // контакт ESP32 GIOP22 подключается к реле
MFRC522 rfid(SS_PIN, RST_PIN);
byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF};
void setup() {
Serial.begin(9600);
SPI.begin(); // инициализируем шину SPI
rfid.PCD_Init(); // инициализация MFRC522
pinMode(RELAY_PIN, OUTPUT); // инициализируем пин как выход.
digitalWrite(RELAY_PIN, HIGH); // Запри дверь
Serial.println("Tap an RFID/NFC tag on the RFID-RC522 reader");
}
void loop() {
if (rfid.PICC_IsNewCardPresent()) { // доступен новый тег
if (rfid.PICC_ReadCardSerial()) { // NUID считан
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (rfid.uid.uidByte[0] == keyTagUID[0] &&
rfid.uid.uidByte[1] == keyTagUID[1] &&
rfid.uid.uidByte[2] == keyTagUID[2] &&
rfid.uid.uidByte[3] == keyTagUID[3] ) {
Serial.println("Access is granted");
digitalWrite(RELAY_PIN, LOW); // отпираем дверь на 2 секунды
delay(2000);
digitalWrite(RELAY_PIN, HIGH); // Запри дверь
}
else
{
Serial.print("Access denied, UID:");
for (int i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println();
}
rfid.PICC_HaltA(); // остановить PICC
rfid.PCD_StopCrypto1(); // остановить шифрование на PCD
}
}
}
@w22tq, 👍0
1 ответ
Нет, вам не нужна RTOS, чтобы делать что-то простое, например:
if (motionDetected)
open_the_door ();
В основном у вас есть две петли:
void loop ()
{
if (motionDetected)
send_a_message_to_open_the_door ();
}
И:
void loop ()
{
if (message_received_to_open_the_door)
open_the_door();
}
Итак, вы объединяете их в один цикл:
void loop ()
{
if (motionDetected)
open_the_door();
}
Я оставлю вас для внесения фактических изменений в код.
- Импульсы SCLK не видны при использовании SPI на ESP32
- Взаимная связь ESP32 SPI
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32