Arduino Projekt: Temperaturanzeige auf einer 8×8 LED Matrix

In diesem Tutorial möchte ich gerne eine Temperatur in Grad Celsius auf 5  8×8 LED Matrixen anzeigen lassen.

LED Matrix Anzeige & Temperatursensor DS18B20 am Arduino UNO
Dieses Video ansehen auf YouTube.

Komponenten für den Aufbau

Aufbau

MAX7219 und Temperatursensor DS18B20 am Arduino UNO
MAX7219 und Temperatursensor DS18B20 am Arduino UNO
MAX7219Arduino UNO
VCC5V
GNDGND
DINdigitaler PIN D8
CSdigitaler PIN D9
CLKdigitaler PIN D10
DS18B20Arduino UNO
VCC5V
DATAdigitaler PIN D2
GNDGND

Zusammenbau

Die Module können beliebig lang verbunden werden.

Die Grenzen sind der maximal verfügbare Strom sowie natürlich das Datenfeld (Integer – 32,767) für die Übergabe der Anzahl der Module.

Wenn man nun wie ich es getan habe 5 Module hintereinander (kaskadierend) verdrahtet so erhält man ein ziemliches durcheinander.

5x MAX7219 verwirrt
5x MAX7219 verwirrt

Diesem durcheinander kann man nur mit festkleben oder anschrauben entgegenwirken.

Ich habe mir ein Stativ aus Holz erstellt somit kann ich später diese Module noch vielseitig anders verwenden.

MAX7219 Shields auf einem Stativ
MAX7219 Shields auf einem Stativ

Quellcode

Der Quellcode ist ein „Mix“ aus den bereits vorgestellten Tutorials Arduino Lektion 8: Max7219 8×8 LED Shield und Arduino Projekt: LED Matrix Uhr.

//Die MaxMatrix Bibliothek
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
//Ausgelagerte CHAR Arrays damit dieser Code übersichtlicher bleibt.
#include "statics.h"

#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS 2  //Sensor DS18B20 am digitalen Pin 2
 
OneWire oneWire(ONE_WIRE_BUS); //
DallasTemperature sensors(&oneWire);

int data = 8;    // DIN Pin vom MAX7219 Shield
int load = 9;    // CS Pin vom MAX7219 Shield
int clock = 10;  // CLK Pin vom MAX7219 Shield

int maxInUse = 5;    //Dieser Wert bestimmt wieviele MaxMatrix Shields hintereinander (kaskadiert) verwendet werden.

MaxMatrix m(data, load, clock, maxInUse); // Definiert nun ein Objekt der Klasse MaxMatrix.

void setup(){
  m.init(); // Das Max7219 initialisieren.
  m.setIntensity(1); // LED Leucht intensität, Werte von 0-15 sind hier erlaubt.
  Serial.begin(9600); // Übertragungsgeschwindigeit der seriellen Verbindung
}

void loop(){
  char bu[100];
  String msg = "Temperatur ";
  msg+=String(getTemperatur(),2);
  msg+="C ";
  
  msg.toCharArray(bu,100);
   printStringWithShift(bu, 35); //Schreibt die Message auf die Max LED Matrix, mit einer wiederholungsgeschwindigkeit von 75ms.
}

float getTemperatur(){ 
 sensors.begin(); //Starten der Kommunikation mit dem Sensor
 sensors.requestTemperatures(); 
 float value = sensors.getTempCByIndex(0);
 Serial.println(value);
 return value;
} 

