跳到内容

Direwolf LCD显示屏

博主在之前文章《Direwolf日志输出》中提到了如何存储并展示Direwolf接收到的APRS信标,虽然很详细,但是查看起来有些繁琐,得Shell登录到主机然后运行命令查看。而我们不会一直在电脑旁边,如果外接一个显示屏就能解决这个问题,想看时瞄一眼。那么问题又来了,屏幕要连接主机,主机一般放在角落(博主直接丢窗外电箱里了),要么挪主机要么引线,很麻烦。

如果有一个不用连数据线而且简单醒目的显示屏,势必能解决上述所有痛点。

本文要分享的网络LCD屏就是为此而生,硬件和软件部分由本地热心HAM开发,博主参与测试并整理资料,先来看看效果吧。

LCD2004屏最多可以同时显示Direwolf最近收到的四个APRS信标,星号表示中继转发,并附带接收时间。

 

也可以只列出最近收到的两个APRS信标,额外附带方位和距离信息。

 

有LCD2004和LCD1602两种

使用一块ESP32 C3开发板、一块I2C转换板,还有主角底板。

 

原理

ESP32 C3小巧廉价还带WiFi,是主控的不二之选,通过无线网络接收Direwolf主机输出的APRS信息内容;

I2C转接板实现背光和对比度控制,还能减少ESP32 C3的GPIO占用;

底板将LCD屏、主控板和转换板连接,并提供:按键、蜂鸣器、供电切换、串口引出、多屏并联等扩展焊盘。

Direwolf所在主机运行软件并作简单配置即可将接收到的APRS信标通过网络推送给LCD屏显示。

话不多说我们开搞!

 

打板

底板由本地电子大佬绘制,有单屏LCD1602双屏LCD1602三屏LCD602LCD2004几种,下载图纸去嘉立创下单(BaiPiao)即可。

 

组装

转换板的I2C针脚弯折后焊在底板上,还有LCD屏也焊上。

背光灯针脚弯折后焊在底板上,底板上有两个地方需要短接,其中一个根据所买LCD屏的供电电压选择3.3v或5v。

如果是LCD1602底板的话,ESP32 C3适当抬高一些,否则I2C转接板会挡住Type-C口导致电源头难以插入,下面的四针串口可以顺便焊上,方便以后串口独立调试。

 

固件

ESP32 C3固件由本地HAM开发

固件可以使用Flash Download Tools刷入

刷完固件后重启,用手机搜索连接“ESP_XXXX”名称热点,浏览器输入192.168.4.1进入WebUI配置WiFi。

成功连入家中WiFi后ESP32会分别打开TCP的4418端口和UDP的4419端口,用于接收外部程序传入的指令(此处以Linux命令向UDP端口传入“LCD_0000123”指令为例):

echo "LCD_0000123" > /dev/udp/192.168.8.105/4419
printf "LCD_0000123\n" | nc -u 192.168.8.105 4419 -w 0

目前支持指令如下:

SYS_W		#清理wifi配置,并重启。但是似乎没有卵用。

SYS_T0		#开启数据转发
SYS_T1		#关闭数据转发
#系统默认关闭转发,打开后。串口收到的数据会转发到TCP。TCP收到的数据会转发到串口。UDP收到的数据会转发给TCP和串口。

I2C_D03		#更新I2C的SDA引脚为3号引脚,必须是2位。如:03或者15。前提是你的ESP32引脚支持。
I2C_C04		#更新I2C的SCL引脚为4号引脚,必须是2位。如:04或者16。前提是你的ESP32引脚支持。

#使用I2C协议驱动屏幕,最多可以支持16个屏幕,编号0-f。
#如果不使用某个屏幕,就把屏幕地址设置为0,这样系统就不会初始化这个屏幕。节省启动时间。

LCD_*000123	#在第*个屏幕,第1行第1个位置开始,显示123。屏幕坐标横纵都是从0开始。列必须是2位,不足前面补零,行必须是1位。*代表要操作的屏幕编号,0-f。
LCD_0000123	#在第0个屏幕,第1行第1个位置开始,显示123。屏幕坐标横纵都是从0开始。列必须是2位,不足前面补零,行必须是1位。
LCD_c103123	#在第12个屏幕,第4行第10个位置开始,显示123。屏幕坐标横纵都是从0开始。列必须是2位,不足前面补零,行必须是1位。
LCD_*		#清屏。*代表要操作的屏幕编号,0-f。

