Ethernet и OLED (uint8_t в String)

w1ld32
Offline
Зарегистрирован: 25.03.2018

Совсем не давно начал изучать платформу. Извините зарание за глупый вопрос.

По сути проекта надо вывести всю лан инфу на олед дисплей, в библиотеке EtherCard получить всю эту инфу непроблема, но она хранится в переменной типа uint8_t, дисплей на прямую вывести эту инфу не умеет. Все мои попытки перевести в читаемый вид для дисплея, ничем не увенчались успехом. Прошу вашей помощи и совета. Спасибо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чукча не читатель, чукча писатель?

Каждый день кто-нибудь из старожилов форума объясняет новичкам, как нужно оформить тему, чтобы иметь возможность получить ответ по существу.

Неужели так трудно прежде, чем создавать тему, прочесть все посты хотя бы за посление сутки?

w1ld32
Offline
Зарегистрирован: 25.03.2018

Я просмотрел первые 8-10 страниц форума, ничего подходящего, не обнаружил. Поиск тоже искомых результатов не дал, поэтому решил описать свою проблему таким образом, в надежде напомощь)

motor
Offline
Зарегистрирован: 03.11.2017

Вы бы написали какие типы данных нужны дисплею, ну или кусок кода откуда взять данные и куда надо отправить

w1ld32
Offline
Зарегистрирован: 25.03.2018
#include <EtherCard.h>
#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[500];
static uint32_t timer;

// called when a ping comes in (replies to it are automatic)
static void gotPinged (byte* ptr) {
  ether.printIp(">>> ping from: ", ptr);
}

void setup () {
  myOLED.begin();
  myOLED.setFont(SmallFont);

  
  Serial.begin(57600);
  Serial.println("\n[pings]");
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));
    ether.printIp("IP:  ", ether.myip);
    ether.printIp("GW:  ", ether.gwip);
    Serial.println("========================");  //разделитель
    Serial.println(ether.gwip);
 }

Вот такой код - Соответсвенно ошибка : call of overloaded 'println(uint8_t [4])' is ambiguous

на 32 строке.

sadman41
Offline
Зарегистрирован: 19.10.2016

Может вот так пройдет:   Serial.println((IPAddress) ether.gwip);

Только не забывайте сделать #include <IPAddress.h>
w1ld32
Offline
Зарегистрирован: 25.03.2018

Да в случае с Serial.println это сработало, я там в коде немного забыл исправить (что бы не мучить дисплей выводил строку в порт), а надо на олед дисплей. Такая конструкция не работает 

 myOLED.print((IPAddress) ether.gwip, LEFT, 24);
    myOLED.update();

и плюс в этом же скетче выводится и другая информация, тоже в формате uint8_t 

в целом по сути мне нужно один из примеров библиотеки EthernetCard - pings переработать вывод всей инфы не на ком порт, а на олед дисплей. Я хоть и не долго занимаюсь ардуиной но не предполагал, что это вызовет столько разных проблем)

sadman41
Offline
Зарегистрирован: 19.10.2016

А в чем нет проблем? С чем вы сравниваете опенсорцную Ардуину - с коммерческими продуктами или с чем-то сферически-вакуумным? Так попробуйте на ассемблере пописать, к примеру...

Никто вам не мешает написать свою реализацию формирования строчки с ip адресом и остальным. Хотя-бы через snprintf() тот же.

w1ld32
Offline
Зарегистрирован: 25.03.2018

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

Serega66
Offline
Зарегистрирован: 23.03.2018

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

sadman41
Offline
Зарегистрирован: 19.10.2016

w1ld32 пишет:
Ещё из курса с++ в инсте помню преобразование переменных вида IntToStr думал с этой переменной будет что то похожее. Вот и возникают проблемы, идеи есть, а реализовать не могу (

В данном случае вы имеете дело не с Int, а с четырехбайтовым массивом (объект IPAddress), в каждом элементе которого хранится октет ip-адреса. И Serial его печатает не волшебным способом или преобразуя во что-то, а только потому, что у него есть реализация функции println для IPAddress. И там очень незамысловато делается что-то типа: print(addr[0]); print('.');  print(addr[1]); print('.');  print(addr[2]); print('.');  print(addr[3]); 

Можете точно так же написать функцию, которая будет фигачить на OLED таким же способом любой объект IPAddress или uint8_t[4].