projects:hanover_bus_display

Hanover bus display

Op 13-09-2023 heeft Jos een LED scherm meegenomen die in bussen gebruikt worden. Het idee is om op deze pagina informatie over het scherm te verzamelen.

  • In de gang aan de muur bij de lounge

tdvenlo.nl_blog_wp-content_gallery_weekend-van-de-wetenschap-2021_wvdw2021-3.jpg

  • Met een Arduino via serieel in combinatie met een RS485 converter. Daarbij is de verversingstijd 0.86 seconden.
  • Klok
  • Spacemap berichten
  • Geen snelle animaties
  • Fysieke resolutie: 128×15 leds
  • Serieel over RS485, 4800 baud SERIAL_8O1 (8 data bits, odd parity, 1 stop bit)
    • 4128 databits met 4800 bits per seconde resulteert in een verversingstijd van 0.86 seconden.
    • Benodigde hardware: MAX485 TTL to RS485 Converter Module (5V)
  • Communicatieprotocol: https://github.com/hawkz/Hanover_Flipdot (zie hello world demo)
    • Het scherm gebruikt voor de aansturing een resolutie van 16×128. De onderste regel valt dan weg.
  • 24Vdc 1.1A (127×15 leds op maximale helderheid)
  • 19Vdc 1.5A (127×15 leds op maximale helderheid)

Wanneer je het scherm voedt met 24V en niet aanstuurt, gaat er linksboven een lampje branden:

Aansturing werkt met de onderstaande code, die een resolutie van 16×127 gebruikt. 16×128 is nog niet gelukt omdat dan de resolutie die meegestuurd wordt, veranderd van 254 (0xFE) naar 256 (0x100). Met het extra karakter dat er bij de resolutie bijkomt laat het scherm niks zien.

  • Resolutie = rows*columns/8
Hello World (Arduino)
//Code based on https://github.com/hawkz/Hanover_Flipdot
//Board: Arduino Uno
 
#define displayRows 16
#define displayCols 127
#define displayBytes 254  // rows*cols/8
#define displayAddress 1
#define displayHeaderBytes 5
#define displayFooterBytes 3
 
byte displayBuffer[displayBytes];
 
void displaySetPixel(byte x, byte y, bool value){
  int pixelIndex = y%displayRows + x*displayRows;
  byte byteIndex = pixelIndex/8;
  byte bitIndex  = pixelIndex%8;
  bitWrite(displayBuffer[byteIndex],bitIndex,value);
}
 
void displayClear(){
  for(byte i=0; i< displayBytes; i++){
    displayBuffer[i]=0;
  }
}
 
byte b1;
byte b2;
void byteToAcii(byte value){
  b1=0;
  b2=0;
 
  b1=value>>4;
  if(b1 > 9){
    b1 += 0x37;
  }else{
    b1 += 0x30;
  }
 
  b2 = value % 16;
  if(b2 > 9){
    b2 += 0x37;
  }else{
    b2 += 0x30;
  }
}
 
void displayUpdate(){
  byte buff[516];
 
  buff[0]= 0x02;                  //Start character
  buff[1]= 0x31;                  //Address b1
  buff[2]= 0x30 + displayAddress; //Address b2
  byteToAcii(displayRows*displayCols/8); // Resolution
  buff[3]= b1;
  buff[4]= b2;
 
  int sum = buff[0] + buff[1] + buff[2] + buff[3] + buff[4];
  for(byte i = 0; i<displayBytes; i++){
    byteToAcii(displayBuffer[i]);
    buff[displayHeaderBytes+i*2]  =b1;
    buff[displayHeaderBytes+i*2+1]=b2;
    sum+=b1+b2;
  }
  buff[displayHeaderBytes+displayBytes*2 + 0] =0x03; //End character
  sum+=1;
 
  sum=sum & 0xFF;
  byte crc = (sum ^ 255)+1; //xor+1;
  byteToAcii(crc);
  buff[displayHeaderBytes+displayBytes*2 + 1] = b1;
  buff[displayHeaderBytes+displayBytes*2 + 2] = b2;
 
  Serial.write(buff,516);
}
 
void displaySetup(){
  Serial.begin(4800,SERIAL_8O1);
}
 
void setup() {
  // put your setup code here, to run once:
  displaySetup();
}
 
int i=0;
void loop() {
  // put your main code here, to run repeatedly:
 
  //Draw a sine wave on the screen:
  displayClear();
  for(int x = 0; x<displayCols ; x++){
      byte y =7+round(sin(x/8.0+millis()/6000.0)*7);
      displaySetPixel(x,y,true);
      do{
        if(y<15)y++;
        displaySetPixel(x,y,true);
      }while(y!=15);
  }
  displayUpdate();
}

Bij VenloopKids 2024 hong de busmatrix boven onze stand en gaf afwisselende teksten weer. Hiervoor is de code gebruikt van de Lichtkrant die verantwoordelijk is voor het genereren van tekst. Daarbij is in principe alleen de pixelschrijffunctie vervangen en de resolutie voor het scherm aangepast.

Broncode: hanover_venloopkids2024_v1.zip

void loop(){
  displayClear();
 
  //Een tekst gecentreerd weergeven op de bovenste regel:
  printString("Hackerspace TDvenlo",CENTER,0);
 
  //Vier afwisselende teksten gecentreerd weergeven op de onderste regel:
  if(messageIndex==0) printString("Speel met techniek"   ,CENTER,8);
  if(messageIndex==1) printString("Voor jong en oud"     ,CENTER,8);
  if(messageIndex==2) printString("30 maart open dag"    ,CENTER,8);
  if(messageIndex==3) printString("Bij bibliotheek Venlo",CENTER,8);
 
  //De index verschuiven naar de volgende tekst:
  messageIndex++;
  if(messageIndex>3) messageIndex=0;
 
  displayUpdate();
  delay(1500);
}
  • projects/hanover_bus_display.txt
  • Last modified: 13/09/2024 23:06
  • by ron