Arduino a 2xMAX7219
Moderátor: Moderátoři
Arduino a 2xMAX7219
Ale skús ChatGPT. Nedávno som mu dal dotaz, ako správne programovať sekvencer v konkrétnom čipe, určenom pre prácu s MFM harddiskami. Normálne si to samo naštudovalo datasheet z 1991 (generovanie odpovede trvalo tri minúty) a vyplulo funkčný princíp pseudokódu, aj s vysvetlením jednotlivých registrov. Ten som už následne poupravil a doladil tak, aby korešpondoval s tým, ako som mal ten čip pripojený na adresné linky Arduina.
Jasné, že to nevypluje hneď funkčné a škálovatelné riešenie jak na striebornom podnose, ale nakopnúť to vie...
- martinkopp
- Příspěvky: 1303
- Registrován: 12 říj 2023, 00:00
Zo strany Arduina mu stačí pozrieť príklad ako sa pracuje so SPI.
Kód: Vybrat vše
#include <LedControl.h>
// Pins: DIN = 11, CLK = 13, CS = 10
// 2 devices daisy chained
LedControl lc = LedControl(11, 13, 10, 2);
void setup() {
// Wake up the displays
for (int i = 0; i < 2; i++) {
lc.shutdown(i, false); // Wake up
lc.setIntensity(i, 8); // Set brightness (0–15)
lc.clearDisplay(i); // Clear display
}
// Example: Display text across 16 digits
displayText("HELLO WORLD 1234");
}
void loop() {
// Nothing here for now
}
// Maps characters to 7-segment (limited to supported ones)
void displayText(String text) {
const char* charMap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -";
byte segmentCodes[] = {
0b01111110, // 0
0b00110000, // 1
0b01101101, // 2
0b01111001, // 3
0b00110011, // 4
0b01011011, // 5
0b01011111, // 6
0b01110000, // 7
0b01111111, // 8
0b01111011, // 9
0b01110111, // A
0b00011111, // B
0b01001110, // C
0b00111101, // D
0b01001111, // E
0b01000111, // F
0b01011110, // G
0b00110111, // H
0b00110000, // I (same as 1)
0b00111100, // J
0b00000000, // K (not displayable)
0b00001110, // L
0b00000000, // M (not displayable)
0b00010101, // N (compromise)
0b01111110, // O
0b01100111, // P
0b01110011, // Q
0b00000101, // R
0b01011011, // S
0b00001111, // T
0b00111110, // U
0b00111110, // V (same as U)
0b00000000, // W (not displayable)
0b00110111, // X (same as H)
0b00111011, // Y
0b01101101, // Z (same as 2)
0b00000000, // space
0b00000001 // dash -
};DIN → Arduino D11
CLK → Arduino D13
CS/LOAD → Arduino D10
VCC → 5V
GND → GND
Zapojení dvou obvodů MAX7219 viz tento odkaz.
Upravený zdroják pro dva moduly MAX7219.
Kód: Vybrat vše
#include "LedControl.h"
// nastavení propojovacích pinů
#define DIN 12
#define CS 10
#define CLK 13
#define PRVNI_MAX7219 0
#define DRUHY_MAX7219 1
// vytvoření objektu displeje,
// propojovací piny a počet MAX obvodů (2)
LedControl max7219 = LedControl(DIN, CLK, CS, 2);
// proměnná pro pauzy mezi znaky
int pauza = 250;
void napisArduino(int addr)
{
// ukázka nastavení znaků různými způsoby
// s pauzou mezi zobrazeními
max7219.setChar(addr, 6, 'a', false);
delay(pauza);
max7219.setRow(addr, 5, 0x05);
delay(pauza);
max7219.setChar(addr, 4, 'd', false);
delay(pauza);
max7219.setRow(addr, 3, 0x1c);
delay(pauza);
max7219.setRow(addr, 2, B00010000);
delay(pauza);
max7219.setRow(addr, 1, 0x15);
delay(pauza);
max7219.setRow(addr, 0, 0x1D);
delay(10*pauza);
// vyčištění displeje
max7219.clearDisplay(addr);
delay(pauza);
};
void setCas(int addr, unsigned long cas)
{
// výpis času na všech 8 segmentů
// postupným získáním jednotlivých číslic
max7219.setDigit(addr, 7, (cas / 10000000) % 10, false);
max7219.setDigit(addr, 6, (cas / 1000000) % 10, false);
max7219.setDigit(addr, 5, (cas / 100000) % 10, false);
max7219.setDigit(addr, 4, (cas / 10000) % 10, false);
max7219.setDigit(addr, 3, (cas / 1000) % 10, false);
max7219.setDigit(addr, 2, (cas / 100) % 10, false);
max7219.setDigit(addr, 1, (cas / 10) % 10, false);
max7219.setDigit(addr, 0, cas % 10, false);
};
void setup()
{
// vypnutí úsporného režimu
max7219.shutdown(PRVNI_MAX7219, false);
max7219.shutdown(DRUHY_MAX7219, false);
// nastavení intenzity na přibližnou polovinu (0-15)
max7219.setIntensity(PRVNI_MAX7219, 8);
max7219.setIntensity(DRUHY_MAX7219, 8);
// vypnutí svitu všech znaků
max7219.clearDisplay(PRVNI_MAX7219);
max7219.clearDisplay(DRUHY_MAX7219);
// výpis textu "Arduino" na segmenty
napisArduino(PRVNI_MAX7219);
napisArduino(DRUHY_MAX7219);
};
void loop()
{
// načtení času od spuštění do proměnné
unsigned long cas = millis();
// výpis času na všech 8 segmentů
// na první MAX7219
setCas(PRVNI_MAX7219, cas);
delay(pauza);
// výpis času na všech 8 segmentů
// na druhý MAX7219
setCas(DRUHY_MAX7219, cas);
delay(pauza);
};Z mých poznámek:
Kód: Vybrat vše
name=LedControl
version=1.0.6
author=Eberhard Fahle <e.fahle@wayoda.org>
maintainer=Eberhard Fahle <e.fahle@wayoda.org>
sentence=A library for the MAX7219 and the MAX7221 Led display drivers.
paragraph=The library supports multiple daisychained drivers and supports Led-Matrix displays as well as 7-Segment displays.
category=Display
url=http://wayoda.github.io/LedControl/
architectures=*Můj požadavek bylo právě ovládání několika zřetězených 7219. Jak segmentových tak maticových, možná i nějaké kombinace. Používal jsem i jiné knihovny, už jsem se v tom dlouho nehrabal, tak si přesně nepamatuju, musel bych vzpomínat.
- Přílohy
-
7219 uprava programu.zip- Moje vylepšení knihovny LedControl
- (11.05 KiB) Staženo 71 x