物联网工具——LED显示屏对接(19)

754 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 32
384 64192 双色:16384 32192 64128
5、扫描方式:1/16或者1/4 ;
6、扫描频率:64Hz ;
7、单条最大信息长度:40个汉字或80个ASCII字符(信息空间81字节,每个汉字占用2个字节,每个ASCII字符占用1个字节,flash最大可存储240条信息;

程序对接

modbus rtu协议

image.png

这种使用场景是,我们固定好了显示的格式和文字。需要定时的去刷新每个参数的数据。
那么我们可以使用rtu协议,定时的去更新对应的寄存器值就可以。

ASC协议

image.png

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;
        }

测试

10c7a567b20cffadd7fd5b951338298.jpg