Как настроить матричный светодиодный дисплей 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
Итак, как мне настроить дисплей?
@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
- Как прокручивать текст на OLED-дисплее, используя только библиотеку SSD1306Wire?
- HD44780 отображает неправильно черный на синем вместо белого на синем
- ESP32 WROOM 32 Проблемы с SPI EMF
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
включает ли библиотека отображения пример скетча? ... если это так, то используйте его, чтобы выяснить, как управлять дисплеем, @jsotola
//#include "SH1106.h"
это комментарий, @JurajРазве он не используется только для OLED-дисплеев? У меня матричный светодиод., @iamsumitd
тогда почему вы спрашиваете об «ошибке:« дисплей »не называет тип»?, @Juraj
Это ошибка, выдаваемая компилятором, и он запрашивает тип дисплея, поскольку я не упомянул об этом, что является частью моего вопроса., @iamsumitd