Как настроить матричный светодиодный дисплей 8 * 8 с помощью этого кода?

Я делаю тикер криптовалюты, используя NodeMCU ESP8266, и пока у меня есть этот код, я не знаю, как настроить точечную матрицу, состоящую из 4 сегментов по 8 * 8 каждый с этим конкретным кодом. Единственное, что мне нужно, это коррекция, это инициализация дисплея.

Вот код:

/*************************************************** *************************
Проект для отображения цен на криптовалюту с использованием ESP8266.

Основное оборудование:
- Плата разработки NodeMCU (подойдет любая плата разработки ESP8266)
- матричный светодиод 4 сегмента 8*8

Автор Брайан Лох
https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA
******************************************************* *****************/

// -------------------------------------------
// Стандартные библиотеки — уже установлены, если у вас настроен ESP8266
// -------------------------------------------

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <Wire.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#define MATRIX32
#include  <SPI.h>

// -------------------------------------------
// Дополнительные библиотеки — необходимо установить каждую из них.
// -------------------------------------------

#include <CoinMarketCapApi.h>
// Для интеграции с API CoinMarketCap.com
// Доступно в менеджере библиотек (ищите «CoinMarket»)
// https://github.com/witnessmenow/arduino-coinmarketcap-api

//# включаем "SH1106.h"
// Драйвер для OLED-дисплея
// Доступно в менеджере библиотек (ищите "oled ssd1306")
// https://github.com/squix78/esp8266-oled-ssd1306

#include <ArduinoJson.h>
// !! ПРИМЕЧАНИЕ !!: При установке выберите более старую версию, чем V6, из раскрывающегося списка.
// Требуется библиотеке CoinMarketCapApi для разбора ответа
// Доступно в менеджере библиотек (ищите «arduino json»)
// https://github.com/squix78/esp8266-oled-ssd1306


// -------------------------------------------
// Конфигурации — обновить их
// -------------------------------------------

char ssid[] = "rum1";       // SSID вашей сети (имя)
char password[] = "@@mywifi34@@";  // ваш сетевой ключ

// Пины на основе вашей проводки
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA PIN 11
#define CS_PIN 10

//#определить SCL_PIN D5
//#определить SDA_PIN D4

// Лимит CoinMarketCap — «не более 10 в минуту»
// Обязательно учитывайте, запрашиваете ли вы более одной монеты.
// Мы запросим новое значение непосредственно перед изменением экрана, чтобы он был самым актуальным
unsigned long screenChangeDelay = 10000; // Каждые 10 секунд

// Протестировано до 10, вероятно, можно сделать больше
#define MAX_HOLDINGS 10

#define CURRENCY "eur" // См. CoinMarketCap.com для вариантов валюты (доллары США, фунты стерлингов и т. д.)
#define CURRENCY_SYMBOL "E" // евро не работает, $ и £ работают

// Вам также необходимо добавить свои криптовалюты в функцию настройки

// -------------------------------------------
// Конец области, которую нужно изменить
// -------------------------------------------


WiFiClientSecure client;
CoinMarketCapApi api(client);

display.begin(CS_PIN, MAX_DEVICES);

MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);

//MD_Parola.h display(0x3c, SDA_PIN, SCL_PIN);

unsigned long screenChangeDue;

struct Holding {
  String tickerId;
  float amount;
  bool inUse;
  CMCTickerResponse lastResponse;
};

Holding holdings[MAX_HOLDINGS];

int currentIndex = -1;
String ipAddressString;

void addNewHolding(String tickerId, float amount = 0) {
  int index = getNextFreeHoldingIndex();
  if (index > -1) {
    holdings[index].tickerId = tickerId;
    holdings[index].amount = amount;
    holdings[index].inUse = true;
  }
}

void setup() {

  Serial.begin(115200);

  // -------------------------------------------
  // Holdings — добавьте сюда свои валюты
  // -------------------------------------------
  // Перейти на страницу валют coinmarketcap.com
  // и берем тикер из URL-адреса (в качестве примера используйте биткойн или эфириум)

  addNewHolding("bitcoin");
  addNewHolding("dogecoin");
  addNewHolding("ethereum");

  // -------------------------------------------
  // Все, что ниже, можно придумать, если хотите, но оно должно работать как есть!
  // -------------------------------------------

  // Инициализация дисплея
  display.init();
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.setFont(ArialMT_Plain_16);
  display.drawString(64, 0, F("HODL Display"));
  display.setFont(ArialMT_Plain_10);
  display.drawString(64, 18, F("By Brian Lough"));
  display.display();


  // Установить WiFi в режим станции и отключиться от точки доступа, если она была ранее
  // связанный
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Попытка подключиться к сети Wi-Fi:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);
  ipAddressString = ip.toString();
}

