Size: a a a

ESP8266 & ESP32 [RU]

2020 December 04

R

Resident in ESP8266 & ESP32 [RU]
Daniil
У меня в проекте куча функций, их ведь можно вынести в отдельный файл.h
Что гуглить, чтоб понять, как сделать?
А то я сделал не зная и он мне странные ошибки начал выдавать
Простой способ, работающий, но совершенно ни разу не правильный (не соответствует догматам C/C++):
Выделяем часть кода в отдельный файл, укладываем рядом со скетчем, а потом в том месте скетча, где оно должно находиться, вставляем конструкцию #include "имя нашего файла с выделенными кусками кода".
Препроцессор еще до компиляции врежет содержимое дополнительного файла в скетч в том самом месте, где находится директива #include

Вариант второй, более правильный:
Выделяем часть кода, содержащую требуемые функции в отдельный файл. При этом данные функции не должны использовать никаких функций, переменных и классов из основного файла программы. Требование необязательное, но его несоблюдение потребует построения дополнительных связей в виде объявления переменных из другого модуля как extern, описания прототипов функций и создает излишнюю сложность связей кода и серьезно осложняет повторное использование кода. Короче говоря, лучше без крайней необходимости так не делать.
файлу даем какое-нибудь имя и расширение .cpp. Например, file.cpp.
Делаем второй файл с прототипами функций, которые будут использоваться в основном файле программы. Даем ему то же имя, но другое расширение - .h
Выкладываем получившиеся два файла в папку со скетчем.
добавляем в начало скетча строку
#include "имя получившегося файла с расширением.h"

Сверхпростой и в общем-то бессмысленный пример.
Допустим, что в наш файл была выделена функция function, имеющая параметром int и возвращающая int.

Файл с функцией file.cpp:
Код (Text):

int function(int i)
{
   return(i);
}

Файл с прототипом функции file.h:
Код (Text):

int function(int);

Скетч (test.ino):
Код (Text):

#include "file.h"
setup()
{
  Serial.begin(9600);
}
loop()
{
  Serial.println(function(millis()%2));
}

Вариант третий, еще более правильный.
То, что получилось во втором варианте копируется в папку с библиотеками в подпапку с именем, которое совпадает с именем файла с функциями без расширения. А еще лучше, оформляется в архив, как библиотека, чтобы было просто ее устанавливать в IDE.

PS. Arduino IDE не содержит вменяемых средств для работы с проектами, содержащими более одного файла.
Она умеет по факту только открывать уже готовый такой проект, показывая все его файлы (они должны все лежать в одной папке) во вкладках, и подключать к проекту внешние библиотеки.
Так что придется делать все это расчленение во внешнем текстовом редакторе, укладывая результаты в папку со скетчем, а потом уже открывать его в Arduino IDE.
Если же делается библиотека (вариант три) то файлы библиотеки придется всегда править чем-то внешним по отношению к Arduino IDE.
источник

D

Daniil in ESP8266 & ESP32 [RU]
Resident
Простой способ, работающий, но совершенно ни разу не правильный (не соответствует догматам C/C++):
Выделяем часть кода в отдельный файл, укладываем рядом со скетчем, а потом в том месте скетча, где оно должно находиться, вставляем конструкцию #include "имя нашего файла с выделенными кусками кода".
Препроцессор еще до компиляции врежет содержимое дополнительного файла в скетч в том самом месте, где находится директива #include

Вариант второй, более правильный:
Выделяем часть кода, содержащую требуемые функции в отдельный файл. При этом данные функции не должны использовать никаких функций, переменных и классов из основного файла программы. Требование необязательное, но его несоблюдение потребует построения дополнительных связей в виде объявления переменных из другого модуля как extern, описания прототипов функций и создает излишнюю сложность связей кода и серьезно осложняет повторное использование кода. Короче говоря, лучше без крайней необходимости так не делать.
файлу даем какое-нибудь имя и расширение .cpp. Например, file.cpp.
Делаем второй файл с прототипами функций, которые будут использоваться в основном файле программы. Даем ему то же имя, но другое расширение - .h
Выкладываем получившиеся два файла в папку со скетчем.
добавляем в начало скетча строку
#include "имя получившегося файла с расширением.h"

Сверхпростой и в общем-то бессмысленный пример.
Допустим, что в наш файл была выделена функция function, имеющая параметром int и возвращающая int.

Файл с функцией file.cpp:
Код (Text):

int function(int i)
{
   return(i);
}

Файл с прототипом функции file.h:
Код (Text):

int function(int);

Скетч (test.ino):
Код (Text):

#include "file.h"
setup()
{
  Serial.begin(9600);
}
loop()
{
  Serial.println(function(millis()%2));
}

Вариант третий, еще более правильный.
То, что получилось во втором варианте копируется в папку с библиотеками в подпапку с именем, которое совпадает с именем файла с функциями без расширения. А еще лучше, оформляется в архив, как библиотека, чтобы было просто ее устанавливать в IDE.

PS. Arduino IDE не содержит вменяемых средств для работы с проектами, содержащими более одного файла.
Она умеет по факту только открывать уже готовый такой проект, показывая все его файлы (они должны все лежать в одной папке) во вкладках, и подключать к проекту внешние библиотеки.
Так что придется делать все это расчленение во внешнем текстовом редакторе, укладывая результаты в папку со скетчем, а потом уже открывать его в Arduino IDE.
Если же делается библиотека (вариант три) то файлы библиотеки придется всегда править чем-то внешним по отношению к Arduino IDE.
Спасибо большое
источник

r

romanetz in ESP8266 & ESP32 [RU]
Andy Korg
Все таки Arduino это больше учебный и домашний проект. В производство лучше использовать инструменты от вендора - esp-idf. Но если все таки хотите использовать Arduino, то тщательно проверяйте библиотеки, Unit тестирование и прочие приемы повышения качества кода.
Рассматривайте их как фреймворк
Не скажу относительно пользовательских библиотек, но в коде из esp32-arduino ничего криминального не увидел
Вы же не требуете юнит тестов от .NET, скажем
источник

AK

Andy Korg in ESP8266 & ESP32 [RU]
romanetz
Рассматривайте их как фреймворк
Не скажу относительно пользовательских библиотек, но в коде из esp32-arduino ничего криминального не увидел
Вы же не требуете юнит тестов от .NET, скажем
:)
Требую, но не от самого .Net framework, а от программ написанных на нем.
источник

S

Sid in ESP8266 & ESP32 [RU]
Resident
Простой способ, работающий, но совершенно ни разу не правильный (не соответствует догматам C/C++):
Выделяем часть кода в отдельный файл, укладываем рядом со скетчем, а потом в том месте скетча, где оно должно находиться, вставляем конструкцию #include "имя нашего файла с выделенными кусками кода".
Препроцессор еще до компиляции врежет содержимое дополнительного файла в скетч в том самом месте, где находится директива #include

Вариант второй, более правильный:
Выделяем часть кода, содержащую требуемые функции в отдельный файл. При этом данные функции не должны использовать никаких функций, переменных и классов из основного файла программы. Требование необязательное, но его несоблюдение потребует построения дополнительных связей в виде объявления переменных из другого модуля как extern, описания прототипов функций и создает излишнюю сложность связей кода и серьезно осложняет повторное использование кода. Короче говоря, лучше без крайней необходимости так не делать.
файлу даем какое-нибудь имя и расширение .cpp. Например, file.cpp.
Делаем второй файл с прототипами функций, которые будут использоваться в основном файле программы. Даем ему то же имя, но другое расширение - .h
Выкладываем получившиеся два файла в папку со скетчем.
добавляем в начало скетча строку
#include "имя получившегося файла с расширением.h"

Сверхпростой и в общем-то бессмысленный пример.
Допустим, что в наш файл была выделена функция function, имеющая параметром int и возвращающая int.

Файл с функцией file.cpp:
Код (Text):

int function(int i)
{
   return(i);
}

Файл с прототипом функции file.h:
Код (Text):

int function(int);

Скетч (test.ino):
Код (Text):

#include "file.h"
setup()
{
  Serial.begin(9600);
}
loop()
{
  Serial.println(function(millis()%2));
}

Вариант третий, еще более правильный.
То, что получилось во втором варианте копируется в папку с библиотеками в подпапку с именем, которое совпадает с именем файла с функциями без расширения. А еще лучше, оформляется в архив, как библиотека, чтобы было просто ее устанавливать в IDE.

PS. Arduino IDE не содержит вменяемых средств для работы с проектами, содержащими более одного файла.
Она умеет по факту только открывать уже готовый такой проект, показывая все его файлы (они должны все лежать в одной папке) во вкладках, и подключать к проекту внешние библиотеки.
Так что придется делать все это расчленение во внешнем текстовом редакторе, укладывая результаты в папку со скетчем, а потом уже открывать его в Arduino IDE.
Если же делается библиотека (вариант три) то файлы библиотеки придется всегда править чем-то внешним по отношению к Arduino IDE.
Пс вроде в 1.9 должны решить
источник

AM

Aleksander Mironov in ESP8266 & ESP32 [RU]
Ммм никто не видал С++ библиотеки строк статичных?
источник

NK

ID:0 in ESP8266 & ESP32 [RU]
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
Коллеги, а почему мак может перестать видеть контроллеры для прошивки? Пропал usb-serial порт
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
Пробовал Arduino IDE, ESPHome-Flasher
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
(esp8266)
источник

R

Resident in ESP8266 & ESP32 [RU]
Драйверы, перезарпускался?
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
Resident
Драйверы, перезарпускался?
угу
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
даже ставил повторно
источник

D

Do in ESP8266 & ESP32 [RU]
👻hi
источник

r

romanetz in ESP8266 & ESP32 [RU]
Алер Денисов
даже ставил повторно
А что dmesg говорит?
источник

YT

Yuriy Trikoz in ESP8266 & ESP32 [RU]
Алер Денисов
Коллеги, а почему мак может перестать видеть контроллеры для прошивки? Пропал usb-serial порт
в выводе lsusb его нет?
источник
2020 December 05

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
решил просто с настолки пс, потом разберусь с макбуком
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
Может кто подсказать как правильно подключить к WS2815 DI чтобы две ленты были идентичные
источник

АД

Алер Денисов... in ESP8266 & ESP32 [RU]
я попробовал просто параллельно, но оно не хочет работать
источник

ЮР

Юрий Ревака... in ESP8266 & ESP32 [RU]
Кто подскажет, где в esp-idf изменить скорость загрузки, по умолчанию подставляет 460800, раньше менял в idf.py, сейчас по другому.
источник