#include <TimerOne.h>
#include <Stepper.h>
const int ledCount = 8; // LED 灯的数量
int ledPins[ledCount] = {2, 3, 4, 5, 6, 7, 8, 9}; // LED 灯引脚数组
unsigned long interval = 200; // 设置闪烁时间间隔,单位 ms
int currentLed = 0;
const int stepsPerRevolution = 200; // 步进电机每转需要的步数
const int motorPin1 = 10; // 步进电机的引脚1
const int motorPin2 = 11; // 步进电机的引脚2
const int motorPin3 = 12; // 步进电机的引脚3
const int motorPin4 = 13; // 步进电机的引脚4
volatile int count = 0; // 计数器变量,用于记录外部脉冲数量
volatile unsigned long lastTime = 0; // 时间戳变量,用于记录上一次记录时间
Stepper myStepper(stepsPerRevolution, motorPin1, motorPin2, motorPin3, motorPin4);
void setup() {
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT); // 将每个 LED 引脚设置为输出模式
}
Timer1.initialize(interval * 1000); // 初始化计时器
Timer1.attachInterrupt(timerCallback); // 连接定时器中断回调函数
pinMode(3, INPUT); // 将输入引脚设为输入模式
attachInterrupt(digitalPinToInterrupt(3), pulseCount, RISING); // 连接外部中断函数
Serial.begin(9600);
myStepper.setSpeed(300); // 设置步进电机的转速
}
bool flag = true; // 初始化流水灯状态为开启
void loop() {
if (Serial.available() > 0) {
byte mode = Serial.read() - '0';
switch (mode) {
case 1:
// 加速
for (int i = 0; i < 300; i++) {
myStepper.step(1);
delay(10);
}
Serial.println("Motor speed increased.");
break;
case 2:
// 减速
for (int i = 0; i < 300; i++) {
myStepper.step(-1);
delay(10);
}
Serial.println("Motor speed decreased.");
break;
case 3:// 关闭/开启流水灯
if (flag) { // 如果流水灯是开启状态
Timer1.stop(); // 停止计时器中断
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW); // 熄灭所有 LED 灯
}
flag = false; // 将流水灯状态改为关闭
Serial.println("LED lights turned off.");
} else { // 如果流水灯是关闭状态
Timer1.start(); // 开始计时器中断
flag = true; // 将流水灯状态改为开启
Serial.println("LED lights turned on.");
}
break;
default:
break;
}
}
if (Serial.available() > 0) {
char mode = Serial.read();
if (mode == 'a') {// 控制第一个 LED 灯
digitalWrite(ledPins[0], !digitalRead(ledPins[0]));
} else if (mode == 'b') {// 控制第二个 LED 灯
digitalWrite(ledPins[1], !digitalRead(ledPins[1]));
} else if (mode == 'c') {// 控制第三个 LED 灯
digitalWrite(ledPins[2], !digitalRead(ledPins[2]));
} else if (mode == 'd') {// 控制第四个 LED 灯
digitalWrite(ledPins[3], !digitalRead(ledPins[3]));
} else if (mode == 'e') {// 控制第五个 LED 灯
digitalWrite(ledPins[4], !digitalRead(ledPins[4]));
} else if (mode == 'f') {// 控制第六个 LED 灯
digitalWrite(ledPins[5], !digitalRead(ledPins[5]));
} else if (mode == 'g') {// 控制第七个 LED 灯
digitalWrite(ledPins[6], !digitalRead(ledPins[6]));
} else if (mode == 'h') {// 控制第八个 LED 灯
digitalWrite(ledPins[7], !digitalRead(ledPins[7]));
}
}
}
void timerCallback() {
digitalWrite(ledPins[currentLed], LOW); // 熄灭当前 LED 灯
currentLed = (currentLed + 1) % ledCount; // 计算下一个 LED 灯的编号
digitalWrite(ledPins[currentLed], HIGH); // 点亮下一个 LED 灯
// 每隔一定时间间隔计算外部脉冲的频率
if (millis() - lastTime > 1000) {
float frequency = count / ((millis() - lastTime) / 1000.0);
Serial.print("Frequency: ");
Serial.print(frequency);
Serial.println(" Hz");
count = 0; // 重置计数器
lastTime = millis(); // 更新时间戳
}
}
void pulseCount() {
count++; // 每次触发外部脉冲时计数器加 1
}