博主在之前文章《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、三屏LCD602、LCD2004几种,下载图纸去嘉立创下单(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的努力和持续开发,固件支持的串口命令还在不断增加,让我们发现更多的应用场景、打造更炫酷的显示效果。
博主3D打印了个外壳,不过目前只画了LCD1602的,有时间把LCD2004的外壳也补上,需要的可以下载。
LCD1602 NET
美好的石榴籽送上,
美好的73送上!
ESP32玩力无穷,大佬666
漂亮!