Ik heb een Arduino Uno en een display MAX7218, zie foto, volgens https://lastminuteengineers.com/max7219-dot-matrix-arduino-tutorial/ en daar wil ik graag 2 getallen naast elkaar krijgen met een spatie of een : tussen.
Ik zou het op de Max7219 graag hebben zoals op de Seriële monitor :
1 : 19
2 : 18
3 : 17
4 : 16
5 : 15
Op de foto zie je het getal a slechts heel kort, het getal b (13) zie je lang.
Mijn code:
/* https://lastminuteengineers.com/max7219-dot-matrix-arduino-tutorial/
*
* GND GND
* DIN 11
* CS/LOAD 3
* CLK 13
*/
int a = 0;
int b = 20;
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Define hardware type and pins
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4 // Number of 8x8 matrices
#define CS_PIN 3
MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void setup() {
Serial.begin(9600);
display.begin();
display.setIntensity(0); // Brightness (0-15)
display.displayClear();
}
void loop() {
display.setTextAlignment(PA_LEFT);
a ++;
if (a > 9){
a = 0;}
display.print(a);
display.setTextAlignment(PA_CENTER);
b --;
if (b < 10){
b = 19;}
display.print(b);
Serial.print((a)); Serial.print(" : ");Serial.println((b));
delay(1000);
}
Heeft iemand hier een simpel voorbeeld? Alvast bedankt voor uw antwoord.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
void loop() {
display.setTextAlignment(PA_LEFT);
a ++;
if (a > 9){
a = 0;}
b --;
if (b < 10){
b = 19;}
myDisplay = (a + ":" + b);
display.print(MyDisplay);
Serial.print((a)); Serial.print(" : ");Serial.println((b));
delay(1000);
display.displayClear();
}benleentje
Golden Member
Serial.print((a)); Serial.print(" : ");Serial.println((b));Als je op het display hetzelfde als in serial,print wilt hebben dan moet je ook hetzelfde naar het display sturen en dat is nu enkel (a).
Wat ik alleen niet begrijp en ook niet gelezen hebt is wanneer het display nu leegt gemaakt word. Is dat na iedere print() of na ieder setAllignment()
Het getal a komt echt heel kort op het display, je kunt heel kort zien welk getal het is.
Het getal b telt heel constant mooi van 19 naar 10 en zo terug van 19 naar 10.
Vanonder in mijn code staat toch display.print(b); en dat doet hij ook daar het getal van 19 naar 10 telt, getal b dus.Wanneer het display gewist word weet ik niet, het zou beter zijn als het gewoon overschreven word zonder te wissen .
[Bericht gewijzigd door Looier op (41%)]
@Roland, nu krijg ik foutmelding: 'MyDisplay'was not declared in this scope
Hoe kan ik MyDisplay wel aanmelden?
benleentje
Golden Member
Wanneer het display gewist word weet ik niet,
Ja nu ik je uitleg erbij heb snap ik het wel.
Elke keer als keer als je iets naar het display print word het oude overschreven daarom staat A er ook maar zo kort.
De oplossing is zoals Roland van leusden aangeeft.
myDisplay = (a + ":" + b);
display.print(MyDisplay);
JE schrijft eerst naar een tussen variabele myDisplay.
maar dat moet volgens mij zijn.
myDisplay = (a + " : " + b);
let er dan wel op in het begin bij de andere variablen
String myDisplay = ""; te gebruiken. Want anders weet de compiler niet wat je bedoelt met myDisplay
@Roland, ik heb de code aangepast maar krijg nu volgende foutmelding:
Arduino: 1.8.18 (Windows 8.1), Board:"Arduino Uno"
In file included from C:\Users\Looitje\Documents\Arduino\libraries\MD_MAX72XX\src/MD_MAX72xx.h:50:0,
from C:\Users\Looitje\Documents\Arduino\libraries\MD_Parola\src/MD_Parola.h:460,
from C:\Users\Looitje\Documents\Arduino\Arduino_MAX7219_tellen\Arduino_MAX7219_tellen.ino:12:
C:\Users\Looitje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\SPI\src/SPI.h:72:1: error: expected ',' or ';' before 'class'
class SPISettings {
^~~~~
C:\Users\Looitje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\SPI\src/SPI.h:178:39: error: 'SPISettings' has not been declared
inline static void beginTransaction(SPISettings settings) {
^~~~~~~~~~~
C:\Users\Looitje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\SPI\src/SPI.h: In static member function 'static void SPIClass::beginTransaction(int)':
C:\Users\Looitje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\SPI\src/SPI.h:203:21: error: request for member 'spcr' in 'settings', which is of non-class type 'int'
SPCR = settings.spcr;
^~~~
C:\Users\Looitje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\SPI\src/SPI.h:204:21: error: request for member 'spsr' in 'settings', which is of non-class type 'int'
SPSR = settings.spsr;
^~~~
exit status 1
Fout bij het compileren voor board Arduino Uno
Ongeldige bibliotheek gevonden in C:\Users\Looitje\Documents\Arduino\libraries\LedControl: no headers files (.h) found in C:\Users\Looitje\Documents\Arduino\libraries\LedControl
Dit rapport zou meer informatie bevatten met
"Uitgebreide uitvoer weergeven tijden compilatie"
optie aan in Bestand -> Voorkeuren.
Nu heb ik : int MyDisplay = 0 toegevoegd, misschien is dit mis? Hoe moet het zijn dan??
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
benleentje
Golden Member
Bij een exit status 1 melding ben je meestal ergens een ; vergeten. Meestal verteld die wel waar maar soms lukt dat niet. De fout zit dan meestal in het beging waar je de variabelen neerzet.
Ik heb nu na het voorstel van Roland getest te hebben het volgende toegevoegd:
display.setTextAlignment(PA_LEFT);
display.print(a);
a ++;
if (a >24){
a = 0;
}
delay(1000);
zodat de dislpay het getal a optelt, dit gaat perfect maar van de uitlezing van getal a en van getal b is op de display niets te zien, die zijn wel te volgen op de seriële monitor.
void loop() {
String MyDisplay;
display.setTextAlignment(PA_LEFT);
a ++;
if (a > 9){
a = 0;}b --;
if (b < 10){
b = 19;}MyDisplay = (a + ":" + b);
display.print(MyDisplay);Serial.print((a)); Serial.print(" : ");Serial.println((b));
delay(1000);display.setTextAlignment(PA_LEFT);
display.print(a);
a ++;
if (a >24){
a = 0;
}delay(1000);
// display.displayClear();}
Nu heb ik juist het programma in een Arduino Nano getest met hetzelfde resultaat: Getal a telt op maar van getal b is niets te zien.
En ik zou dus graag getal a en getal b gescheiden door " : " op mijn display zien, wat doe ik mis?
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Het lijkt erop dat het probleem niet zozeer in de code zit, maar in hoe de MD_Parola-bibliotheek werkt. Ik zou eerst even de documentatie en voorbeelden van de bibliotheek doornemen om te begrijpen hoe deze bedoeld is om gebruikt te worden. Dat maakt het daarna een stuk makkelijker om de code goed op te zetten of te debuggen. Persoonlijk ben ik van mening dat deze bibliotheek veel te complex is voor wat jij wilt, dat zie je terug in de hoeveelheid code, 72% van de 32Kb Nano gebruikt voor deze simpele sketch.
void loop() {
display.setTextAlignment(PA_LEFT);
a ++;
if (a > 9){
a = 0;}
b --;
if (b < 10){
b = 19;}
display.print((String)a+":"+(String)b);
Serial.print((a)); Serial.print(" : ");Serial.println((b));
delay(1000);
display.displayClear();
}Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Mocht bovenstaande ook niet werken dan zit er weinig anders op dan met MD_Parola "zones" te werken. Hieronder een "3-zones" voorbeeld:
Zone 0 (links): teller a (1 digit)
Zone 1 (midden): : (vaste tekst)
Zone 2 (rechts): teller b (2 digits)
Let op: zones in MD_Parola zijn altijd hele modules. Ik ga de verdere code niet uitwerken, dat mag je zelf gaan doen.
benleentje
Golden Member
Getal a telt op maar van getal b is niets te zien.
En dat klopt helemaal omdat het ook zo in je code staat.
Je moet begrijpen dat elke keer als je naar het display schrijft de oude waarde gelijk weg is.
In je code je het volgende
Schrijft A en B naar het display via myDisplay
Schrijft dan A en B naar de seriele moniotor
wacht 1 seconde
Daarna schrijf je nog een keer naar het display maar enkel de waarde A
wacht 1 seconde
Op je display zie je dus afwisselend de waarde A en B en daarna enkel de waarde A.
Let op: zones in MD_Parola zijn altijd hele modules. Ik ga de verdere code niet uitwerken, dat mag je zelf gaan doen.
Precies. Of beter gezegd de library stuurt alle modules aan als 1 geheel.
Ik heb nu mijn fout gevonden, ik had :
MyDisplay = (a + ":" + b);
display.print(MyDisplay);
staan maar volgens het voorbeeld van Roland moest het :
display.print((String)a+" : "+(String)b);
zijn en nu doet het programma het zoals ik vroeg.
/* https://lastminuteengineers.com/max7219-dot-matrix-arduino-tutorial/
*
* GND GND
* DIN 11
* CS/LOAD 3
* CLK 13
*/
int a = 0;
int b = 20;
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Define hardware type and pins
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4 // Number of 8x8 matrices
#define CS_PIN 3
MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void setup() {
Serial.begin(9600);
display.begin();
display.setIntensity(0); // Brightness (0-15)
display.displayClear();
}
void loop() {
String MyDisplay;
display.setTextAlignment(PA_LEFT);
a ++;
if (a > 9){
a = 0;}
b --;
if (b < 10){
b = 19;}
display.print((String)a+" : "+(String)b);
//MyDisplay = (a + ":" + b);
//display.print(MyDisplay);
Serial.print((a)); Serial.print(" : ");Serial.println((b));
delay(1000);
a ++;
if (a >24){
a = 0;
}
MyDisplay = (a);
display.print(MyDisplay);
delay(1000);
} Allen bedankt en prettige feestdagen.