新手求助,怎么才能锁定按键-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

123
返回列表 发新帖
楼主: 38151987

[未解决] 新手求助,怎么才能锁定按键

[复制链接]
发表于 2022-8-25 19:28 | 显示全部楼层
主程序应该这样:
void loop()
  {   
ScanKey();
if (KEY1_num==1)
{
KEY2_num=0;
clockwise();
}//正传
if (KEY2_num==1)
{
KEY1_num=0;
anticlockwise();
}//反转
  }
自定义函数中的正反转控制语句去掉
 楼主| 发表于 2022-8-25 23:44 | 显示全部楼层
djzwxx@126.com 发表于 2022-8-25 19:28
主程序应该这样:
void loop()
  {   

谢谢大佬的回复,按键是彻底锁住了,
我想实现 按键1按过,正传30圈,再反转35圈,停止。
然后按键2按过,反转20圈,再正传15圈,停止。
现在是按键按过一直往一个方向转,停不下来,只能按原键停止。
  1. int motorPin1 = 13;
  2. int motorPin2 = 5;
  3. int motorPin3 = 4;
  4. int motorPin4 = 2;
  5. const int KEY1 = 12; // 正传按钮
  6. const int KEY2 = 14; // 反转按钮

  7. int motorSpeed = 1200;  //设置步进速度

  8. int KEY1_NUM = 0;
  9. int KEY2_NUM = 0;

  10. int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

  11. void setup() {
  12.   pinMode(motorPin1, OUTPUT);
  13.   pinMode(motorPin2, OUTPUT);
  14.   pinMode(motorPin3, OUTPUT);
  15.   pinMode(motorPin4, OUTPUT);
  16.   pinMode(KEY1, INPUT);
  17.   pinMode(KEY2, INPUT);
  18.   Serial.begin(115200);
  19. }

  20. void loop()
  21. {
  22.   ScanKey();
  23.   if (KEY1_NUM == 1)
  24.   {
  25.     KEY2_NUM = 0;
  26.     clockwise();//正传
  27.      }
  28.     if (KEY2_NUM == 1)
  29.     {
  30.     KEY1_NUM = 0;
  31.     anticlockwise();//反转
  32.     }
  33. }

  34. void ScanKey()                //按键
  35. {
  36.   if (digitalRead(KEY1) == HIGH)
  37.   {
  38.     delay(30);
  39.     if (digitalRead(KEY1) == HIGH)
  40.     {
  41.       if (KEY1_NUM == 0) {
  42.         KEY1_NUM = 1;
  43.         while (digitalRead(KEY1) == HIGH);
  44.       }
  45.       else if (KEY1_NUM == 1) {
  46.         KEY1_NUM = 0;
  47.         while (digitalRead(KEY1) == HIGH);
  48.       }
  49.     }
  50.     while (digitalRead(KEY1) == HIGH);
  51.   }


  52.   if (digitalRead(KEY2) == LOW) //按键2检测
  53.   {
  54.     delay(30);
  55.     if (digitalRead(KEY2) == LOW)
  56.     {
  57.       if (KEY2_NUM == 0) {
  58.         KEY2_NUM = 1;
  59.         while (digitalRead(KEY2) == LOW);
  60.       }
  61.       else if (KEY2_NUM == 1) {
  62.         KEY2_NUM = 0;
  63.         while (digitalRead(KEY2) == LOW);
  64.       }
  65.     }
  66.     while (digitalRead(KEY2) == LOW);

  67.   }

  68. }
  69. void clockwise() //顺时针
  70. { for (int j = 0; j < 5; j++)
  71.   {
  72.     for (int i = 7; i >= 0; i--)
  73.     {
  74.       setOutput(i);
  75.       delayMicroseconds(motorSpeed);
  76.     }
  77.   }
  78. }

  79. void anticlockwise() //逆时针
  80. {

  81.   { for (int i = 0; i < 8; i++)
  82.     {
  83.       setOutput(i);
  84.       delayMicroseconds(motorSpeed);
  85.     }
  86.   }
  87. }

  88. void setOutput(int out)
  89. {
  90.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  91.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  92.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  93.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  94. }
复制代码
发表于 2022-8-26 09:52 | 显示全部楼层
按你的要求,那就不用锁住按键。照下面这样可能就行了:
int motorPin1 = 13;
int motorPin2 = 5;
int motorPin3 = 4;
int motorPin4 = 2;
const int KEY1 = 12; // 正传按钮
const int KEY2 = 14; // 反转按钮

int motorSpeed = 1200;  //设置步进速度

int KEY1_NUM = 0;
int KEY2_NUM = 0;

int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(KEY1, INPUT);
  pinMode(KEY2, INPUT);
  Serial.begin(115200);
}

