Почему при использовании библиотеки 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:

Вывод SM — не та сборка, которая показана в посте!

Дополнительная информация

(не имеет значения для вопроса)

Кстати, код предназначен для измерения уровня воды и отображения данных на дисплее. После того, как я куплю оборудование и оно наконец-то будет отправлено, я добавлю ещё много всего (требуется MEGA2560 или даже DUE) -

Более сложная схема: устройство будет измерять уровень воды и температуру окружающей среды (возможно, даже самой воды). Оно будет включать/выключать водяной насос, используя схему моего отца для включения/выключения большого реле двумя кнопками, но вместо кнопок я буду использовать более мелкие реле для автоматизации. Я обеспечу отсутствие сбоев, используя состояние Arduino-off для насоса, равное 0, и две пары электродов или сумма, установленные на верхней части резервуара для воды. Когда цепь замкнётся из-за непредсказуемого уровня воды, программа остановит насос. Мне потребуется измерять и преобразовывать показания примерно 60 раз (добавление x литров воды = y увеличение счетчика), поскольку резервуар расположен горизонтально, что затрудняет вычисления. Мне нужно будет создать веб-сайт или сумму и отправлять на него данные (W5500), лог времени (RTC DS3231 I2C). И многое другое.

Если я не найду решения, мне, вероятно, придётся начать программировать на скорую руку раньше, чем я ожидал. Просто каждый день я нахожу компоненты лучше и больше для своего проекта, поэтому я либо подожду и закажу один раз, либо буду ждать и заказывать несколько раз. И при всём при этом я уверен, что всё равно пожалею о своих покупках.

, 👍1

Обсуждение

Где находится файл 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


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