void printCharWithShift(char c, int shift_speed){
  if (c < 32) return;
  c -= 32;
  byte buffer[100];
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);
  
  for (int i=0; i<buffer[0]+1; i++) 
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed){
  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

Die externe Datei „statics.h“ enthält die Byte Werte für die LED Matrix.

Ich habe diese Werte ausgelagert da das sonst den Quellcode unnötig aufblähen würde.

PROGMEM const unsigned char CH[] = {
3, 8, B0000000, B0000000, B0000000, B0000000, B0000000, // space
1, 8, B1011111, B0000000, B0000000, B0000000, B0000000, // !
3, 8, B0000011, B0000000, B0000011, B0000000, B0000000, // "
5, 8, B0010100, B0111110, B0010100, B0111110, B0010100, // #
4, 8, B0100100, B1101010, B0101011, B0010010, B0000000, // $
5, 8, B1100011, B0010011, B0001000, B1100100, B1100011, // %
5, 8, B0110110, B1001001, B1010110, B0100000, B1010000, // &
1, 8, B0000011, B0000000, B0000000, B0000000, B0000000, // '
3, 8, B0011100, B0100010, B1000001, B0000000, B0000000, // (
3, 8, B1000001, B0100010, B0011100, B0000000, B0000000, // )
5, 8, B0101000, B0011000, B0001110, B0011000, B0101000, // *
5, 8, B0001000, B0001000, B0111110, B0001000, B0001000, // +
2, 8, B10110000, B1110000, B0000000, B0000000, B0000000, // ,
4, 8, B0001000, B0001000, B0001000, B0001000, B0000000, // -
2, 8, B1100000, B1100000, B0000000, B0000000, B0000000, // .
4, 8, B1100000, B0011000, B0000110, B0000001, B0000000, // /
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // 0
3, 8, B1000010, B1111111, B1000000, B0000000, B0000000, // 1
4, 8, B1100010, B1010001, B1001001, B1000110, B0000000, // 2
4, 8, B0100010, B1000001, B1001001, B0110110, B0000000, // 3
4, 8, B0011000, B0010100, B0010010, B1111111, B0000000, // 4
4, 8, B0100111, B1000101, B1000101, B0111001, B0000000, // 5
4, 8, B0111110, B1001001, B1001001, B0110000, B0000000, // 6
4, 8, B1100001, B0010001, B0001001, B0000111, B0000000, // 7
4, 8, B0110110, B1001001, B1001001, B0110110, B0000000, // 8
4, 8, B0000110, B1001001, B1001001, B0111110, B0000000, // 9
2, 8, B01010000, B0000000, B0000000, B0000000, B0000000, // :
2, 8, B10000000, B01010000, B0000000, B0000000, B0000000, // ;
3, 8, B0010000, B0101000, B1000100, B0000000, B0000000, // <
3, 8, B0010100, B0010100, B0010100, B0000000, B0000000, // =
3, 8, B1000100, B0101000, B0010000, B0000000, B0000000, // >
4, 8, B0000010, B1011001, B0001001, B0000110, B0000000, // ?
5, 8, B0111110, B1001001, B1010101, B1011101, B0001110, // @
4, 8, B1111110, B0010001, B0010001, B1111110, B0000000, // A
4, 8, B1111111, B1001001, B1001001, B0110110, B0000000, // B
4, 8, B0111110, B1000001, B1000001, B0100010, B0000000, // C
4, 8, B1111111, B1000001, B1000001, B0111110, B0000000, // D
4, 8, B1111111, B1001001, B1001001, B1000001, B0000000, // E
4, 8, B1111111, B0001001, B0001001, B0000001, B0000000, // F
4, 8, B0111110, B1000001, B1001001, B1111010, B0000000, // G
4, 8, B1111111, B0001000, B0001000, B1111111, B0000000, // H
3, 8, B1000001, B1111111, B1000001, B0000000, B0000000, // I
4, 8, B0110000, B1000000, B1000001, B0111111, B0000000, // J
4, 8, B1111111, B0001000, B0010100, B1100011, B0000000, // K
4, 8, B1111111, B1000000, B1000000, B1000000, B0000000, // L
5, 8, B1111111, B0000010, B0001100, B0000010, B1111111, // M
5, 8, B1111111, B0000100, B0001000, B0010000, B1111111, // N
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // O
4, 8, B1111111, B0001001, B0001001, B0000110, B0000000, // P
4, 8, B0111110, B1000001, B1000001, B10111110, B0000000, // Q
4, 8, B1111111, B0001001, B0001001, B1110110, B0000000, // R
4, 8, B1000110, B1001001, B1001001, B0110010, B0000000, // S
5, 8, B0000001, B0000001, B1111111, B0000001, B0000001, // T
4, 8, B0111111, B1000000, B1000000, B0111111, B0000000, // U
5, 8, B0001111, B0110000, B1000000, B0110000, B0001111, // V
5, 8, B0111111, B1000000, B0111000, B1000000, B0111111, // W
5, 8, B1100011, B0010100, B0001000, B0010100, B1100011, // X
5, 8, B0000111, B0001000, B1110000, B0001000, B0000111, // Y
4, 8, B1100001, B1010001, B1001001, B1000111, B0000000, // Z
2, 8, B1111111, B1000001, B0000000, B0000000, B0000000, // [
4, 8, B0000001, B0000110, B0011000, B1100000, B0000000, // backslash
2, 8, B1000001, B1111111, B0000000, B0000000, B0000000, // ]
3, 8, B0000010, B0000001, B0000010, B0000000, B0000000, // hat
4, 8, B1000000, B1000000, B1000000, B1000000, B0000000, // _
2, 8, B0000001, B0000010, B0000000, B0000000, B0000000, // `
4, 8, B0100000, B1010100, B1010100, B1111000, B0000000, // a
4, 8, B1111111, B1000100, B1000100, B0111000, B0000000, // b
4, 8, B0111000, B1000100, B1000100, B0101000, B0000000, // c
4, 8, B0111000, B1000100, B1000100, B1111111, B0000000, // d
4, 8, B0111000, B1010100, B1010100, B0011000, B0000000, // e
3, 8, B0000100, B1111110, B0000101, B0000000, B0000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B0000000, // g
4, 8, B1111111, B0000100, B0000100, B1111000, B0000000, // h
3, 8, B1000100, B1111101, B1000000, B0000000, B0000000, // i
4, 8, B1000000, B10000000, B10000100, B1111101, B0000000, // j
4, 8, B1111111, B0010000, B0101000, B1000100, B0000000, // k
3, 8, B1000001, B1111111, B1000000, B0000000, B0000000, // l
5, 8, B1111100, B0000100, B1111100, B0000100, B1111000, // m
4, 8, B1111100, B0000100, B0000100, B1111000, B0000000, // n
4, 8, B0111000, B1000100, B1000100, B0111000, B0000000, // o
4, 8, B11111100, B0100100, B0100100, B0011000, B0000000, // p
4, 8, B0011000, B0100100, B0100100, B11111100, B0000000, // q
4, 8, B1111100, B0001000, B0000100, B0000100, B0000000, // r
4, 8, B1001000, B1010100, B1010100, B0100100, B0000000, // s
3, 8, B0000100, B0111111, B1000100, B0000000, B0000000, // t
4, 8, B0111100, B1000000, B1000000, B1111100, B0000000, // u
5, 8, B0011100, B0100000, B1000000, B0100000, B0011100, // v
5, 8, B0111100, B1000000, B0111100, B1000000, B0111100, // w
5, 8, B1000100, B0101000, B0010000, B0101000, B1000100, // x
4, 8, B10011100, B10100000, B10100000, B1111100, B0000000, // y
3, 8, B1100100, B1010100, B1001100, B0000000, B0000000, // z
3, 8, B0001000, B0110110, B1000001, B0000000, B0000000, // {
1, 8, B1111111, B0000000, B0000000, B0000000, B0000000, // |
3, 8, B1000001, B0110110, B0001000, B0000000, B0000000, // }
4, 8, B0001000, B0000100, B0001000, B0000100, B0000000, // ~
};

Download

Hier das gesamte Projekt zum Download.

8 Kommentare

  1. Arduino Projekt: Temperaturanzeige auf einer 8×8 LED Matrix. Hola quiero montar tu circuito pero solo quiero poner 4 displays  8×8 led Matrix MAX7219 , mi pregunta es  , si el sketch es el mismo o hay que modificarlo , es que no se de  programaciòn .Un saludo

  2. Hi,
    größten Dank für das Projekt.
    Ich habe die 4 Segmente auf einer Platine.
    Allerdings läuft die Temperatur jetzt Quer und nicht längs.
    Gibt es dazu eine Lösung?
    Größten Dank und Gruß Franz

    1. Hi,

      welche Bibliothek verwendest du zum Programmieren?
      Ggf. muss man die „direction“ einstellen.

      Gruß,

      Stefan Draeger

  3. Moin moin.

    Ich benutze ein Blaues 4x 8×8 (in eins) Modul MAX7219 1088AB mit der
    MAX_MATRIX.h
    und
    einem funktionierendem Sketch (DS3131 Uhr mit BT Steuerung)

    ALLes funktioniert, DS3231, BluetoothSteuerung und das Durchlaufen.
    ABER ich bekommenicht raus, wie ich es anstelle, das Text, Zeit und Temperatur
    wagerecht von rechts nach links läuft.

    Momentan läuft zwar alles von rechts nach links,
    ABER auf jedem der Vier um 90 Grad verdreht;-((

    Vielleicht könnten Sie noch einmal von Ihrer kostbaren Zeit etwas opfern
    und mir erneut auf die Sprünge helfen.

    Das wär toll.

    Mit freundlichem Gruß

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.