携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
在物联网使用场景中,很多时候需要LED大屏显示一些及时的,关键点信息。比如:
1.大棚温湿度信息,土壤湿度,水分等
2.在空气监测站中,会需要led大屏幕显示实时的pm信息,so2,co2等关键监测参数
本章节主要通过以下几个方面进行介绍:
- led显示屏简介
- led接口分类
- 控制卡选择
- 程序对接
LED显示屏分类
led大屏的分类按照安装环境的不同,可以分为以下几类:
1.室内屏幕,室内屏幕的间距小,防水性能低,亮度低
2.户外屏幕,室外屏幕间距大,都具备防水性能,亮度高
3.半户外屏幕,顾名思义,这种屏幕介于室内屏幕和室外屏幕之间,一般没有防水性能,间距适中
了解了led屏幕的分类,我们就可以根据自己的屏幕安装位置,选择合适的led单元板。
led大屏幕是通过多个led单元板串并联组成的,一个单元板根据种类的不同,分辨率一般是32✖64或者16✖32。对于一些室内的高分辨率屏幕,还有更高的64✖128分辨率等可供选择
LED接口
led单元板的接口有HUB75,HUB40,HUB08,HUB12等几种型号
HUB12一般用在室外屏幕,P1.0或者P2.0大间距,单色屏幕中
HUB75一般用在室内屏幕,全彩或者单双色都有
在选择led单元板的过程中,我们不需要特别的关注led的接口,因为接口的选择主要还是看
自己选择的控制卡是否支持该接口
控制卡选择
控制卡的选择十分重要,我们选择二次开发的控制卡,必须满足以下需求:
1.具备可靠的sdk开发包
2.具备稳定的技术支持
3.供货稳定
4.如果不具备sdk开发包,则对接的协议需要灵活多变,能够满足自己的使用场景
一种led控制卡介绍
我们此次对接的led控制卡型号CK-64
1、 通信接口:CK-32C具有TTL或RS485接口,满足我们的设计需求
2、CK-32C板载2个08接口和2个12接口;CK-64C板载2个08接口和4个12接口
3、控制卡字库:出厂自带16点阵GB2312简体汉字库和816ASCII字库
4、控制点数:
CK-64C 单色:16x512 32384 64192 双色:16384 32192 64128
5、扫描方式:1/16或者1/4 ;
6、扫描频率:64Hz ;
7、单条最大信息长度:40个汉字或80个ASCII字符(信息空间81字节,每个汉字占用2个字节,每个ASCII字符占用1个字节,flash最大可存储240条信息;
程序对接
modbus rtu协议
这种使用场景是,我们固定好了显示的格式和文字。需要定时的去刷新每个参数的数据。
那么我们可以使用rtu协议,定时的去更新对应的寄存器值就可以。
ASC协议
asc协议对比rtu协议,更加的灵活。
我们只需要向串口发送满足asc协议的字符串就可以。文字灵活多变。
我们对asc协议进行适配编码:
asc协议code
worker项目中,在device下创建ledccard文件夹
创建ledcard.cs类,实现接口led显示
/// <summary>
/// 显示数据
/// </summary>
/// <param name="Data"></param>
/// <param name="Addr"></param>
/// <param name="Port"></param>
/// <returns></returns>
public static bool ShowDataASCCMD(SerialPort Port, byte Addr, string Data, bool debug = false)
{
if (Port.IsOpen)
{
string sendstring = $"$0{Addr.ToString("X2")},{Data}#";
if (debug)
MyLogger._.Debug("发送数据:" + sendstring);
byte[] recdata = new byte[16];
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
byte[] SendByteBuffer = Encoding.GetEncoding("GB2312").GetBytes(sendstring);
//发送
Port.Write(SendByteBuffer, 0, SendByteBuffer.Length);
//等待
Thread.Sleep(50);
//读取
if (Port.BytesToRead > 0)
{
int RecvLen = Port.BytesToRead;
//将数据按照字节依次读取
for (int i = 0; i < RecvLen; i++)
{
recdata[i] = (byte)Port.ReadByte();
}
//日志
if (debug)
Console.WriteLine($"数据:{VTool.HexToString(recdata, RecvLen)}");
if (VTool.HexToString(recdata, RecvLen) == "59")
return true;
else
return false;
}
else
return false;
}
return false;
}