Объединить несколько скетчей?

Как соединить несколько скетчей?


Чтобы соединить несколько проектов в один, нужно разобраться со всеми возможными конфликтами:

  • Проекты построены на одной и той же плате/платформе?
    • Да – отлично!
    • Нет – нужно убедиться, что “общая” плата сможет работать с железками, которые есть в объединяемых проектах, а также сама обладает нужной периферией.
  • Есть ли в проектах железки, подключенные к интерфейсам связи?
    • Нет – отлично!
    • Да, I2C – все железки подключаются на I2C общей платы. Убедитесь, что адреса устройств не совпадают (случается крайне редко)!
    • Да, SPI – у шины SPI все пины “общие”, кроме CS (Chip Select), этот пин может быть любым цифровым. Подробнее можно почитать вот тут.
    • Да, UART – беда, к UART может быть подключено только одно устройство. Можно повесить одну железку на аппаратный UART, а вторую на SoftwareSerial. Либо заморачиваться с мультиплексорами.
  • Есть ли пины, занятые в обоих проектах?
    • Нет – отлично!
    • Да – разобраться, какую функцию выполняет пин в каждом из проектов и подобрать замену, как в железе, так и в программе:
      • Если это обычный цифровой вход-выход, можно заменить на любой другой
      • Если это измерение аналогового сигнала – заменить на другой аналоговый пин
      • Если это генерация ШИМ, подключить соответственно на другой ШИМ пин и подкорректировать программу
      • Если это прерывание – быть внимательным
  • Используются ли одни и те же периферийные блоки микроконтроллера? Для этого нужно изучить железки и их библиотеки:
    • Нет – ОТЛИЧНО!
    • Да – ситуация требует хорошего опыта работы с Ардуино…
    • Используется один и тот же таймер – нельзя одновременно использовать ШИМ на ногах первого таймера и управление сервоприводами при помощи библиотеки Servo.h
    • Используется генерация звука при помощи tone() – нельзя использовать ШИМ на ногах второго таймера
    • Используются прерывания по таймеру и генерация ШИМ на соответствующем таймере – сложная ситуация
    • И т.д., ситуаций может быть бесконечно много…

Можно внести все правки в схемы и программы объединяемых проектов, чтобы они не конфликтовали. Далее приступаем к сборке общей программы:

  • Подключаем все библиотеки. Некоторые библиотеки могут конфликтовать, например Servo и Timer1, как обсуждалось выше.
  • Сравниваем имена глобальных переменных и дефайны в объединяемых программах: они не должны совпадать. Совпадающие меняем при помощи замены по коду (Правка/Найти) на другие. Далее копипастим все глобальные переменные и дефайны в общую программу
  • Объединяем содержимое блока setup()
  • Копипастим в общую программу все “пользовательские” функции
  • Остаётся у нас только loop(), и это самая сложная задача

Раньше у нас было два (или больше) отдельно работающих проекта. Теперь наша задача как программиста – продумать и запрограммировать работу этих нескольких проектов в одном, и тут ситуаций уже бесконечное множество:

  • Основной код (который в loop()) из разных проектов должен выполняться по очереди по таймеру
  • Набор действий из разных проектов должен переключаться кнопкой или ещё как-то
  • К одному проекту добавляется датчик  из другого проекта – данные нужно обработать и запрограммировать их дальнейшее движение (вывод на дисплей, отправку и т.д.)
  • Все “проекты” должны работать одновременно на одной Ардуине
  • И так далее

В большинстве случаев нельзя просто так взять и объединить содержимое loop() из разных программ, я надеюсь все это понимают. Даже мигалку и пищалку таким образом объединить не получится, если изначально код был написан с задержками или замкнутыми циклами.

Полезные страницы


5/5 - (1 голос)
Подписаться
Уведомить о
guest

3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии