qMenuSystem Oled I2C не может заставить его работать

Я пытаюсь заставить qMenuSystem работать с моим монохромным OLED-дисплеем I2C, но безуспешно. Подводя итог, вот что с ним: - qMenuSystem использует библиотеку под названием: DigoleSerial, но в ней установлено соединение SPI. - сама библиотека может работать с I2C, но я получаю странные ошибки вроде этой:

Arduino: 1.8.9 (Mac OS X), плата: «Arduino/Genuino Uno»

TestMenu: 25:42: ошибка: ожидаемое основное выражение перед '_disp'
DigoleSerialDisp mydisp=DigoleSerialDisp _disp(&Wire,'\x3C');
^
статус выхода 1
ожидаемое основное выражение перед '_disp'

Вот видео того, что я пытаюсь отобразить:

https://www.youtube.com/watch?v=rjON_enuOGs (я уже попробовал то, что было предложено в комментариях)

Вот код на данный момент:


Arduino: 1.8.9 (Mac OS X), Board: "Arduino/Genuino Uno"

TestMenu:25:42: error: expected primary-expression before '_disp'
 DigoleSerialDisp mydisp=DigoleSerialDisp _disp(&Wire,'\x3C');
                                          ^
exit status 1
expected primary-expression before '_disp'

и программная часть:

#define _Digole_Serial_I2C_
#include <DigoleSerial.h>
#include <Wire.h>

#include <qMenuDisplay.h>
#include <qMenuSystem.h>

#include "TestMenu.h"

//DigoleSerialDisp mydisp=DigoleSerialDisp(8,9,10);
//DigoleSerialDisp _disp(&Wire,'\x3C');

DigoleSerialDisp mydisp=DigoleSerialDisp _disp(&Wire,'\x3C');
qMenuSystem menu=qMenuSystem(mydisp);

void setup()
{
  menu.InitMenu(mnuRoot,cntRoot,1);
  Serial.begin(9600);
}

void loop()
{
  int keycode=0;
  int clickedItem=0; 

  if (Serial.available()>0)
  {
    switch(Serial.read())
    {
      case 97:
        menu.ProcessMenu(ACTION_DOWN);
        break;
      case 113:
        menu.ProcessMenu(ACTION_UP);
        break;
      case 115:
        clickedItem=menu.ProcessMenu(ACTION_SELECT);
        break;
    }
  }

  if (clickedItem>0)
  {
    // Logic for Root menu
    if (menu.CurrentMenu==mnuRoot)
      switch (clickedItem)
      {
        case 1:
          menu.InitMenu(mnuSubmenu1,cntSubmenu1,1);
          break;
        case 2:
          menu.InitMenu(mnuSubmenu2,cntSubmenu2,1);
          break;
        case 3:
          menu.InitMenu(mnuSubmenu3,cntSubmenu3,1);
          break;
        case 4:
          menu.MessageBox("Some message!");
          break; 
      }
    // Logic for Submenu 1
    else if (menu.CurrentMenu==mnuSubmenu1)
      switch (clickedItem)
      {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
          menu.MessageBox("Item clicked");
          break;
        case 6:
          menu.InitMenu(mnuRoot,cntRoot,1);
          break;
      }
    // Logic for Submenu 2
    else if (menu.CurrentMenu==mnuSubmenu2)
      switch (clickedItem)
      {
        case 1:
          menu.MessageBox("On");
          break;
        case 2:
          menu.MessageBox("Off");
          break;
        case 3:
          menu.InitMenu(mnuRoot,cntRoot,2);
          break;
      }
    // Logic for Submenu 3
    else if (menu.CurrentMenu==mnuSubmenu3)
      switch (clickedItem)
      {
        case 1:
          menu.MessageBox("Enabled");
          break;
        case 2:
          menu.MessageBox("Disabled");
          break;
        case 3:
          menu.InitMenu(mnuRoot,cntRoot,3);
          break;
      }

  } 
}

Я новичок и понятия не имею, как заставить его работать. Может ли кто-нибудь помочь мне понять, что не так?

Спасибо, что уделили время чтению всего этого.

, 👍0


1 ответ


Лучший ответ:

0

Как указывает компилятор, строка

DigoleSerialDisp mydisp=DigoleSerialDisp _disp(&Wire,'\x3C');

не работает.

Эта часть:

DigoleSerialDisp _disp(&Wire,'\x3C')

объявляет и создает объект с именем _disp класса DigoleSerialDisp.

Вы пытаетесь присвоить это другой переменной, mydisp — это недопустимо в C++ — вы можете присвоить другую переменную, но вам нужно сначала объявить и сконструировать ее, а не в присваивании . Также нет необходимости создавать его, называть его _disp и затем назначать его другой переменной.

Просто сделайте следующее:

DigoleSerialDisp mydisp(&Wire,'\x3C');

Возможно, вы захотите переписать

qMenuSystem menu=qMenuSystem(mydisp);

как

qMenuSystem menu(mydisp);

тоже.

,

Большое спасибо за ваше объяснение и за вашу помощь. Теперь компилируется без ошибок. Все хорошо, но на дисплее ничего не видно. Мой OLED работает хорошо, когда я использую библиотеку Adafruit SSD1306 с библиотекой Adafruit GFX, но я не знаю об этой библиотеке DigoleSerial. Вот мой OLED (вроде, он выглядит так же): https://bit.ly/2kgZa6p. Он использует адрес 0x3C, когда я использую библиотеки Adafruit. Это что-то, чего мне еще не хватает? Еще раз спасибо за быструю помощь., @h4x7o0r

Я рад, что это было полезно. Если у вас есть другой вопрос, лучше всего принять его как ответ на вопрос, который вы задали, и задать другой вопрос отдельно. Это поможет другим людям с похожими проблемами найти ответ на свою проблему, а другим людям, которые могут помочь вам с вашей следующей проблемой, найти вопрос и предложить помощь (они не найдут его здесь, в комментариях)., @romkey

Еще раз спасибо. Я новичок здесь, поэтому я действительно не знаю поток, но я понимаю. Задам новый вопрос в новой теме., @h4x7o0r

У тебя отлично получается :) Спасибо!, @romkey