int getNextFreeHoldingIndex() {
  for (int i = 0; i < MAX_HOLDINGS; i++) {
    if (!holdings[i].inUse) {
      return i;
    }
  }

  return -1;
}

int getNextIndex() {
  for (int i = currentIndex + 1; i < MAX_HOLDINGS; i++) {
    if (holdings[i].inUse) {
      return i;
    }
  }

  for (int j = 0; j <= currentIndex; j++) {
    if (holdings[j].inUse) {
      return j;
    }
  }

  return -1;
}

void displayHolding(int index) {

  CMCTickerResponse response = holdings[index].lastResponse;

  display.clear();

  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.setFont(ArialMT_Plain_16);
  display.drawString(64, 0, response.symbol);
  display.setFont(ArialMT_Plain_24);
  double price = response.price_currency;
  if (price == 0) {
    price = response.price_usd;
  }
  display.drawString(64, 20, formatCurrency(price));
  display.setFont(ArialMT_Plain_16);
// display.setTextAlignment(TEXT_ALIGN_CENTER);
// display.drawString(64, 48, " 1h:" + String(response.percent_change_1h) + "%");
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(64, 48, "24h: " + String(response.percent_change_24h) + "%");

  display.display();
}

void displayMessage(String message){
  display.clear();
  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawStringMaxWidth(0, 0, 128, message);
  display.display();
}

String formatCurrency(float price) {
  String formattedCurrency = CURRENCY_SYMBOL;
  int pointsAfterDecimal = 6;
  if (price > 100) {
    pointsAfterDecimal = 2;
  } else if (price > 1) {
    pointsAfterDecimal = 4;
  }
  formattedCurrency.concat(String(price, pointsAfterDecimal));
  return formattedCurrency;
}

bool loadDataForHolding(int index) {
  int nextIndex = getNextIndex();
  if (nextIndex > -1 ) {
    holdings[index].lastResponse = api.GetTickerInfo(holdings[index].tickerId, CURRENCY);
    return holdings[index].lastResponse.error == "";
  }

  return false;
}

void loop() {
  unsigned long timeNow = millis();
  if ((timeNow > screenChangeDue))  {
    currentIndex = getNextIndex();
    if (currentIndex > -1) {
      if (loadDataForHolding(currentIndex)) {
        displayHolding(currentIndex);
      } else {
        displayMessage(F("Error loading data."));
      }
    } else {
      displayMessage(F("No funds to display. Edit the setup to add them"));
    }
    screenChangeDue = timeNow + screenChangeDelay;
  }
}

А вот и ошибка:

crytodisplayDraft1:82:1: error: 'display' does not name a type

 display.begin(CS_PIN, MAX_DEVICES);

 ^

C:\Users\SUDU0005\Documents\Arduino\crytodisplayDraft1\crytodisplayDraft1.ino: In function 'void setup()':

crytodisplayDraft1:130:3: error: 'display' was not declared in this scope

   display.init();

   ^

crytodisplayDraft1:131:28: error: 'TEXT_ALIGN_CENTER' was not declared in this scope

   display.setTextAlignment(TEXT_ALIGN_CENTER);

                            ^

crytodisplayDraft1:132:19: error: 'ArialMT_Plain_16' was not declared in this scope

   display.setFont(ArialMT_Plain_16);

                   ^

crytodisplayDraft1:134:19: error: 'ArialMT_Plain_10' was not declared in this scope

   display.setFont(ArialMT_Plain_10);

                   ^

C:\Users\SUDU0005\Documents\Arduino\crytodisplayDraft1\crytodisplayDraft1.ino: In function 'void displayHolding(int)':

crytodisplayDraft1:191:3: error: 'display' was not declared in this scope

   display.clear();

   ^

crytodisplayDraft1:193:28: error: 'TEXT_ALIGN_CENTER' was not declared in this scope

   display.setTextAlignment(TEXT_ALIGN_CENTER);

                            ^

