Как объединить 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?
- Печать string and integer LCD
- устаревшее преобразование из строковой константы в 'char*'
Возможный дубликат [Как объединить два разных эскиза датчика в один полный эскиз?](https://arduinoprosto.ru/q/62059/how-to-combine-two- Different-sensor-sketches-to-one- полный эскиз), @VE7JRO