WarmCatDisplay

Alphanumeric Display DLR2416

At work, one of our HPU pump control cards died, the control card looks like this and hosts an interesting four-digit alphanumeric display:

Rexroth control card

So, out comes the Arduino and breadboard, and downloaded the datasheet for the display (readily available if you google “DLR2416 datasheet”).

This display has 7 data pins to receive ASCII code as per the table below, with two address pins to select the ‘segment’.

DLR2416 ASCII table

After a bit trial and error, and thanks to this website by a guy who successfully interfaced with a similar display, I managed to get some characters displayed. I used a 74HC595 shift register to push out the data to the DLR2416, plenty of example code on the Arduino site for help with that.

DLR2416 on breadboard DLR2416 Schematic

The above schematic doesn’t show the 1microfarad decoupling capacitor from data to ground, which was required to prevent the display sometimes showing erroneous characters.

I played about a bit more, added a temperature sensor and had it display the current temperature, and managed to have the display scroll text.

Soldered to a protoshield, with space for an additional display if I can find one:

Arduino prototyping shield Shield plugged into Arduino

See below for code. Need to get my hands on an additional display to play with!

– Wayne

// DLR2416 Display Driver for Arduino UNO
// Code for using a 74HC595 Shift Register to
// drive Siemens DLR2416 intelligentdisplay 

int latchPin = 8;  //Pin connected to ST_CP of 74HC595
int clockPin = 12; //Pin connected to SH_CP of 74HC595
int dataPin = 11;  //Pin connected to DS of 74HC595

int digitSel0Pin = 5; // Pin connected to "A0 digital select" on display
int digitSel1Pin = 6; // Pin connected to "A1 digital select" on display 
int displayWritePin = 7;  // Pin connected to "WR Write" on display
int displaySelectPin = 3; // Pin connected to CS1 on display 0
                          // (we only have one display atm)

int tempSensPin = 0; // AI for temp sensor

// Functions
void displayChar(char, int);
void displayWord(String);
void scrollWord(String);

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(digitSel0Pin, OUTPUT);
  pinMode(digitSel1Pin, OUTPUT);
  pinMode(displayWritePin, OUTPUT); 
  pinMode(displaySelectPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
  //Select display 0 as we have no other display yet
  digitalWrite(displaySelectPin, LOW);
  
  scrollWord("   www.WarmCat.uk    ");
  delay(500);
  
  // **** Temp Sensor bit ****
  int tempReading = analogRead(tempSensPin);
  float voltage = tempReading*5.0;
  voltage /= 1024.0;
  float tempC = (voltage - 0.5)*100;
  // converting from 10 mv per degree with 500 mV offset to degrees
  // ((voltage - 500mV) times 100)
  
  int tempCint = tempC+0.5; // round to nearest whole number; convert to int
  // and then output to serial for test purposes
  Serial.print(tempCint); Serial.println(" degrees C"); 
  
  //put int into a string
  char tempChar[4];
  sprintf(tempChar, "%d .",tempCint);
  
  displayWord(tempChar); // display temp
  displayChar(0x1B,2);   //display degrees symbol 
  
  // display whirly thing for fun
  for (int spin=0; spin<10; spin++)
  {
    displayChar(0x5C,3); delay(50); 
    displayChar(0x7C,3); delay(50); 
    displayChar(0x2F,3); delay(50); 
    displayChar(0x2D,3); delay(50);
  }
}

void displayChar(char myChar, int myPos)
{
  switch (myPos)
  {
    case 3:
    digitalWrite(digitSel0Pin, LOW);
    digitalWrite(digitSel1Pin, LOW);
    break;
    case 2:
    digitalWrite(digitSel0Pin, HIGH);
    digitalWrite(digitSel1Pin, LOW);
    break;    
    case 1:
    digitalWrite(digitSel0Pin, LOW);
    digitalWrite(digitSel1Pin, HIGH);
    break;
    case 0:
    digitalWrite(digitSel0Pin, HIGH);
    digitalWrite(digitSel1Pin, HIGH);
    break;
  }
  // set shift register
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, myChar);
  digitalWrite(displayWritePin, LOW); delay(2);
  digitalWrite(latchPin, HIGH);
  digitalWrite(displayWritePin, HIGH);
}

void displayWord(String myString)
{
  for (int x = 0; x < 4; x++) {
    displayChar(myString.charAt(x),x);
  }
}

void scrollWord(String myString)
{
  int stringLength = myString.length(); // length of string?
  for (int x = 0; x<(stringLength -3); x++)
  {
    displayChar(myString.charAt(x),0); 
    displayChar(myString.charAt(x+1),1);
    displayChar(myString.charAt(x+2),2);
    displayChar(myString.charAt(x+3),3);
    delay(150);
  }
}
DLR2416 Display on Arduino

Leave a Reply

Your email address will not be published. Required fields are marked *