Почему при использовании библиотеки LiquidCrystal_I2C.h в TinkerCad появляется сообщение "invalid header file"?
Это ссылка на человека, который заставил этот проект работать. Похоже, я не могу заставить его работать самостоятельно: проект.
Что я делаю не так?


/* DICTIONARY - CC = ConClusion ; */
/* LEGEND - Serial legend - */
/* README - */
#define TRIG 7
#define ECHO 8
#define PB_1 2
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
uint32_t loop_count = 0;
long duration;
int distance;
volatile byte LCD_State = 0;
unsigned long lastChange;
void setup()
{
pinMode(TRIG,OUTPUT);
pinMode(ECHO,INPUT);
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(PB_1),LCD_to_ON,RISING);
lcd.begin();
lcd.backlight();
}
void loop()
{
loop_count++;
if (LCD_State == 1 && (millis() - lastChange) >= 600000/*time corresponding to LCD Screens ON-time, CC=changable*/ )
{
LCD_State = 0;
}
Serial.print(loop_count);
Serial.print(" ");
Serial.print(":");
Serial.print(" ");
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
Serial.print(distance);
Serial.print(" ");
if(LCD_State == 0)
{
Serial.print(LCD_State);
}
else if(LCD_State == 1)
{
Serial.print(LCD_State);
}
Serial.print(" ");
Serial.print(millis());
Serial.print(" ");
Serial.print(lastChange);
Serial.print(" ");
if(LCD_State == 1)
{
Serial.print("OK, L_ON");
}
else if(LCD_State == 0)
{
Serial.print("OK, L_OFF");
}
Serial.println();
delay(10);//Только для TINKERCAD, удалить из аппаратной версии
}
void LCD_to_ON()
{
LCD_State = 1;
lastChange = millis();
}
Ошибка:
invalid header file
Как должен выглядеть выход SM с ЖК-дисплеем без I2C:

Дополнительная информация
(не имеет значения для вопроса)
Кстати, код предназначен для измерения уровня воды и отображения данных на дисплее. После того, как я куплю оборудование и оно наконец-то будет отправлено, я добавлю ещё много всего (требуется MEGA2560 или даже DUE) -
Более сложная схема: устройство будет измерять уровень воды и температуру окружающей среды (возможно, даже самой воды). Оно будет включать/выключать водяной насос, используя схему моего отца для включения/выключения большого реле двумя кнопками, но вместо кнопок я буду использовать более мелкие реле для автоматизации. Я обеспечу отсутствие сбоев, используя состояние Arduino-off для насоса, равное 0, и две пары электродов или сумма, установленные на верхней части резервуара для воды. Когда цепь замкнётся из-за непредсказуемого уровня воды, программа остановит насос. Мне потребуется измерять и преобразовывать показания примерно 60 раз (добавление x литров воды = y увеличение счетчика), поскольку резервуар расположен горизонтально, что затрудняет вычисления. Мне нужно будет создать веб-сайт или сумму и отправлять на него данные (W5500), лог времени (RTC DS3231 I2C). И многое другое.
Если я не найду решения, мне, вероятно, придётся начать программировать на скорую руку раньше, чем я ожидал. Просто каждый день я нахожу компоненты лучше и больше для своего проекта, поэтому я либо подожду и закажу один раз, либо буду ждать и заказывать несколько раз. И при всём при этом я уверен, что всё равно пожалею о своих покупках.
@user29682184, 👍1
Обсуждение1 ответ
Отсутствуют аргументы для begin()
Вам необходимо указать больше аргументов для lcd.begin(), в настоящее время вы их не указали.
Из LiquidCrystal_I2C.h
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
Вам нужно передать два (или три) параметра, например:
lcd.begin(numRows, chSize);
Очевидно, после первого объявления и присвоения значений numRows и chSize.
Обратите внимание, что третий аргумент является необязательным, так как значение по умолчанию (LCD_5x8DOTS) указано в объявлении в заголовке.
Причина неоднозначной ошибки
Во-первых, сообщение об ошибке действительно вводит в заблуждение:

