Santek EZ Door Sign: Difference between revisions

From Leo's Notes
This page was last edited on 27 March 2025, at 06:54.
Line 44: Line 44:
* site: slide number (0 through 4)
* site: slide number (0 through 4)
* canvas: Color canvas (0 or 1)
* canvas: Color canvas (0 or 1)
|-
|0xBB
|0x01
|0x03
|0x01
|0x01
|
|0x7E
|did set image head data succeed? Data should be 0x01
|-
|-
|0xBB
|0xBB
Line 49: Line 58:
|0x04
|0x04
|0x12
|0x12
|row-bitmap
|column-bitmap
|variable
|variable
|0x7E
|0x7E
|send image row data.
|send image bitmap data by column.
Data is always 18 bytes long. 2 for row number, 16 for bitmap data.
Data is always 18 bytes long. 2 for column number, 16 for bitmap data.
Bitmap data here is based on the canvas setting (row above)
 
Bitmap data here is based on the canvas setting in order to get that extra bit for color.


* Row: 2 bytes in decimal. 0x01, 0x27 = 127
* Column: 2 bytes in decimal. (0 ~ 295) (0x00,0x00 ~ 0x01,0x27)
* Bitmap: 16 bytes. One bit per pixel makes 128 pixels
* Bitmap: 16 bytes. One bit per pixel makes 128 pixels
This is how you can retrieve data for the 296x128 pixel display.
|-
|0xBB
|0x01
|0x04
|0x01
|0x01
|
|0x7E
|did send image row data succeed? Data should be 0x01
|-
|-
|0xBB
|0xBB
Line 63: Line 83:
|0x05
|0x05
|0x04
|0x04
|site-canvas-row
|site-canvas-column
|variable
|variable
|0x7E
|0x7E
Line 71: Line 91:
* Site: Slide number (0 through 4)
* Site: Slide number (0 through 4)
* Canvas: Color canvas (0 or 1)
* Canvas: Color canvas (0 or 1)
* Row: 2 bytes in decimal. 0x01, 0x27 = 127
* Column: 2 bytes. (0 ~ 295)


To retrieve the actual color, you have to read both canvas
To retrieve the actual color, you have to read both canvas
Line 81: Line 101:
|0x05
|0x05
|0x12
|0x12
|row-bitmap
|column-bitmap
|variable
|variable
|0x7E
|0x7E
|Bitmap data received from a get command. The response message is always 24 bytes long.
|Bitmap data received from a get command. The response message is always 24 bytes long.
There are 18 bytes of payload data and is the same format as the send-image-row command.
There are 18 bytes of payload data and is the same format as the send-image-column command.


* Row: 2 bytes in decimal. 0x01, 0x27 = 127
* Column: 2 bytes. (0 ~ 295)
* Bitmap: 16 bytes. One bit per pixel makes 128 pixels
* Bitmap: 16 bytes. One bit per pixel makes 128 pixels
|-
|-

Revision as of 06:54, 27 March 2025

The Santek EZ Door Sign is cordless e-ink display intended to be mounted outside of offices or rooms. It is capable of storing 5 custom images that can be displayed and rotated with the side button.

The 2.9" variant which I obtained has a resolution of 296 x 128 pixels and is capable of displaying black, white, and red.

Serial protocol

Background

Santek provides a Windows based app written in C# that is able to interact with the door signs. My goal is to have some Linux based device that can periodically update these displays (such as the weather or calendar events on an hourly basis). In order to do that, I will need to figure out how exactly this device talks via the USB port.

There are some GitHub projects that try to interface with this device already including https://github.com/m3m0r7/ez-door-sign in PHP and https://github.com/kenichi884/ezsign.py in Python. However, the documentation on the serial protocol is a bit lacking. Fortunately, the protocol doesn't seem too complicated.

Serial configuration

Use 9600 baud. No parity.

The display has to be on. Ensure that the blue LED is lit before trying to talk to it via serial.

Commands

Here are some of the supported commands by the display.

Command Type is 0 if it's a command that's sent to the display. It will be a 1 if it's data that's a response to a command made by the display.

Header Command

Type

Command

ID

Data

Length

Data Chksum Ending Notes
0xBB 0x00 0x03 0x02 site-canvas variable 0x7E set image head data. This specifies which canvas you are overwriting.

Data is always 2 bytes long, containing:

  • site: slide number (0 through 4)
  • canvas: Color canvas (0 or 1)
0xBB 0x01 0x03 0x01 0x01 0x7E did set image head data succeed? Data should be 0x01
0xBB 0x00 0x04 0x12 column-bitmap variable 0x7E send image bitmap data by column.

Data is always 18 bytes long. 2 for column number, 16 for bitmap data.

Bitmap data here is based on the canvas setting in order to get that extra bit for color.

  • Column: 2 bytes in decimal. (0 ~ 295) (0x00,0x00 ~ 0x01,0x27)
  • Bitmap: 16 bytes. One bit per pixel makes 128 pixels

This is how you can retrieve data for the 296x128 pixel display.

0xBB 0x01 0x04 0x01 0x01 0x7E did send image row data succeed? Data should be 0x01
0xBB 0x00 0x05 0x04 site-canvas-column variable 0x7E Get image bitmap from display memory.

Data is always 4 bytes long.

  • Site: Slide number (0 through 4)
  • Canvas: Color canvas (0 or 1)
  • Column: 2 bytes. (0 ~ 295)

To retrieve the actual color, you have to read both canvas

See the response payload below.

0xBB 0x01 0x05 0x12 column-bitmap variable 0x7E Bitmap data received from a get command. The response message is always 24 bytes long.

There are 18 bytes of payload data and is the same format as the send-image-column command.

  • Column: 2 bytes. (0 ~ 295)
  • Bitmap: 16 bytes. One bit per pixel makes 128 pixels
0xBB 0x06 0x7E iap model
0xBB 0x00 0x07 0x01 0x00 0x08 0x7E power off
0xBB 0x00 0x00 0x01 0xFE 0xFF 0x7E next slide
0xBB 0x00 0x00 0x01 0xFF 0x00 0x7E previous slide (called 'up' in C# code)
0xBB 0x00 0x00 0x01 site site+1 0x7E Redraws the slide
0xBB 0x00 0x01 0x01 site variable 0x7E site is blank. if 4th byte is 254, then isBlank is false

The checksum is calculated by summing everything

When reading data...

  • read and discard until you see 187
  • ???

Color data

The site-canvas-row data that you read/write using the commands above determine the color. Because we only use one bit per canvas, the canvas is pretty much how you define an additional bit per pixel.

Canvas = 0 Canvas = 1 Color
Pixel bit value 0 0 Black
1 0 White
0 1 Red

For black and white only pictures, you can effectively ignore setting canvas=1.