Не компилитуется скетч

Тема в разделе "Arduino & Shields", создана пользователем Blackgeneral, 21 июл 2023.

  1. Blackgeneral

    Blackgeneral Нерд

    Всем доброго времени суток.

    Проблема: знакомый попросил посмотреть почему перестала работать программа. По его словам все началось после переустановки системы.
    Я предположил, что он просто не установил часть библиотек, но после установки нужных библиотек у меня файл также не компилировался и выдавал ошибку. Причем ошибку в void setup() !
    Пишет, что ошибка - несоответствие типов, но раз программа работала, то дело в библиотеке?
    Прочитал документацию на библиотеку - не нашел причину. Второй день голову ломаю.
    Есть такое подозрение, что под новую библиотеку нужно и код переписывать, но это только на уровне догадок.
    Прошу помощи или хотя бы подсказки.

    P.S.:Код публикую не весь , а как раз до void loop()

    P.P.S.: ошибка "invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]"
    в строке:
    Код (C++):
     lcd.createChar(S_U, sym_u);

    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <IRremote.h> // библиотека IR
    #include <FastLED.h>
    #include <Eeprom24C32_64.h>
    #include <SPI.h>
    #include <MFRC522.h>
    #include <uCRC16Lib.h>

    #define TIME_TO_HOLD_D6    500 // Время удержания D6 при нажатии цветных кнопок в режиме 7L в (мс)

    #define RST_PIN           9           // Configurable, see typical pin layout above
    #define SS_PIN            10          // Configurable, see typical pin layout above

    #define COUNT_REGISTR   2 // количество регистров
    #define beepPin     8
    #define powerPin    6
    #define syncPin     15
    #define RECV_PIN    17
    #define CE_PIN      5
    #define DATA_PIN    4
    #define SHLD_PIN    3
    #define CLK_PIN     2
    #define LED_PIN     16 // нога 25(А2)

    #define NUM_LEDS 1

    #define DS3231_I2C_ADDRESS  0x68
    #define PCF8574_I2C_ADDRESS 0x20
    #define EEPROM_ADDRESS      0x57

    #define TA_RESET_SECONDS  1
    #define TA_INC_MINUTES    2

    #define EEPROM_BLOCK_SIZE   8 // Размер одного блока хранения RFID карты
    #define ERROR_WRITE     -1
    #define ERROR_NO_SPACE    -2

    #define EEPROM_MAX_POS    300 // Кол-во хранимых в EEPROM RFID карт
    #define EEPROM_FREE_MARKER  0xFF
    #define EEPROM_INIT_MARKER  0x14031975

    #define PRIORITY_CODE   111

    // Список режимов
    #define MODE_C        0
    #define MODE_Z        1
    #define MODE_B        2
    #define MODE_P        3
    #define MODE_F        4
    #define MODE_R        5
    #define MODE_L        6
    #define MODE_CODE     7
    #define MODE_START_STOP   8
    #define MODE_RFID     9

    #define MAX_MODE      MODE_RFID

    // Коды ИК кнопок
    #define KEY_CHM       0xA25D
    #define KEY_CHP       0xE21D
    #define KEY_CH        0x629D
    #define KEY_REW       0x22DD
    #define KEY_FF        0x02FD
    #define KEY_PLAY      0xC23D
    #define KEY_PLUS      0xA857
    #define KEY_MINUS     0xE01F
    #define KEY_100P      0x9867
    #define KEY_200P      0xB04F
    #define KEY_0       0x6897
    #define KEY_EQ        0x906F

    // Коды сенсорной клавиатуры
    #define SKEY_GREEN      12
    #define SKEY_BLUE     13
    #define SKEY_YELLOW     14
    #define SKEY_X        10
    #define SKEY_H        11

    #define MAX_KEY       SKEY_GREEN

    // Задание пользовательских символов
    #define SYM_HEIGHT 8

    #define S_L     0
    #define S_BI    1
    #define S_I     2
    #define S_J     3
    #define S_GH    4
    #define S_P     5
    #define S_D     6
    #define S_U     7

    const byte sym_l[SYM_HEIGHT] = {  B00111, B01001, B01001, B01001, B01001, B01001, B10001, B00000 };
    const byte sym_bi[SYM_HEIGHT] = { B10001, B10001, B10001, B11001, B10101, B10101, B11001, B00000 };
    const byte sym_i[SYM_HEIGHT] = { B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    const byte sym_j[SYM_HEIGHT] = { B10101, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    const byte sym_gh[SYM_HEIGHT] = { B10101, B10101, B01110, B00100, B01110, B10101, B10101, B00000 };
    const byte sym_p[SYM_HEIGHT] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 };
    const byte sym_d[SYM_HEIGHT] = { B00110, B01010, B01010, B01010, B01010, B01010, B11111, B10001 };
    const byte sym_u[SYM_HEIGHT] = { B10001, B10001, B10001, B01111, B00001, B00001, B01110, B00000 };

    const char ModeNames [7][2][4] = {{"1CK", "1CM"}, {"2ZK", "2ZM"}, {"3BK", "3BM"}, {"4PK", "4PM"}, {"5FK", "5FM"}, {"6RK", "6RM"}, {"7LK", "7LM"}};
    const byte SensKeys[16] = {8, 9, SKEY_H, 0, 7, SKEY_BLUE, SKEY_X, SKEY_YELLOW, 2, 3, 6, 5, 15, SKEY_GREEN, 1, 4 };


    typedef struct
    {
      byte group;
      byte count;
      byte data[7];
      uint16_t crc;
    } RfIdStruct;

    typedef struct
    {
      // Последовательность полей имеет значение в алгоритме
      byte hour;
      byte minute;
      byte sec;
    } TimeStruct;

    typedef struct
    {
      int8_t hour;
      int8_t minute;
      int8_t second;
      int8_t p_min;
      int8_t p_sec;
      int8_t delta;
      int8_t z_counter;
    } CounterStruct;

    LiquidCrystal_I2C lcd(0x27, 20, 4); // адрес LCD - 0x27 для PCF8574  и 0x3F для PCF8574A
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
    MFRC522::MIFARE_Key rdKey;
    MFRC522::MIFARE_Key wrKey;
    char strTime[11];
    CRGB leds[NUM_LEDS];
    static Eeprom24C32_64 eeprom(EEPROM_ADDRESS);
    int pinValues;     // текущее значение пинов
    int oldPinValues;  // предыдущее значение пинов
    byte outTimeH, outTimeL;
    uint32_t reqTime = 0;
    uint32_t keybTime = 0;
    uint32_t irTime = 0;
    uint8_t seccState = 0;
    uint32_t secondCounter = 0; // Счетчик секунд по входу SQW
    int timeAction = 0;
    long lastRfId = 0;
    long buzTime;
    long lastReadTime = 0;
    long sevenTime = -30000;
    byte timeChangeScr = 0;
    byte pcfData = 0;
    RfIdStruct rfid1, rfid2;
    int cMode = MODE_C;
    byte subMode = 0;
    TimeStruct ssTime[2];
    TimeStruct cTime;
    int EditPos = 0;
    byte isEdit = 0;
    int Code[3] = { 999, 999, 999};
    CounterStruct Counters[3];
    CounterStruct sCount[3];
    const int Decade[5] = {1, 10, 100, 1000, 10000 };
    byte Sequence[EEPROM_MAX_POS];
    int seqCounter = 0;
    byte cGroup = 0;
    byte buzzer = 0;
    int maxRfId = 0;
    byte accept = 0;
    byte endCount = 0;
    int CodeKeeper = 0;
    int ModeKeeper = -1;
    int CodeCounter = 0;
    byte mfTime[7];
    byte lastSec = 0;
    byte flag = 0;
    byte BlockKeyb = 0;

    void setup(){
    FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
      Wire.begin();
      lcd.begin();
      lcd.createChar(S_L, sym_l);
      lcd.createChar(S_BI, sym_bi);
      lcd.createChar(S_I, sym_i);
      lcd.createChar(S_J, sym_j);
      lcd.createChar(S_GH, sym_gh);
      lcd.createChar(S_P, sym_p);
      lcd.createChar(S_D, sym_d);
      lcd.createChar(S_U, sym_u);
      }


    void loop()
    {
    }
     
  2. KindMan

    KindMan Гуру

    А вы смотрели любой пример, где используется функция createChar?
    Код (C++):
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(11, 12, 2, 3, 4, 5);

    byte smiley[8] = {
      B00000,
      B10001,
      B00000,
      B00000,
      B10001,
      B01110,
      B00000,
    };

    void setup() {
      lcd.createChar(0, smiley);
      lcd.begin(16, 2);
      lcd.write(byte(0));
    }

    void loop() {}
     
    Вот, например. И сравните со своим.
    И компилятор вам сразу описывает ошибку.
     
  3. Blackgeneral

    Blackgeneral Нерд

    Спасибо, но остались вопросы по Вашему пояснению.

    Смотрел. В разных библиотеках LiquidCrystal_I2C.
    Если Вы про "lcd.begin(16, 2);"
    то одних библиотеках (я их перебрал с 4 источников), lcd.begin() описывается без параметров, в других - как написали Вы - с параметрами. Пробовал и так и так на разных библиотеках. Ошибка не уходит.

    В Вашем примере вижу "lcd.write(byte(0));" на это пока не обратил внимание.

    Да, я вижу, что запись
    const byte sym_l[SYM_HEIGHT] и
    byte smiley[8]

    отличаются.

    но если человек говорил, что все работало...? Это из-за обновления версии библитеки?
     
  4. parovoZZ

    parovoZZ Гуру

    Функция ждёт переменную, а передаётся константа. Разумеется, это компилятор не пропустит.
     
  5. Blackgeneral

    Blackgeneral Нерд

    Спасибо. Были такие подозрения, но "останавливало" то, что человек утверждал, что код был рабочий.
    Т.е. я правильно понимаю, что если утверждение "код раньше работал" верно, то из-за обновления библиотек нужно переписывать весь код? Или по крайней мере проверять?
     
  6. parovoZZ

    parovoZZ Гуру

    А что мешает использовать ту библиотеку, под которую написан код?
     
    DetSimen нравится это.
  7. Blackgeneral

    Blackgeneral Нерд

    Человек переустановил систему и библиотеки, соответственно не сохранил.
    Потом при попытке запустить скетч на новой системе получил ошибку компиляции из-за "ругни" IDE на отсутствие библиотеки FastLED.
    Я ему подсказал как ее установить. Далее случилось то, что я описал выше.
    Я попробовал найти ему "его" библиотеку "LiquidCrystal_I2C" (как я понимаю, пока проблема состыковки с ней), но ничего не подошло.
    Вот я теперь пытаюсь разобраться, как действовать дальше:
    1. Или можно немного подправить код и все заработает.
    2. Или посоветовать ему искать разработчика (т.к. разбираться в более чем 1000 строк чужого кода у меня те так много времени)
     
  8. b707

    b707 Гуру

    У меня такое впечатление, что вы понимаете в программировании едва ли больше трехлетнего ребенка. К чему эти досужие рассуждения о несоответствии библиотек? Компилятор вам четко описал ошибку - не тот тип массива. Ошибка плевая, правится за 20 секунд и НИКАКОГО отношения к библиотеке не имеет
     
    Vovka и DetSimen нравится это.
  9. b707

    b707 Гуру

    вовсе необязательно. При переустановке системы переустановили и Ардуино ИДЕ, поставили другую версию с другими настройками. Один и тот же код с точно теми же библиотеками в одной версии Ардуино ИДЕ может компилироваться без ошибок, а в другой - не компилироваться вовсе.
     
    Vovka и DetSimen нравится это.
  10. Blackgeneral

    Blackgeneral Нерд

    Возможно в программировании я и понимаю меньше Вашего, но в любом случае я пытаюсь разобраться. И именно поэтому " грешил" на библиотеку, т.к. с таким поведением IDE , как Вы описали, сталкиваюсь впервые.
    P.S.: массивы в ардуино для меня также новая тема, в которой только начинаю разбираться.
     
  11. b707

    b707 Гуру

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

    Но далее компилятор может действовать по разному - он может выдать предупреждение и скомпилировать код, а может сгенерить ошибку. Это зависит даже не от самой ИДЕ, а от настроек компилятора.

    Вероятно ранее этот код компилировался с предупреждениями, а теперь не компилируется вовсе. Это нормально и в этом нет ничего страшного, если вы умеете читать, что вам говорит компилятор.
     
    DetSimen нравится это.
  12. parovoZZ

    parovoZZ Гуру

    это специально так сделано? В нормальных средах программирования все настройки лежат в папке с проектом и при переносе хоть с виндовс, хоть с линух, хоть с лысой горы, всё компилируется вообще без проблем.
     
  13. parovoZZ

    parovoZZ Гуру

    а компилятор говорит:
    1. Преобразовать константу в переменную
    или
    2. Собрать код с флагом -fpermissive
     
  14. b707

    b707 Гуру

    нет, просто по безалаберности
     
  15. Blackgeneral

    Blackgeneral Нерд

    "Хозяин" кода говорит, что все было нормально: компилировался без предупреждений.

    Вот это , по сути, я и хотел выяснить в конечном итоге, т.к. раз это так, то пусть человек ищет кто ему поможет с ним.
    Мне не хочется браться за чужой код, а потом, если что-то не заработает как надо, то собирать "шишки".

    Да, это я прочитал. Но как я уже писал выше ко мне вопрос изначально был об ошибке установки библиотек. С кодом ошибка вылезла позже.
    Просто ошибка показалась странной (если верить тому, что все ранее работало и компилировалось).
    Думал, что ошибка из-за версии библиотек и решение "на поверхности".

    Всем спасибо за помощь!!!
     
  16. User248

    User248 Гик

    У меня не появляется ошибка преобразования типа. Наверно, от версии IDE зависит. Убрать все const'ы и нет проблем.

    Тут ещё и в другом проблема. В библиотеке дисплея LiquidCrystal_I2C нет функции begin(). Такая функция используется в библиотеке LiquidCrystal.
    Код (C++):
    void setup(){
      lcd.begin();
    Нужно поменять на init():
    Код (C++):
    void setup(){
      lcd.init();
     
  17. Blackgeneral

    Blackgeneral Нерд

    Я нашел библиотеку LiquidCrystal I2C в которой есть именно begin(), но и с ней не заработало.
    Пробовал и так: тоже выдавало ошибку.
     
  18. User248

    User248 Гик

    Если ошибка связана с преобразованием типов, то конечно никуда не исчезнет. Нужно убрать все const'ы.
    Код (C++):

    const byte sym_l[SYM_HEIGHT] = {  B00111, B01001, B01001, B01001, B01001, B01001, B10001, B00000 };
    const byte sym_bi[SYM_HEIGHT] = { B10001, B10001, B10001, B11001, B10101, B10101, B11001, B00000 };
    const byte sym_i[SYM_HEIGHT] = { B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    const byte sym_j[SYM_HEIGHT] = { B10101, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    const byte sym_gh[SYM_HEIGHT] = { B10101, B10101, B01110, B00100, B01110, B10101, B10101, B00000 };
    const byte sym_p[SYM_HEIGHT] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 };
    const byte sym_d[SYM_HEIGHT] = { B00110, B01010, B01010, B01010, B01010, B01010, B11111, B10001 };
    const byte sym_u[SYM_HEIGHT] = { B10001, B10001, B10001, B01111, B00001, B00001, B01110, B00000 };
     
    Вот так:
    Код (C++):

    byte sym_l[SYM_HEIGHT] = {  B00111, B01001, B01001, B01001, B01001, B01001, B10001, B00000 };
    byte sym_bi[SYM_HEIGHT] = { B10001, B10001, B10001, B11001, B10101, B10101, B11001, B00000 };
    byte sym_i[SYM_HEIGHT] = { B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    byte sym_j[SYM_HEIGHT] = { B10101, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };
    byte sym_gh[SYM_HEIGHT] = { B10101, B10101, B01110, B00100, B01110, B10101, B10101, B00000 };
    byte sym_p[SYM_HEIGHT] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 };
    byte sym_d[SYM_HEIGHT] = { B00110, B01010, B01010, B01010, B01010, B01010, B11111, B10001 };
    byte sym_u[SYM_HEIGHT] = { B10001, B10001, B10001, B01111, B00001, B00001, B01110, B00000 };
     
     
  19. Blackgeneral

    Blackgeneral Нерд

    Константы убрал когда нашел библиотеку с begin(). Ошибка сместилась куда-то в район 900 строки (не помню точно), но осталась такая же: ошибка типов - "invalid conversion from 'const byte* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]"
    Именно поэтому посоветовал владельцу файла все же найти разработчика и общаться с ним, т.к. как я уже понял, нужно изучать работу кода + работу самого устройства, а на это я свободным временем не располагаю.
     
  20. User248

    User248 Гик

    Значит, нужно убрать оствшиеся const'ы:
    Код (C++):
    const char ModeNames [7][2][4] = {{"1CK", "1CM"}, {"2ZK", "2ZM"}, {"3BK", "3BM"}, {"4PK", "4PM"}, {"5FK", "5FM"}, {"6RK", "6RM"}, {"7LK", "7LM"}};
    const byte SensKeys[16] = {8, 9, SKEY_H, 0, 7, SKEY_BLUE, SKEY_X, SKEY_YELLOW, 2, 3, 6, 5, 15, SKEY_GREEN, 1, 4 };