Поскольку вы неправильно вызываете функцию begin(), TinkerCad просто выдаёт стандартное сообщение об ошибке: «Недопустимый заголовочный файл». Обычно это означает, что вы неправильно вызвали функцию/член, что не соответствует объявлению в заголовочном файле.
Примечание: Заголовочный файл не обязательно является недействительным, скорее всего, недействительным является ваш вызов.
Arduino IDE предоставляет гораздо более полезный и информативный набор ошибок:
/private/var/folders/6b/9xc3xm_944n6xhwc12_s2c7h0000gn/T/.arduinoIDE-unsaved2025214-42214-1iranv3.clms/sketch_mar14b/sketch_mar14b.ino: In function 'void setup()':
/private/var/folders/6b/9xc3xm_944n6xhwc12_s2c7h0000gn/T/.arduinoIDE-unsaved2025214-42214-1iranv3.clms/sketch_mar14b/sketch_mar14b.ino:24:16: error: no matching function for call to 'LiquidCrystal_I2C::begin()'
lcd.begin();
^
In file included from /private/var/folders/6b/9xc3xm_944n6xhwc12_s2c7h0000gn/T/.arduinoIDE-unsaved2025214-42214-1iranv3.clms/sketch_mar14b/sketch_mar14b.ino:7:0:
/Users/macbook/Documents/Arduino/libraries/LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate: void LiquidCrystal_I2C::begin(uint8_t, uint8_t, uint8_t)
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
^~~~~
/Users/macbook/Documents/Arduino/libraries/LiquidCrystal_I2C/LiquidCrystal_I2C.h:58:8: note: candidate expects 3 arguments, 0 provided
/private/var/folders/6b/9xc3xm_944n6xhwc12_s2c7h0000gn/T/.arduinoIDE-unsaved2025214-42214-1iranv3.clms/sketch_mar14b/sketch_mar14b.ino: At global scope:
/private/var/folders/6b/9xc3xm_944n6xhwc12_s2c7h0000gn/T/.arduinoIDE-unsaved2025214-42214-1iranv3.clms/sketch_mar14b/sketch_mar14b.ino:83:1: error: 'Error' does not name a type; did you mean 'perror'?
Error:
^~~~~
perror
exit status 1
Compilation error: no matching function for call to 'LiquidCrystal_I2C::begin()'
Заключительная мысль
Возможно, этот код очень старый и/или использует старую версию библиотеки (или её вариант), в которой функция begin() не принимает аргументов. Возможно, стоит попробовать найти альтернативную версию, хотя лучше всего исправить код для текущей библиотеки.
Спасибо, по крайней мере, ошибка больше не появляется. Но почему это не работает? Э: почему я не могу отправлять фотографии в комментариях? код: #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); void setup() { Serial.begin(115200); lcd.begin(16,2,LCD_5x8DOTS ); lcd.backlight(); } пустой цикл() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Напечатано"); задержка(1000); } VCC-5V Земля-земля ПДД-А4 SCL-A5, @user29682184
@user29682184 Поскольку это не форум, комментарии не предназначены для повторных (и, следовательно, новых) вопросов, а также для изображений или источников. Вы можете отредактировать свой вопрос, **добавив** часть, на которую ещё нет ответа. Возможно, вам будет интересно ознакомиться с [туром], чтобы узнать больше., @the busybee
Пожалуйста, **не** изменяйте вопрос, иначе он станет движущейся мишенью. Теперь, когда проблема с компиляцией устранена, этот вопрос закрыт. Новый вопрос, который вы видите, нужно задать как отдельный вопрос., @Greenonline
@thebusybee - лучше задать *новый* вопрос, поскольку изначальная проблема, которой был посвящен этот вопрос, была исправлена., @Greenonline
@user29682184 — Вы не можете публиковать изображения в комментариях. И, как вы заметили, код нечитаем. Это связано с тем, что раздел комментариев предназначен только для уточнений, а не для предоставления дополнительной информации. Комментарии со временем удаляются. Эта дополнительная информация (например, изображения и код) должна быть опубликована только в (новом) сообщении с вопросом, спасибо — новом, потому что на этот вопрос уже был дан ответ: см. [один вопрос в сообщении](https://meta.stackexchange.com/q/222735/280335), пожалуйста. Однако, пожалуйста, [не публикуйте скриншоты вывода консоли или кода](https://idownvotedbecau.se/imageofcode)., @Greenonline
- Что мне делать с StackOverflow при ошибке компиляции?
- Сообщение об ошибке - Нужна помощь
- Используйте 2 DHT22 и передайте данные на SD. Данные файла ошибок не существуют.
- Я получаю сообщение об ошибке?
- Ошибка: expected unqualified-id before 'if'
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Невозможно преобразовать «String» в «uint8_t {aka unsigned char}» при инициализации
- Ошибка компиляции кода для Arduino/Genuino Uno
Где находится файл
LiquidCrystal_I2C.h? Установлена ли у вас библиотекаLiquidCrystal_I2C? Что произойдёт, если вы попытаетесь скомпилировать её в Arduino IDE для проверки работоспособности? Кстати, сообщение о недопустимом заголовочном файле — это общий ответ на вызов функции или конструктора в вашем скетче, не соответствующий заголовочному файлу библиотеки. Вероятно, вы неправильно вызываете что-то вLiquidCrystal_I2C., @Greenonline... как lcd.begin(), который должен быть
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );, @Greenonlineпожалуйста, добавьте все сообщение от компилятора... оно должно быть намного шире, чем «недопустимый заголовочный файл», @jsotola
jstola>нет, это все, что есть, @user29682184
@jsotola - [Это довольно *краткое* сообщение](https://europe1.discourse-cdn.com/arduino/original/4X/f/9/9/f994106b62f56d5255f9ab27e88626c2dd5bcc4f.png), к сожалению..., @Greenonline