Как объединить 2 разных скетча вместе?
(Прежде чем проголосовать против, обратите внимание, что это «звонок» для ответа на часто задаваемые вопросы с самостоятельным ответом.)
Этот вопрос возникает постоянно. Как объединить два разных скетча? Допустим, у меня есть образец скетча датчика температуры/влажности DTH и еще один скетч ЖК-датчика. Как мне их объединить?
@Duncan C, 👍5
Обсуждение1 ответ
Лучший ответ:
Этот вопрос возникает постоянно. Я объясню, что нужно делать в общих чертах. Попробуйте, а если у вас возникнут проблемы, задайте вопрос, показывающий ваши два начальных скетча, попытку их объединения и подробную информацию о том, что пошло не так.
Файл main.ino скетча Arduino состоит из трех основных частей:
Объявления:
#includes
#defines
- глобальные переменные
Функция
setup()
Функция
loop()
.
Вам необходимо объединить эти части по отдельности.
- Вам следует объединить подразделы объявлений вместе (объедините все
#includes
вместе, все#define
вместе и все глобальные переменные вместе. Удалите все дубликаты#include
.
Если есть дубликаты #define
или глобальные переменные, вам нужно выяснить, как их решить. Если символ и имя совпадают
То же самое относится и к двум функциям
setup()
, которые вы хотите объединить. Кроме того, дублирующиеся части обычно должны присутствовать только один раз (учитывая такие вещи, какSerial.begin(...)
).Кроме того, два
loop()
объединяются таким же образом, но если вы используетеdelay()
, вы должны иметь в виду, что эти будет суммироваться в окончательном скетче, что сделает его медленнее, чем в первоначальных скетчах. Это также может (вероятно, не будет) работать правильно. Вероятно, вам придется провести рефакторинг кода, чтобы использовать millis() вместоdelay()
.
После объединения двух скетчов таким образом ваши глобальные переменные станут общими. Вам нужно будет разрешить любые конфликты имен или переименовать глобальные переменные, которые различаются в исходных скетчах, но должны быть одинаковыми. У вас также могут быть общие ресурсы, такие как датчики и ЖК-дисплеи.
(Обратите внимание, что если два скетча используют один и тот же ресурс для разных целей, ситуация усложняется, например, использование одного и того же вывода для разных целей, использование одного и того же таймера в обоих скетчах или использование одного и того же прерывания. Эти вещи потребуют анализа. и изменения в каждом конкретном случае.)
См., например, этот ответ с примерами., @sempaiscuba
Чтобы изолировать некоторые конфликты в коде, вы можете переименовать биты setupLCD(), setupDTH(), loLCD(), loDTH(), а также вызывать и управлять взаимодействиями в setup(){setupLCD();setupDTH();}
и loop(){loopLCD(); циклDTH();}
, @Dave X
@DaveX, неплохая идея, хотя это не поможет при конфликтах в глобальных переменных., @Duncan C
@DuncanC - согласен. Как вы говорите, конфликты потребуют анализа и будут рассматриваться в каждом конкретном случае., @Dave X
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Возможный дубликат [Как объединить два разных эскиза датчика в один полный эскиз?](https://arduinoprosto.ru/q/62059/how-to-combine-two- Different-sensor-sketches-to-one- полный эскиз), @VE7JRO