使用arduino-nano 驱动 七段数码管 显示电脑运行状态

aida64-arduino-max7219

github:https://github.com/cafkagh/aida64-arduino-max7219

小白不友好型程序,如果您对硬件及相关开发一窍不通,请去B站搜索大佬“会飞的阿卡林”寻找“数码管”相关教程,设置过程大同小异。

本程序根据时间分割数据,改进了使用固定字符判断数据起始位置的方式,使内容设置更为灵活。

注意:

  1. 适用于MAX7219驱动的8位7段数码管,可串联。

  2. 请确认安装库“DigitLedDisplay”。

  3. 本程序配合aida64使用,通过COM口进行通讯,使用前请确认设备的COM端口。

  4. 本程序使用Arduino开发,支持多种硬件平台,需使用ArduinoIDE下载使用。

  5. 请先使用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();    
	}    
}

点赞

发表评论

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