void loop()
{
  ScanKey();
  if (KEY1_NUM == 1)
  {
    KEY1_NUM = 0;
    clockwise();//正传
    anticlockwise();//反转
     }
    if (KEY2_NUM == 1)
    {
    KEY2_NUM = 0;
    anticlockwise();//反转
    clockwise();//正传
    }
}

void ScanKey()                //按键
{
  if (digitalRead(KEY1) == HIGH)
  {
    delay(30);
    if (digitalRead(KEY1) == HIGH)
    {
        KEY1_NUM = 1;
        while (digitalRead(KEY1) == HIGH);
      }
    }

  if (digitalRead(KEY2) == LOW) //按键2检测
  {
    delay(30);
    if (digitalRead(KEY2) == LOW)
    {
        KEY2_NUM = 1;
        while (digitalRead(KEY2) == LOW);
    }
    while (digitalRead(KEY2) == LOW);

  }

}
void clockwise() //顺时针
{ for (int j = 0; j < 5; j++)
  {
    for (int i = 7; i >= 0; i--)
    {
      setOutput(i);
      delayMicroseconds(motorSpeed);
    }
  }
}

void anticlockwise() //逆时针
{

  { for (int i = 0; i < 8; i++)
    {
      setOutput(i);
      delayMicroseconds(motorSpeed);
    }
  }
}

void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}
 楼主| 发表于 2022-8-26 11:40 | 显示全部楼层
djzwxx@126.com 发表于 2022-8-26 09:52
按你的要求,那就不用锁住按键。照下面这样可能就行了:
int motorPin1 = 13;
int motorPin2 = 5;

非常谢谢大佬的耐心解答,我改用库文件解决了。
按钮按过运行结束后,电机在发热,是不是我的主程序有问题,没有真正停下来?
  1. #include <Stepper.h>

  2. const int stepsPerRevolution = 32;

  3. const int key1 = 12; // 正传按钮
  4. const int key2 = 14; // 反转按钮
  5. boolean direct = false; //电机转向,初始化为正转;

  6. Stepper myStepper(stepsPerRevolution, 13, 4, 5, 2);

  7. void setup() {
  8.   myStepper.setSpeed(500);  //设置转速
  9.   pinMode(key1, INPUT);
  10.   pinMode(key2, INPUT);
  11.   Serial.begin(115200);
  12. }

  13. void loop() {
  14.   //先正转20圈,再反转25圈,再正传5圈

  15.   if (digitalRead(key1) == HIGH)
  16.   {
  17.     Serial.println("先正转4");
  18.     myStepper.step(312);
  19.     delay(0);
  20.     myStepper.step(312);
  21.     delay(0);
  22.     myStepper.step(312);
  23.     delay(0);
  24.     myStepper.step(312);
  25.     delay(3000);
  26.     Serial.println("反转6");
  27.     myStepper.step(-312);
  28.     delay(0);
  29.     myStepper.step(-312);
  30.     delay(0);
  31.     myStepper.step(-312);
  32.     delay(0);
  33.     myStepper.step(-312);
  34.     delay(0);
  35.     myStepper.step(-312);
  36.     delay(0);
  37.     myStepper.step(-312);
  38.     delay(500);
  39.     Serial.println("正转5,归位");
  40.     myStepper.step(312);
  41.     delay(0);
  42.     myStepper.step(312);
  43.   }

  44.   if (digitalRead(key2) == LOW)
  45.   {
  46.     Serial.println("反转4");
  47.     myStepper.step(-312);
  48.     delay(0);
  49.     myStepper.step(-312);
  50.     delay(0);
  51.     myStepper.step(-312);
  52.     delay(0);
  53.     myStepper.step(-312);
  54.     Serial.println("正转4");
  55.     myStepper.step(312);
  56.     delay(0);
  57.     myStepper.step(312);
  58.     delay(0);
  59.     myStepper.step(312);
  60.     delay(0);
  61.     myStepper.step(312);
  62.   }

  63. }

  64. boolean key_scan() //检测外部按键是否有按下;
  65. {
  66.   if (digitalRead(key1) == HIGH)  //按键1检测
  67.   {
  68.     delay(20); //前沿延时消抖;
  69.     if (digitalRead(key1) == HIGH)
  70.     {
  71.       direct = true; //有按下,取反direct;
  72.     }
  73.     while (digitalRead(key1) == HIGH); //a等待按键松开,后沿不消抖处理;
  74.   }


  75.   if (digitalRead(key2) == LOW)  //按键2检测
  76.   {
  77.     delay(20); //前沿延时消抖;
  78.     if (digitalRead(key2) == LOW)
  79.     {
  80.       direct = true; //有按下,取反direct;
  81.     }
  82.     while (digitalRead(key2) == LOW); //a等待按键松开,后沿不消抖处理;
  83.   }

  84.   return direct;
  85. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:51 , Processed in 0.364904 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表