Как можно объединить третий скетч с другими скетчами в один на Arduino?

Здравствуйте! У меня возникла проблема с объединением трех скетчей в одном проекте. Сейчас проект включает в себя: первый скетч - страницу приветствия, второй - генератор сигналов с определенными частотами, и третий - таймер для программного включения и отключения питания устройства посредством транзисторного ключа. Первый и второй скетчи работают без сбоев, но при добавлении третьего проект начинает зависать. Все три скетча успешно работают по отдельности. Я уже устранил использование <b>delay</b> в <b>loop</b> третьего скетча, заменив его на <b>millis</b>, и компиляция проходит успешна, однако проблема с зависанием сохраняется. Что мне стоит проверить или изменить, чтобы исправить эту ситуацию? <br/> Ниже приведен общий код, в комментариях я добавил третий скетч. Поскольку весь код не помещается, размещаю лишь его основную часть. <br/> <br/> <pre><code>//Libraries
#include &lt;Wire.h&gt;                 //библиотека для работы с интерфейсом I2C
#include &lt;Rotary.h&gt;               //Ben Buxton https://github.com/brianlow/Rotary
#include &lt;si5351.h&gt;               //Etherkit https://github.com/etherkit/Si5351Arduino
#include &lt;Adafruit_GFX.h&gt;         //Adafruit GFX https://github.com/adafruit/Adafruit-GFX-Library
#include &lt;Adafruit_SSD1306.h&gt;     //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306

//пользовательские настройки
//------------------------------------------------------------------------------------------------------------
#define F_MIN        1000UL     // Нижний предел частоты
#define F_MAX        225000000UL // Верхний предел частоты
#define quartz       25000000    // Действительная частота кварца 
/* При наличии точного частотомера, подключить прибор, выставить на выходе С1 или С0, частоту
    25 000 000 Гц,  затем вращая ручку энкодера получи
  • 16 сентября 2024 г. 17:43
Ответы на вопрос 1
Объединение нескольких скетчей на Arduino может быть непростой задачей, особенно когда каждый из них использует различные таймеры и обработку событий. Вот несколько рекомендаций и шагов, которые помогут вам объединить ваши скетчи в один без зависаний.

### Общие рекомендации

1. **Избегайте использования `delay()`:** Поскольку вы уже заменили все `delay()` на `millis()`, это правильный шаг, так как `delay()` блокирует выполнение программы.

2. **Используйте флаги и функции для каждой задачи:** Основная идея состоит в том, чтобы контролировать состояние каждой задачи с помощью флагов и выполнять каждую задачу по очереди в функции `loop()`. Это поможет избежать конфликтов между задачами.

3. **Оптимизация работы с библиотеками:** Если некоторые библиотеки используют таймеры, убедитесь, что они не конфликтуют между собой.

### Пример объединения скетчей

Ниже приведен упрощенный пример структуры кода, которая может помочь объединить ваши скетчи:

```cpp
// Подключаем необходимые библиотеки
#include <Wire.h>
#include <Rotary.h>
#include <si5351.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Настройки частот и другие переменные
#define F_MIN 1000UL
#define F_MAX 225000000UL
#define quartz 25000000

// Переменные для управления
bool isGeneratingSignal = false;
unsigned long lastSignalUpdate = 0;
unsigned long lastTimerCheck = 0;
const long timerInterval = 1000; // Интервал проверки таймера в миллисекундах

// Функция инициализации
void setup() {
    // Инициализация библиотек и оборудования
    // ...
}

// Генерация сигнала
void generateSignal() {
    // Ваш код для генерации сигнала
    // ...
}

// Таймер
void checkTimer() {
    unsigned long currentMillis = millis();
    if (currentMillis - lastTimerCheck >= timerInterval) {
        lastTimerCheck = currentMillis;
        // Проверьте условия и переключите питание
        // например:
        // if (условия) { переключить питание }
    }
}

// Главный цикл программы
void loop() {
    // Обработка страницы приветствия
    // ...

    // Обновляем сигнал
    if (isGeneratingSignal) {
        generateSignal();
    }

    // Проверка таймера
    checkTimer();

    // Обработка других задач (например, чтение энкодера)
    // ...
}
```

### Другие моменты для проверки

1. **Проверьте конфликты в ресурсах:** Убедитесь, что никакие библиотеки или периферийные устройства не требуют совместного использования ресурсов (например, пинов или таймеров).

2. **Упростите логику:** Если вы все еще сталкиваетесь с зависаниями, попробуйте упростить логику или временно отключить некоторые части кода, чтобы найти первую ошибку.

3. **Используйте отладочный вывод:** Выводите результаты работы каждой из функций в Serial Monitor, чтобы понять, где возникает зависание.

4. **Настройте приоритет:** Если у вас есть задачи, которые требуют более быстрого отклика, рассмотрите возможность их обработки с помощью прерываний, если это уместно.

Следуя этим рекомендациям, вы сможете объединить ваши скетчи в один работоспособный проект без зависаний.
Похожие вопросы