const int FS = 0;//发球按键
const int SJ = 1;//随机发射按键
//74HC165
const int dataPin_165 = 2; //74HC165-dataPin
const int clockPin_165 = 3; //74HC165-clockPin
const int latchPin_165 = 4; //74HC165-latchPin
//四位数码管
const int DIO = 5; //数码管DIO
const int RCLK = 6;//数码管RCLK
const int SCLK = 7;//数码管SCLK
//74HC595
const int clockPin_595 = 8; //74HC595-clockPin
const int latchPin_595 = 9; //74HC595-latchPin
const int dataPin_595 = 10; //74HC595-dataPin
//模拟量输入
const int DWQ = A0;//调速电位器
const int XYG = A1;//X摇杆
const int YYG = A2;//Y摇杆
// 定义四个点亮时长(毫秒)
const int durations[] = {5000, 10000, 15000, 20000};
unsigned long startTime2 = 0; //电机2随机启动时间
unsigned long startTime3 = 0; //电机3随机启动时间
unsigned long dj_2_Duration = 0; //电机2随机运行时间
unsigned long dj_3_Duration = 0; //电机3随机运行时间
unsigned long currentTime2 =0;//电机2随机运行比较时间
unsigned long currentTime3 =0;//电机3随机运行比较时间
void setup() {
Serial.begin(9600);
//两个按键
pinMode(FS,INPUT_PULLUP);
pinMode(SJ,INPUT_PULLUP);
//四位数码管
pinMode(SCLK,OUTPUT);
pinMode(RCLK,OUTPUT);
pinMode(DIO,OUTPUT);
//74HC165
pinMode(dataPin_165, INPUT);
pinMode(clockPin_165, OUTPUT);
pinMode(latchPin_165, OUTPUT);
//74HC595
pinMode(dataPin_595, OUTPUT);
pinMode(clockPin_595, OUTPUT);
pinMode(latchPin_595, OUTPUT);
}
void loop() {
//定义摇杆模拟量
int left_right = analogRead(XYG);
int up_down = analogRead(YYG);
//
// put your main code here, to run repeatedly:
if(digitalRead(FS)==0)//发射按键判断
{
delay(50);
if(digitalRead(FS)==0)
{
//延时发射时间
delay(3000);//延时3S发射
fs_motion();
}
}
if(left_right<450)//左右摇杆,向右
{
Serial.print("left_right:");
Serial.println(left_right);
if(read165()!=0b00100000)//3号判断电机2正限位是否被触发
{
//电机2正转
dj_2_Z();
}else
{
Serial.print("right_stop:");
//电机停止
dj_S();
}
}
if(left_right>580)//左右摇杆,向左
{
Serial.print("left_right:");
Serial.println(left_right);
if(read165()!=0b00010000)//4号判断电机2负限位是否被触发
{
//电机2反转
dj_2_F();
}else
{
Serial.print("left_stop:");
//电机停止
dj_S();
}
}
// if(450 <= left_right <= 580)//左右摇杆,居中
// {
// //电机停止
// dj_S();
// }
if(up_down>580)//上下摇杆,向上
{
Serial.print("up_down:");
Serial.println(up_down);
if(read165()!=0b00100000)//5号判断电机3正限位是否被触发
{
//电机3正转
dj_3_Z();
}else
{
Serial.print("up_stop:");
//电机停止
dj_S();
}
}
if(up_down<450)//上下摇杆,向下
{
Serial.print("up_down:");
Serial.println(up_down);
if(read165()!=0b00010000)//6号判断电机3负限位是否被触发
{
//电机3反转
dj_3_F();
}else
{
Serial.print("down_stop:");
//电机停止
dj_S();
}
}
// if(450 <= up_down <= 580)//上下摇杆,居中
// {
// //电机停止
// dj_S();
// }
if(digitalRead(SJ)==0)//随机按键触发
{
delay(50);
if(digitalRead(SJ)==0)
{
Serial.println("SJ----");
//随机取出电机2运行时间
dj_2_Duration = getRandomDuration();
// delay(100);
// Serial.println("DJ2-SJ-TIME:");
// Serial.println(dj_2_Duration);
//取出时间加上当前时间,用于倒计时
startTime2=millis()+dj_2_Duration;
// delay(100);
// Serial.print("DJ2-FINALL:");
// Serial.println(startTime2);
//水平电机随机运动函数
dj_2_SJ();
//两次随机运动缓存时间
delay(500);
// 获取电机3的随机时长
dj_3_Duration = getRandomDuration();
startTime3=millis()+dj_3_Duration;
// Serial.println("DJ3-SJ-TIME");
// Serial.println(dj_3_Duration);
//记录电机2起始时间
//数值电机随机运动函数
dj_3_SJ();
//动作完成后等待三秒发射球
delay(3000);
//发射球动作
fs_motion();
}
}
}
//水平电机2随机运动函数
void dj_2_SJ()
{
int chosenLed = random(0,2); // 0 或 1
if(chosenLed == 0 )
{
while((currentTime2<startTime2) && (read165()!=0b00100000))
{
dj_2_Z();
currentTime2 = millis();
}
dj_S();
}else
{
while((currentTime2<startTime2) && (read165()!=0b00010000))
{
dj_2_F();
currentTime2 = millis();
}
dj_S();
}
}
//水平电机3随机运动函数
void dj_3_SJ()
{
//取随机方向
int chosenLed2 = random(0,2); // 0 或 1
if(chosenLed2 == 0 )
{
while((currentTime3<startTime3) && (read165()!=0b00001000))
{
dj_3_Z();
currentTime3 = millis();
}
dj_S();
}else
{
while((currentTime3<startTime3) && (read165()!=0b00000100))
{
dj_3_F();
currentTime3 = millis();
}
dj_S();
}
}
unsigned long getRandomDuration() {//取随机时间
// 从durations数组中返回一个随机时长
int randomIndex = random(0,4); // 生成0到3之间的随机索引
return durations[randomIndex];
}
void fs_motion(){//发射按键动作
//电机1正转
dj_1_Z();
//电机1正限位触发
while(read165()!=0b10000000)
{
if(read165()==0b10000000)
{
delay(100);
// Serial.println("xiangdeng");
break;
}
}
//电机停止
dj_S();
delay(1000);
//电机1反转
dj_1_F();
//电机1负限位触发
while(read165()!=0b01000000)
{
if(read165()==0b01000000)
{
delay(100);
break;
}
}
//电机停止
dj_S();
}
byte read165()//74HC165读取函数,将165中的Q0-Q7存储成一个字节,低位在前高位在后1000 0000代表Q0触发
{
byte byteValue = 0; // 用于存储转换后的字节值
// Step 1: Sample
digitalWrite(latchPin_165, LOW);
delayMicroseconds(1); // 短暂延迟确保稳定
digitalWrite(latchPin_165, HIGH);
delayMicroseconds(1); // 短暂延迟确保稳定
// Step 2: Shift
for (int i = 0; i < 8; i++) {
int bit = digitalRead(dataPin_165);
if (bit == HIGH) {
byteValue |= (1 << i);
} else {
byteValue |= (0 << i);
}
digitalWrite(clockPin_165, HIGH); // Shift out the next bit
delayMicroseconds(1); // 短暂延迟确保稳定
digitalWrite(clockPin_165, LOW);
delayMicroseconds(1); // 短暂延迟确保稳定
}
return byteValue;
}
void dj_1_Z()//电机1正转
{
Serial.println("DJ1-Z");
byte moastart = B00000001;//74HC595-A-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, moastart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_1_F()//电机1反转
{
Serial.println("DJ1-F");
byte moafstart = B00000010;//74HC595-B-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, moafstart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_S()//电机停止
{
// Serial.println("DJ-S");
byte mostop = B00000000;//74HC595-A-HIGH
shiftOut(dataPin_595, clockPin_595, MSBFIRST, mostop);
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_2_Z()//电机2正转
{
// Serial.println("电机2正转");
byte mobstart = B00000100;//74HC595-C-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, mobstart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_2_F()//电机2反转
{
// Serial.println("电机1反转");
byte mobfstart = B00001000;//74HC595-D-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, mobfstart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_3_Z()//电机3正转
{
// Serial.println("电机2正转");
byte mocstart = B00010000;//74HC595-E-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, mocstart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}
void dj_3_F()//电机3反转
{
// Serial.println("电机1反转");
byte mocfstart = B00100000;//74HC595-F-HIGH 反序
// 使用shiftOut函数发送数据到74HC595
shiftOut(dataPin_595, clockPin_595, MSBFIRST, mocfstart);
// 上升沿锁存数据
digitalWrite(latchPin_595, HIGH); // 锁存数据
delayMicroseconds(1); // 保持高电平一小段时间
digitalWrite(latchPin_595, LOW); // 准备下一次移位
}