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