Пытаюсь осваивать дисплей с помощью lvgl. Ковыряю пример demo_widgets. Структура проекта довольно запутанная. Файл LvglWidgets.ino содержит включения
#include <lvgl.h>
#include <demos/lv_demos.h>.
И ссылается на файл, который находится в папках самой библиотеки lvgl, Arduino\libraries\lvgl\src\demos\widgets\lv_demo_widgets.c. В этом файле и создается все то, что выводится на экран.
Дисплейный модуль сделан на основе esp32 и у меня он используется только как интерфейс основной платы Arduino Mega. Чтоб выводить информацию на дисплей, мне нужно связать обе платы по Serial или I2C. Допустим, мне нужно написать для esp32 что-то вроде
if (Serial.available()>0){
int val = Serial.parseInt();
lv_label_set_text_fmt(label1, "%d%C", val);
И вот здесь я запутался с видимостью переменных. В каком файле писать .ino или .c?
Если писать в .ino, он не видит переменные файла .c (label1), extern не помогает, т.к. они не в одной папке. Если поместить файл .ino в папку библиотеки вместе с файлом .c, он видит и заголовочный файл, это приводит к ошибкам. Если писать в .c, он не знает что такое Serial.
Вобщем, большой хелп.
Библиотека https://github.com/lvgl/lv_port_pc_visual_studio
Вы, видимо так спешили что-то написать, что не прочитали то, что специально для Вас было написано в пустом окне. Прочитайте и оформите код как положено.
И да, кстати, когда говорите о нестандартной библиотеке, указывайте где Вы её брали, чтобы человек мог взять ту же версию той же библиотеки.
extern надо писать в *.h файле.
И, кстати, почему файлы не в одной папке?
Похоже Вы не различаете видимость переменных в языке Си и видимость файлов в Arduino IDE.
Вероятно как раз из-за того, что Вы игнорируете *.h файл. (но это не точно: что, где и как у Вас расположено, и что именно и где Вы пишете, никто кроме Вас не знает)
К сожалению, не могу придумать, как здесь изобразить структуру файлов.
Вот походу противоречие этих правил мне и мешает.
Пока, кажется - либо все переменные файла .с объявлять в заголовочном файле. Либо - в файле .с создать функцию с чтением serial, объявить ее в заголовочном файле и ссылаться на нее из loop() файла .ino.
В том то и дело, что, как я говорил, это не мой проект, а я пытаюсь модифицировать пример из библиотеки. Поэтому ни навести порядок, ни изменить расширение вряд ли получится. Так что сейчас файл .с, в котором находятся все переменные интерфейса, находится в папках библиотеки. А файл .ino, в котором исполняется loop(), эти переменные не видит. Тот есть видимость по языку С есть, а по ArduinoIDE нет.
Вот, до чего приятно, сморозишь какую нибудь глупость, и сразу все мэтры подключаются к обсуждению.
Имелось ввиду, что .ino файл запускает .c файл, который расположен в папках библиотеки, но не видит из него переменные.
Так все устроено в этой библиотеке. .ino файл содержит лишь самые общие настройки и практически одинаков для любых проектов. Он запускает .с файл, который расположен в папках библиотеки и в котором и создаётся уже интерфейс проекта. Так сделаны все примеры, которые я сейчас ковыряю. Интерфейс под свои нужды я уже могу сделать. А вот примеров взаимодействия с другой платой нет.