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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 38151987

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

[复制链接]
发表于 2022-8-25 16:55 | 显示全部楼层
38151987 发表于 2022-8-25 16:51
我想实现的是不按不转,按键1按下实现正传10圈,按键2按下反转5圈,我用的是esp12f模块,12脚上拉正常,1 ...

哦哦,那14号就用外部下拉接线试试,另外可能那个变量i也有冲突。
 楼主| 发表于 2022-8-25 17:02 | 显示全部楼层
int_i 发表于 2022-8-25 16:55
哦哦,那14号就用外部下拉接线试试,另外可能那个变量i也有冲突。

问题还是一样,通电一步一步的慢正转,按key1按钮可以正常转,按key2一步一步慢反正,按钮都不按,松开和刚通电一样慢转。
  1. int motorPin1 = 13;
  2. int motorPin2 = 5;
  3. int motorPin3 = 4;
  4. int motorPin4 = 0;
  5. const int key1 = 12; // 正传按钮
  6. const int key2 = 14; // 反转按钮

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

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

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

  19. void loop()
  20. {

  21.   if (digitalRead(key1) == 0)
  22.   {
  23.     kk = 0; //前面定义一下
  24.     delay(200);
  25.   }
  26.   if (digitalRead(key2) == 0)
  27.   {
  28.     kk = 1; //前面定义一下
  29.     delay(200);
  30.   }
  31.   if (kk == 0)
  32.   {
  33.     clockwise(); //正传
  34.   }
  35.   if (kk == 1)
  36.   {
  37.     anticlockwise(); //反转
  38.   }

  39. }


  40. void clockwise() //顺时针
  41. { for (int j = 0; j < 5; j++)
  42.   {
  43.     for (int i = 7; i >= 0; i--)
  44.     {
  45.       setOutput(i);
  46.       delayMicroseconds(motorSpeed);
  47.     }
  48.   }
  49. }

  50. void anticlockwise() //逆时针
  51. {

  52.   { for (int i = 0; i < 8; i++)
  53.     {
  54.       setOutput(i);
  55.       delayMicroseconds(motorSpeed);
  56.     }
  57.   }
  58. }

  59. void setOutput(int out)
  60. {
  61.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  62.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  63.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  64.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  65. }
复制代码
发表于 2022-8-25 17:04 | 显示全部楼层
先设置一个按键变量
int KEY1_NUM = 0;   
再设置
pinMode(KEY1,INPUT_PULLUP);    //定义KEY为带上拉输入引脚
然后按下面这样就可以了。在程序中根据按键变量的值来判断按键是否按下。
  if(digitalRead(KEY1) == LOW)
    {
      delay(30);
      if(digitalRead(KEY1) == LOW)
        {
          if (KEY1_NUM == 0) {KEY1_NUM = 1;while(digitalRead(KEY1) == LOW);}
          else if (KEY1_NUM == 1) {KEY1_NUM = 0;while(digitalRead(KEY1) == LOW);}
         }
        while(digitalRead(KEY1) == LOW);
     }
在程序中根据按键变量的值来判断按键是否按下。
发表于 2022-8-25 17:36 | 显示全部楼层
djzwxx@126.com 发表于 2022-8-25 17:04
先设置一个按键变量
int KEY1_NUM = 0;   
再设置

逆时针转动的函数里面是不是少了一个for循环?
 楼主| 发表于 2022-8-25 17:38 | 显示全部楼层
int_i 发表于 2022-8-25 17:36
逆时针转动的函数里面是不是少了一个for循环?

和那个好像没有关系,一开始的代码是可以正常反转的,只是按键不能锁定,按住可以正常转动的。
 楼主| 发表于 2022-8-25 17:58 | 显示全部楼层
djzwxx@126.com 发表于 2022-8-25 17:04
先设置一个按键变量
int KEY1_NUM = 0;   
再设置

按你说的设置,还是不行哦,输出上拉都试过也不行。
  1. int motorPin1 = 13;
  2. int motorPin2 = 5;
  3. int motorPin3 = 4;
  4. int motorPin4 = 0;
  5. const int KEY1=12; // 正传按钮   ESP12f gpio12 上拉
  6. const int KEY2=14; // 反转按钮   ESP12f gpio14 下拉

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

  24. int key_scan() //检测外部按键是否有按下;
  25.   {


  26.   if(digitalRead(KEY1) == HIGH) //按键1检测
  27.     {
  28.       delay(30);
  29.       if(digitalRead(KEY1) == HIGH)
  30.         {
  31.           if (KEY1_NUM == 0) {KEY1_NUM = 1;while(digitalRead(KEY1) == HIGH);}
  32.           else if (KEY1_NUM == 1) {KEY1_NUM = 0;while(digitalRead(KEY1) == HIGH);}
  33.          }
  34.         while(digitalRead(KEY1) == HIGH);
  35.         clockwise(); //正传
  36.      }


  37.   if(digitalRead(KEY2) == LOW) //按键2检测
  38.     {
  39.       delay(30);
  40.       if(digitalRead(KEY2) == LOW)
  41.         {
  42.           if (KEY2_NUM == 0) {KEY2_NUM = 1;while(digitalRead(KEY2) == LOW);}
  43.           else if (KEY2_NUM == 1) {KEY2_NUM = 0;while(digitalRead(KEY2) == LOW);}
  44.          }
  45.         while(digitalRead(KEY2) == LOW);
  46.         anticlockwise(); //反转
  47.      }



  48. }
  49. void clockwise() //顺时针
  50. { for(int j= 0;j<5;j++)
  51. {
  52.   for(int i = 7; i >= 0; i--)
  53.   {
  54.     setOutput(i);
  55.     delayMicroseconds(motorSpeed);
  56.   }
  57. }
  58. }

  59. void anticlockwise() //逆时针
  60. {
  61.   
  62. { for(int i = 0; i < 8; i++)
  63.   {
  64.     setOutput(i);
  65.     delayMicroseconds(motorSpeed);
  66.   }
  67.   }
  68. }

  69. void setOutput(int out)
  70.   {
  71.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  72.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  73.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  74.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  75.    }