LCD_*A63	#设置LCD屏幕I2C地址为十进制的63(只支持十进制,十六进制需要换算一下,而且必须为2位地址不足为个位数的前面补0。如LCD_A01)。还有个常见地址是:lcd_a39。*代表要操作的屏幕编号,0-f。(重启生效)
LCD_*C20	#设置屏幕列数为20。设置为16使用:lcd_c16。*代表要操作的屏幕编号,0-f。列必须是2位,不足前面补零。(重启生效)
LCD_*R4		#设置屏幕行数位4。设置为2使用:lcd_r2。*代表要操作的屏幕编号,0-f。(重启生效)
#这三个一般就是换了屏幕,或者2004换1602的时候用。参数断电保存。

LCD_*B0		#关灯。*代表要操作的屏幕编号,0-f。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。
LCD_*B1		#开灯。*代表要操作的屏幕编号,0-f。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。
#默认关灯。开关灯状态断电不保存。

LCD_*D0		#关灯,并且断电重启后默认关灯。*代表要操作的屏幕编号,0-f。(重启生效)。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。
LCD_*D1		#开灯,并且断电重启后默认开灯。*代表要操作的屏幕编号,0-f。(重启生效)。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。
#除非为了更改断电重启后默认开关灯状态,否则开关灯使用LCD_B指令。

LCD_*F0		#屏幕背光灯闪3闪,最后息屏。*代表要操作的屏幕编号,0-f。由于ESP32-C3是单核。不建议使用此指令。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。
LCD_*F1		#屏幕背光灯闪3闪,最后亮屏。*代表要操作的屏幕编号,0-f。由于ESP32-C3是单核。不建议使用此指令。这个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。不建议使用此指令。

LCD_P01		#设置屏幕背光控制GIO引脚。但是由于引脚驱动能力有限,要是驱动电压不够,或者连接的屏幕过多电流不足导致背光不够亮,建议外加三极管增大驱动电流。(重启生效)可以将控制背光的跳线帽去掉,然后将靠近屏幕排针旁边的那个引脚连接这里设置的引脚。需要控制那个屏幕,就连接那个屏幕。
LCD_*B*、LCD_*D*、LCD_*F*   #这三个指令控制背光,使用的是8574芯片控制,经过测试不好使,有时候灭了,发个指令就又凉了。所有才用单片机GIO控制。

LCD_G1		#设置屏幕背光控制引脚高电平(背光亮);
LCD_G0		#设置屏幕背光控制引脚低电平(背光灭);

LCD_H1		#设置屏幕背光控制引脚开机默认高电平(背光亮);(重启生效)
LCD_H0		#设置屏幕背光控制引脚开机默认低电平(背光灭);(重启生效)

LCD_I0		#LCD_PXX指令设置的GIO连接的屏幕背光灯闪3闪,最后息屏。由于ESP32-C3是单核。不建议使用此指令。
LCD_I1		#LCD_PXX指令设置的GIO连接的屏幕背光灯闪3闪,最后亮屏。由于ESP32-C3是单核。不建议使用此指令。

BEEP_P07	#设置蜂鸣器控制GIO引脚。(重启生效)
BEEP_F		#BEEP_PXX指令设置的GIO连接的蜂鸣器响三声。由于ESP32-C3是单核。不建议使用此指令。
BEEP_B1		#BEEP_PXX指令设置的GIO高电平,连接的蜂鸣器响。
BEEP_B0		#BEEP_PXX指令设置的GIO低电平,连接的蜂鸣器不响。

如果屏幕没有反应可能是因为不同I2C转接板芯片的总线地址不同,PCF8674AT芯片的默认地址为0x3f(十进制63),PCF8674T芯片的默认地址为0x27(十进制39),可以在Direwolf主机上使用如下命令更改:

echo "LCD_0A39" > /dev/udp/192.168.8.105/4419

 

服务

服务软件由本地HAM开发,运行于Direwolf所在主机,注意Direwolf配置文件加入如下行打开KISS端口,这样服务才能读取,此前博文《Direwolf手动发射功能》中有提到。

KISSPORT 8001

因为服务是Java程序,所以要先安装JDK 1.8环境,可以直接查找安装官网源的openjdk:

apt-cache search openjdk
sudo apt-get install openjdk-8-jdk

或者下载.gz包解压并配置环境变量,不同的Linux系统安装方式和命令各不相同,这里就不详细阐述了,可以自行百度。

下载服务Jar包,创建“application.yml”配置文件,内容主要是如何从Direwolf获取数据、处理数据、发送给屏幕,根据自身情况配置。

server:
  #WEB接口便配一个用不到的端口
  port: 8800
#本站的经纬度,主要用于计算收到的信标方位
location:
  #纬度,十进制。北纬为为正,南纬为负。
  lat: 34.250188
  #经度,十进制。东经为正,西经为负;
  long: 108.908888
