Arduino a 2xMAX7219

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

Arduino a 2xMAX7219

#1 Příspěvek od jankrizan »

Zdravím. Potreboval by som zapojiť dva moduly 7-segmentové MAX7219. Nájde sa niekto, (myslím, že isto), kto mi poradí, ako bude znieť sketch, alebo kde nájdem návod na program s prepojením na tieto dva moduly? Potrebujem (chcem) vyhodiť LCD displej a namiesto neho zapojiť MAX.... v spajkovacej stanici, kde treba aby jeden displej zobrazoval aktualnu teplotu hrotu a druhý displej nastavovaciu. Hľadam aj na internete, ale asi neviem hľadať, pretože nič také som nenašiel. Stačilo by aj nejakú aplikáciu s dvoma modulmi, ja si už prispôsobím obsah. Nie matrix displeje. Ďakujem.
Uživatelský avatar
rnbw
Příspěvky: 37416
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#2 Příspěvek od rnbw »

MAX2719 sa daju retazit ("cascading"), vid datasheet.
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#3 Příspěvek od jankrizan »

Je mi jasné, ale ako napísať program, aby každý displej zobrazoval niečo iné? To neovládam vytvoriť, na korekcie programu si trúfam.
Uživatelský avatar
rampage
Příspěvky: 369
Registrován: 12 led 2025, 00:00

#4 Příspěvek od rampage »

Tak písať program nie je až tak zložité, céčko nemá krkolomnú syntax. Gro budeš vždy hľadať v datasheete, tzn. ako ten čip správne adresovať a aké príkazy mu posielať tak aby fungovali dva (v datasheete označené ako daisy-chain).

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...
Uživatelský avatar
martinkopp
Příspěvky: 1303
Registrován: 12 říj 2023, 00:00

#5 Příspěvek od martinkopp »

Nic na tom není, prostě do prvního obvodu data pošleš nejdřív pro druhý v řetězu, pak pro první displej a zobrazíš chip selectem, pokud si dobře pamatuju.
Uživatelský avatar
rampage
Příspěvky: 369
Registrován: 12 led 2025, 00:00

#6 Příspěvek od rampage »

Datasheet popisuje spojiť chipselecty dohromady a DOUT prvého MAXu zapojiť do DIN druhého. Cez SPI následne pošle jedno 16bit slovo a jeden no-op. Pri preklopení /CS následne dostane ten prvý čip nič a druhý data - alebo môže takto naprogramovať data hneď pre obidva. V datasheete to má rozpísané do detailu.
Zo strany Arduina mu stačí pozrieť príklad ako sa pracuje so SPI.
Přílohy
1.png
1.png
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#7 Příspěvek od jankrizan »

Chlapi, priznám sa, že tomu nerozumiem. Teoria (Nic na tom není, prostě do prvního obvodu data pošleš nejdřív pro druhý v řetězu, pak pro první displej a zobrazíš chip selectem), je pekná, ale ja neovládam príkazy na tvorbu programu, ani ako mám zadať do jednotlivých príkazov. Vo veku 65-ke, už nie je ten "memory efekt" v hlave, ako v 20-ke. Ak máte niekto nejaký funkčný program s dvoma MAX, viac by mi pomohlo, keby so ho videl napísaný, skôr ho pochopím. Vďaka.
Uživatelský avatar
HF_Tech
Příspěvky: 2365
Registrován: 25 dub 2022, 00:00

#8 Příspěvek od HF_Tech »

Chatgpt říká použít LEDcontrol knihovnu

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 -
  };
Připojení:
DIN → Arduino D11
CLK → Arduino D13
CS/LOAD → Arduino D10
VCC → 5V
GND → GND
Uživatelský avatar
bum
Příspěvky: 290
Registrován: 04 zář 2011, 00:00
Kontaktovat uživatele:

#9 Příspěvek od bum »

Na webu drátek.cz v sekci NAVODY K PRODUKTŮM na str.36 je popsáno ovládání jednoho IO Max 7219 8*8 led diod a na str.21 je ovládání osmimístného led displeje s uvedeným MAX7219 s programy, tyto se dají upravit jak potřebujete. Uvedené led moduly 8*8 i displeje led 7 * 8 s MAX 7219 ovládám pomocí PICAXE i počítačem pomocí sériového portu viz web.
Naposledy upravil(a) bum dne 27 srp 2025, 14:18, celkem upraveno 1 x.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#10 Příspěvek od Valdano »

Dratek: Příklad k MAX7219, popis i se zdrojákem pro Arduino.

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);
};
Ohledně dalších úprav se inspirujte z popisu knihovny LedControl.
Uživatelský avatar
bu2520
Příspěvky: 4922
Registrován: 16 črc 2007, 00:00
Bydliště: u HK

#11 Příspěvek od bu2520 »

Trochu jsem s tím měl problémy při řízení matice, pokud jsem neposlal na matici , která neměla nic zobrazit prázdný znak , tak se tam zkopíroval znak z předchozí matice.
Uživatelský avatar
mluno
Příspěvky: 267
Registrován: 18 dub 2011, 00:00
Bydliště: Benešov (u Prahy)

#12 Příspěvek od mluno »

Je několik knihoven a ne všechny umí řetězené displeje ovládat.

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=*
Je to zřejmě právě ta knihovna, kterou jsem použil po vyzkoušení více různých. A protože mě štvalo, že se občas displej rozsypal (asi jak se tam vadným spojením poslalo něco jiného) tak jsem dopsal funkci na reinit displeje, kterou jsem nakonec volal před každým zobrazením. Nejdřív jsem měl v plánu ji volat v nějakých intervalech, ale zrovna v tom programu bylo času dost, tak jsem to udělal právě tak. Dávám do přílohy.

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
Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“