Как объединить 2 разных скетча вместе?

(Прежде чем проголосовать против, обратите внимание, что это «звонок» для ответа на часто задаваемые вопросы с самостоятельным ответом.)

Этот вопрос возникает постоянно. Как объединить два разных скетча? Допустим, у меня есть образец скетча датчика температуры/влажности DTH и еще один скетч ЖК-датчика. Как мне их объединить?

, 👍5

Обсуждение

Возможный дубликат [Как объединить два разных эскиза датчика в один полный эскиз?](https://arduinoprosto.ru/q/62059/how-to-combine-two- Different-sensor-sketches-to-one- полный эскиз), @VE7JRO


1 ответ


Лучший ответ:

7

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

Файл main.ino скетча Arduino состоит из трех основных частей:

  1. Объявления:

    • #includes
    • #defines
    • глобальные переменные
  2. Функция setup()

  3. Функция loop().

Вам необходимо объединить эти части по отдельности.

  1. Вам следует объединить подразделы объявлений вместе (объедините все #includes вместе, все #define вместе и все глобальные переменные вместе. Удалите все дубликаты #include.

Если есть дубликаты #define или глобальные переменные, вам нужно выяснить, как их решить. Если символ и имя совпадают

  1. То же самое относится и к двум функциям setup(), которые вы хотите объединить. Кроме того, дублирующиеся части обычно должны присутствовать только один раз (учитывая такие вещи, как Serial.begin(...)).

  2. Кроме того, два loop() объединяются таким же образом, но если вы используете delay(), вы должны иметь в виду, что эти будет суммироваться в окончательном скетче, что сделает его медленнее, чем в первоначальных скетчах. Это также может (вероятно, не будет) работать правильно. Вероятно, вам придется провести рефакторинг кода, чтобы использовать millis() вместо delay().

После объединения двух скетчов таким образом ваши глобальные переменные станут общими. Вам нужно будет разрешить любые конфликты имен или переименовать глобальные переменные, которые различаются в исходных скетчах, но должны быть одинаковыми. У вас также могут быть общие ресурсы, такие как датчики и ЖК-дисплеи.

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

,

См., например, этот ответ с примерами., @sempaiscuba

Чтобы изолировать некоторые конфликты в коде, вы можете переименовать биты setupLCD(), setupDTH(), loLCD(), loDTH(), а также вызывать и управлять взаимодействиями в setup(){setupLCD();setupDTH();} и loop(){loopLCD(); циклDTH();}, @Dave X

@DaveX, неплохая идея, хотя это не поможет при конфликтах в глобальных переменных., @Duncan C

@DuncanC - согласен. Как вы говорите, конфликты потребуют анализа и будут рассматриваться в каждом конкретном случае., @Dave X