#对接Direwolf的kiss端口配置
kiss:
  #是否启用
  enable: true
  #kissutil命令的位置,linux如果安装了Direwolf一般都有这个命令
  util: kissutil
  #Windows的格式
  #util: D:\\IDEA\\direwolf-lcd\\kissutil.exe
  #要连接的Direwolf的IP,如果是本机用localhost
  host: 192.168.8.105
  #要连接Direwolf的KISS端口,默认8001
  port: 8001
  #内存缓存信标数量。一般10就够了,不要超过99。
  cache: 10
#解码相关
decode:
  #decode_aprs的位置,#linux如果安装了惧狼一般都有这个命令
  aprs: decode_aprs
  #Windows的格式
  #aprs: D:\\IDEA\\direwolf-lcd\\decode_aprs.exe
  #缓存文件位置,数据量不大,放内存中很合适,不用来回写磁盘。
  temp: /dev/shm/aprs_lcd_decode.txt
  #Windows的格式
  #D:\\IDEA\\direwolf-lcd\\aprs_lcd_decode.txt
#LCD屏幕配置,一般来说,TCP和UDP使用一个就好了。优先使用UDP
lcd:
  # 一个WIFI屏可以连16个屏幕。这里配置屏幕的ID。只支持LCD2004屏
  # 主屏下标。取值范围:0-f
  main-index: 0
  # 副屏下标。取值范围:0-f。为-1表示不使用
  sub-index: 1
  # 显示类型。
  # 1为主屏显示4个呼号和时间,副屏显示主屏">"指向的信标信息。
  # 2为主屏第一行显示呼号时间,第二行显示速度方位距离。主副屏以此类推。
  type: 2
  tcp:
    #是否启用,测试的时候可以关闭
    enable: false
    #要连接的LCD的ip
    host: 192.168.8.105
    #要连接的LCD的端口,默认4418
    port: 4418
  udp:
    #是否启用,测试的时候可以关闭
    enable: true
    #要连接的LCD的ip
    host: 192.168.8.105
    #要连接的LCD的端口,默认4419
    port: 4419
#提醒设置
alert:
  #需要提醒的呼号,不要带SSID,用“,”间隔
  call-sign: BG9AAA,BG9BBB,BG9CCC
  #使用LCD背光提醒,收到指定的呼号,背光常亮10秒。但是是需要LCD使用GIO控制的屏幕背光
  #建议平时就默认背光关闭(需要配置屏幕,使用LCD_H0指令),有基友信标亮10秒。
  lcd-bg:
    #是否启用
    enable: true
    # 提醒完毕后背光是关闭还是开启。0:关闭,1开启(建议0关闭)
    end: 0
  #蜂鸣器哔哔哔
  beep:
    #蜂鸣器响几声取值范围0-3。0表示关闭。建议响一声。
    count: 1
    #一般来说,晚上关了
    # 几点开始
    start: 8
    #几点结束
    end: 23

最后运行服务Jar包并指定配置文件

nohup /root/jre/bin/java -jar /root/direwolf-lcd.jar --spring.config.location=file:/root/application.yml > /dev/null &

到此为止就完成了,Direwolf收到信标时KISS端口输出,服务读取KISS端口数据进行处理后通过TCP或UDP发给ESP32 C3,最终在LCD屏上显示。

 

总结

项目名称暂时命名为“TCP_UDP_IIC_LCD”,原本是为Direwolf而生,但开发过程中逐渐发现其优点和用途远不止这些。

首先,通过网络被动接收命令的方式很灵活,我们可以不局限于局域网内,通过外网映射和N2N等方式来远程显示。

其次,TCP UDP串口命令格式非常简单,文中使用Java服务器收集信息处理并发送,而我们还可以使用更简单的Python、乃至Shell脚本,这样开发难度会变得更低,可运行平台变得更多,应用场景也更广。

再次,一块ESP32 C3最多可以带16块不同I2C地址的LCD屏,通过底板四周的扩展焊盘可以实现矩阵形式显示,展示更多内容。

最后,感谢本地HAM的努力和持续开发,固件支持的串口命令还在不断增加,让我们发现更多的应用场景、打造更炫酷的显示效果。

发表于无线电

4 条评论

  1. 博主3D打印了个外壳,不过目前只画了LCD1602的,有时间把LCD2004的外壳也补上,需要的可以下载。

    LCD1602 NET

  2. BI9ABS BI9ABS

    美好的石榴籽送上,
    美好的73送上!

  3. BG9ITI BG9ITI

    ESP32玩力无穷,大佬666

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

允许上传的最大文件为2 MB。 您可以上传:图像, 视频, 存档 Drop file here