crytodisplayDraft1:194:19: error: 'ArialMT_Plain_16' was not declared in this scope

   display.setFont(ArialMT_Plain_16);

                   ^

crytodisplayDraft1:196:19: error: 'ArialMT_Plain_24' was not declared in this scope

   display.setFont(ArialMT_Plain_24);

                   ^

C:\Users\SUDU0005\Documents\Arduino\crytodisplayDraft1\crytodisplayDraft1.ino: In function 'void displayMessage(String)':

crytodisplayDraft1:212:3: error: 'display' was not declared in this scope

   display.clear();

   ^

crytodisplayDraft1:213:19: error: 'ArialMT_Plain_10' was not declared in this scope

   display.setFont(ArialMT_Plain_10);

                   ^

crytodisplayDraft1:214:28: error: 'TEXT_ALIGN_LEFT' was not declared in this scope

   display.setTextAlignment(TEXT_ALIGN_LEFT);

                            ^

Multiple libraries were found for "Wire.h"
 Använd: C:\Users\SUDU0005\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\libraries\Wire
Oanvänd: C:\Users\SUDU0005\Documents\Arduino\libraries\Wire
exit status 1
'display' does not name a type

Итак, как мне настроить дисплей?

, 👍-1

Обсуждение

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

//#include "SH1106.h" это комментарий, @Juraj

Разве он не используется только для OLED-дисплеев? У меня матричный светодиод., @iamsumitd

тогда почему вы спрашиваете об «ошибке:« дисплей »не называет тип»?, @Juraj

Это ошибка, выдаваемая компилятором, и он запрашивает тип дисплея, поскольку я не упомянул об этом, что является частью моего вопроса., @iamsumitd


1 ответ


1

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

 Main Hardware:
- NodeMCU Development Board (Any ESP8266 dev board will work)
- **OLED I2C Display (SH1106)**

У вас матричный дисплей с чипом MAX7219 (скорее всего), который использует для работы совсем другую библиотеку. Микроконтроллеры не такие, как ПК, если вы меняете дисплей, вы должны серьезно переработать код. Весь код, такой как display.something(), должен быть переписан. MD_Parola, похоже, является библиотекой для взаимодействия с вашим точечно-матричным дисплеем. Вы создаете экземпляр объекта этой библиотеки: MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);, но затем никогда нигде не используете созданный объект P (к тому же это плохое имя для объекта . display или matrix гораздо лучше). Вместо этого код использует объект display, который никогда не создается — именно это и пытается вам сказать компилятор:

error: 'display' was not declared in this scope

Итак. Подводя итог: чтобы изменить свой код, вы должны изучить MD_Parola lib и серьезно изменить все функции, связанные с отображением. Очевидно, что это выходит за рамки простого вопроса...

,

Я вижу вашу точку зрения. Не могли бы вы дать мне ссылку на некоторые документы, где я могу узнать, как настроить матричный дисплей с помощью MD_Parola или MAX7219, я перепробовал много ссылок в Google, но они, похоже, не привели меня ни к чему полезному., @iamsumitd

Эта библиотека размещена здесь: https://github.com/MajicDesigns/MD_Parola. Кажется, он хорошо документирован и имеет много примеров. Начните с них, посмотрите, правильно ли вы понимаете проводку и основные функции. В качестве альтернативы попробуйте эту библиотеку от известного Ника Гаммона: https://github.com/nickgammon/MAX7219. Или подумайте о покупке OLED-дисплеев, они очень красиво смотрятся, даже китайские. В любом случае, не пытайтесь сразу создать огромную программу, вместо этого протестируйте ее по пунктам (WiFi, дисплей и т. д. - все по отдельности. Если вы считаете, что мой ответ был полезен, отметьте его как принятый., @Zhenek

Это информативно, но бесполезно для меня. Я только что прочитал все это - https://majicdesigns.github.io/MD_MAX72XX/index.html и могу думать только о замене существующего кода, относящегося к тем же функциям, таким как display.setFont(); Кроме того, я хочу сделать это только с использованием светодиода с точечной матрицей, OLED выглядит красиво, но он довольно маленький, а большой просто не стоит того., @iamsumitd

Ну нельзя ждать, что кто-то напишет за вас прошивку) На этом сайте можно получить подсказку или направление куда смотреть дальше, но скорее всего не готовое решение. Удачи!, @Zhenek