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
    }
  }
}

, 👍0


1 ответ


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();
  }

Я оставлю вас для внесения фактических изменений в код.

,