复制代码
发表于 2022-8-25 18:00 | 显示全部楼层
//我拿两个按钮空灯,一个按钮按下后灯亮两秒关闭,另一个按下后亮0.5秒关闭,测试结果正常
int i = 0;
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, OUTPUT);

}

void loop() {
  
  if (digitalRead(2) == 1)
  {
    i = 1;
    delay(200);
  }
  if (digitalRead(3) == 1)
  {
    i = 2;
    delay(200);
  }
  if (i == 1)
  {
    digitalWrite(4, 1);
    delay(2000);
    digitalWrite(4, 0);
    i = 0;
  }
  if (i == 2)
  {
    digitalWrite(4, 1);
    delay(500);
    digitalWrite(4, 0);
    i = 0;
  }


}
发表于 2022-8-25 18:17 | 显示全部楼层
  if(digitalRead(KEY2) == LOW) //按键2检测
    {
      delay(30);
      if(digitalRead(KEY2) == LOW)
        {
          if (KEY2_NUM == 0) {KEY2_NUM = 1;while(digitalRead(KEY2) == LOW);}
          else if (KEY2_NUM == 1) {KEY2_NUM = 0;while(digitalRead(KEY2) == LOW);}
         }
        while(digitalRead(KEY2) == LOW);
这是一个自定义函数的内容,完整是这样的::
void ScanKey()                //自定义函数
{
  if(digitalRead(KEY1) == LOW)
    {
      delay(30);
      if(digitalRead(KEY1) == LOW)
        {
          if (KEY1_NUM == 0) {KEY1_NUM = 1;while(digitalRead(KEY1) == LOW);}
          else if (KEY1_NUM == 1) {KEY1_NUM = 0;while(digitalRead(KEY1) == LOW);}
         }
        while(digitalRead(KEY1) == LOW);
     }
     }
然后在void loop()后面加上: ScanKey(); 以后在程序中直接:if (KEY1_num=  就可以了
 楼主| 发表于 2022-8-25 18:32 | 显示全部楼层
djzwxx@126.com 发表于 2022-8-25 18:17
if(digitalRead(KEY2) == LOW) //按键2检测
    {
      delay(30);

按键1,按一下,就会抖一下;按键2直接没有反应了

  1. int motorPin1 = 13;
  2. int motorPin2 = 5;
  3. int motorPin3 = 4;
  4. int motorPin4 = 0;
  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_PULLUP);
  17.    pinMode(KEY2,INPUT_PULLUP);
  18.   Serial.begin(115200);
  19. }

  20. void loop()
  21.   {   
  22. ScanKey();
  23.   }



  24. void ScanKey()                //自定义函数
  25. {
  26.   if(digitalRead(KEY1) == LOW)
  27.     {
  28.       delay(30);
  29.       if(digitalRead(KEY1) == LOW)
  30.         {
  31.           if (KEY1_NUM == 0) {KEY1_NUM = 1;while(digitalRead(KEY1) == LOW);}
  32.           else if (KEY1_NUM == 1) {KEY1_NUM = 0;while(digitalRead(KEY1) == LOW);}
  33.          }
  34.         while(digitalRead(KEY1) == LOW);
  35.         clockwise(); //正传
  36.      }


  37.   if(digitalRead(KEY2) == LOW) //按键2检测
  38.     {
  39.       delay(30);
  40.       if(digitalRead(KEY2) == LOW)
  41.         {
  42.           if (KEY2_NUM == 0) {KEY2_NUM = 1;while(digitalRead(KEY2) == LOW);}
  43.           else if (KEY2_NUM == 1) {KEY2_NUM = 0;while(digitalRead(KEY2) == LOW);}
  44.          }
  45.         while(digitalRead(KEY2) == LOW);
  46.         anticlockwise(); //反转
  47.      
  48.      }

  49. }
  50. void clockwise() //顺时针
  51. { for(int j= 0;j<5;j++)
  52. {
  53.   for(int i = 7; i >= 0; i--)
  54.   {
  55.     setOutput(i);
  56.     delayMicroseconds(motorSpeed);
  57.   }
  58. }
  59. }

  60. void anticlockwise() //逆时针
  61. {
  62.   
  63. { for(int i = 0; i < 8; i++)
  64.   {
  65.     setOutput(i);
  66.     delayMicroseconds(motorSpeed);
  67.   }
  68.   }
  69. }

  70. void setOutput(int out)
  71.   {
  72.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  73.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  74.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  75.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  76.    }
  77.    
  78. void stop1() {
  79.   digitalWrite(motorPin1, 0);
  80.   digitalWrite(motorPin2, 0);
  81.   digitalWrite(motorPin3, 0);
  82.   digitalWrite(motorPin4, 0);
  83.   }
复制代码
 楼主| 发表于 2022-8-25 18:35 | 显示全部楼层
int_i 发表于 2022-8-25 18:00
//我拿两个按钮空灯,一个按钮按下后灯亮两秒关闭,另一个按下后亮0.5秒关闭,测试结果正常
int i = 0;
void ...

点灯确实可以,很奇怪,这个不行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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