aida64-arduino-max7219
github:https://github.com/cafkagh/aida64-arduino-max7219
小白不友好型程序,如果您对硬件及相关开发一窍不通,请去B站搜索大佬“会飞的阿卡林”寻找“数码管”相关教程,设置过程大同小异。
本程序根据时间分割数据,改进了使用固定字符判断数据起始位置的方式,使内容设置更为灵活。
注意:
-
适用于MAX7219驱动的8位7段数码管,可串联。
-
请确认安装库“DigitLedDisplay”。
-
本程序配合aida64使用,通过COM口进行通讯,使用前请确认设备的COM端口。
-
本程序使用Arduino开发,支持多种硬件平台,需使用ArduinoIDE下载使用。
-
请先使用ArduinoIDE下载程序,后设置aida64,避免因aida64占用端口导致Arduino下载失败
设置:
打开aida64,在左上角菜单中寻找:“文件”→“设置”→“硬件监视工具”,点击 “LCD”,选择"POS"。协议为默认“ADM787/788”,勾选“启用POS VFD 支持”。点击“LCD项目”添加数据源即可。
配置项:
int lednum = 8; //LED位数
int fi_ms = 500; //帧间隔 毫秒
int reversed = 1; // 0不反转 1 翻转
int wait_ms = 5000; //数据超时提示 毫秒
int brightness = 1; //亮度
fi_ms (帧间隔)应大于COM口接收数据包间隔时间并且小于aida64发送数据的间隔。
符号“T”为“℃”符号,请在反向模式中使用。
#include <Arduino.h>
#include "DigitLedDisplay.h"
DigitLedDisplay ld = DigitLedDisplay(2, 3, 4);//DIN CS CLK
// 配置项
int lednum = 8; //LED位数
int fi_ms = 500; //帧间隔 毫秒
int reversed = 1; // 0不反转 1 翻转
int wait_ms = 5000; //数据超时提示 毫秒
int brightness = 1; //亮度
int i = 0;
char inByte;
int connect = 0;
long long int last_millis = 0;
const char dig_led[28] = {
B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,B01111111,B01111011,B01110111,B01111111,B01001110,B01111110,B01001111,B01000111,B01011110,B00110111,B00110000,B00111100,B00001110,B01111110,B01100111,B01011011,B11111000,B00111110,B10000000,B00000000
};
const char r_dig_led[28] = {
B01111110,B00000110,B01101101,B01001111,B00010111,B01011011,B01111011,B00001110,B01111111,B01011111,B00111111,B01111111,B01111000,B01111110,B01111001,B00111001,B01111010,B00110111,B00000110,B01100110,B01110000,B01111110,B00111101,B01101101,B11111000,B01110110,B10000000,B00000000
};
const char sort[28] = {
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','L','O','P','S','T','U','.',' '
};
//查找元素并返回位置下标,find(数组,长度,元素)
int find(char ar[], int n, char element){
int i = 0;
int index=-1;//原始下标,没找到元素返回-1
for (i = 0; i <n; i++){
if (element ==ar[i]){
index=i;//记录元素下标
}
}
return index;//返回下标
}
void wait(){
if(millis() - last_millis > wait_ms or connect == 0){
for(int j = 1; j <= lednum; j++){
ld.write(j, 0x01);
delay(50);
ld.write(j, 0x00);
}
for(int j = lednum; j >=1; j--){
ld.write(j, 0x01);
delay(50);
ld.write(j, 0x00);
}
}
}
void setup(){
Serial.begin(9600);
ld.setBright(brightness);
ld.setDigitLimit(lednum);
}
void loop(){
if(Serial.available()>0){
inByte = Serial.read();
if(millis() - last_millis > fi_ms){
ld.clear();
i = 0;
connect = 1;
}
if(i<=lednum){
if(reversed == 0){
ld.write(lednum-i, dig_led[find(sort,28,inByte)]);
}else{
ld.write(i+1, r_dig_led[find(sort,28,inByte)]);
}
}
last_millis = millis();
i++;
}else{
wait();
}
}