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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 949|回复: 23

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

[复制链接]
发表于 2022-8-25 01:12 | 显示全部楼层 |阅读模式
现在是按下去电机转动,松开按钮就停止转动,求助怎么按键锁定。


  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. boolean direct = false;

  8. int val=0;
  9. int old_val=0;
  10. int state=0;
  11. int motorSpeed = 1200;  //设置步进速度变量

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

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

  22. void loop()
  23. {   
  24.             if(digitalRead(key1)==HIGH)
  25.             {
  26.               clockwise(); //正传
  27.             }
  28.             if(digitalRead(key2)==LOW)
  29.             {
  30.               anticlockwise(); //反转
  31.            }
  32. }

  33. boolean key_scan() //检测外部按键是否有按下;
  34. {
  35.         if(digitalRead(key1) == HIGH)   //按键1检测
  36.         {
  37.                 delay(20); //前沿延时消抖;
  38.                 if(digitalRead(key1) == HIGH)
  39.                 {
  40.                         direct = true; //有按下,取反direct;
  41.                 }
  42.                 while(digitalRead(key1) == HIGH); //a等待按键松开,后沿不消抖处理;
  43.         }


  44.         if(digitalRead(key2) == LOW)   //按键2检测
  45.         {
  46.                 delay(20); //前沿延时消抖;
  47.                 if(digitalRead(key2) == LOW)
  48.                 {
  49.                         direct = true; //有按下,取反direct;
  50.                 }
  51.                 while(digitalRead(key2) == LOW); //a等待按键松开,后沿不消抖处理;
  52.         }

  53.         return direct;
  54. }


  55. void clockwise() //顺时针
  56. { for(int j= 0;j<5;j++)
  57. {
  58.   for(int i = 7; i >= 0; i--)
  59.   {
  60.     setOutput(i);
  61.     delayMicroseconds(motorSpeed);
  62.   }
  63. }
  64. }
  65. void anticlockwise() //逆时针
  66. {
  67.   
  68. { for(int i = 0; i < 8; i++)
  69.   {
  70.     setOutput(i);
  71.     delayMicroseconds(motorSpeed);
  72.   }
  73.   }
  74. }

  75. void setOutput(int out)
  76.   {
  77.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  78.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  79.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  80.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  81.    }
复制代码


发表于 2022-8-25 11:02 | 显示全部楼层
做标记位。
按下按钮做一个变量的标记,然后去判断变量
 楼主| 发表于 2022-8-25 13:56 | 显示全部楼层
int_i 发表于 2022-8-25 11:02
做标记位。
按下按钮做一个变量的标记,然后去判断变量

改成这样还是不行,能帮我改改吗,谢谢!
  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 zheng=0;       //变量zheng
  9. int fan=0;       //变量fan

  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(10); //前沿延时消抖;
  29.                 if(digitalRead(key1) == HIGH)
  30.       {
  31.      while(digitalRead(key1) == HIGH);
  32.      if(zheng==0)
  33.      {
  34.        zheng=1;
  35.        clockwise(); //正传
  36.      }
  37.      else
  38.      {
  39.          stop1();
  40.          zheng=0;
  41.        }
  42.      }

  43.         }


  44.         if(digitalRead(key2) == LOW)   //按键2检测
  45.         {
  46.                 delay(10); //前沿延时消抖;
  47.                 if(digitalRead(key2) == LOW)
  48.       {
  49.      while(digitalRead(key2) == LOW);
  50.      if(fan==0)
  51.      {
  52.        fan=1;
  53.        anticlockwise(); //反转
  54.      }
  55.      else
  56.      {
  57.         stop1();
  58.          fan=0;
  59.        }
  60.      }
  61.      
  62.               
  63.         }


  64. }


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

  75. void anticlockwise() //逆时针
  76. {
  77.   
  78. { for(int i = 0; i < 8; i++)
  79.   {
  80.     setOutput(i);
  81.     delayMicroseconds(motorSpeed);
  82.   }
  83.   }
  84. }

  85. void setOutput(int out)
  86.   {
  87.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  88.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  89.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  90.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  91.    }
  92.    
  93. void stop1() {
  94.   digitalWrite(motorPin1, 0);
  95.   digitalWrite(motorPin2, 0);
  96.   digitalWrite(motorPin3, 0);
  97.   digitalWrite(motorPin4, 0);
  98.   }
复制代码

发表于 2022-8-25 15:12 | 显示全部楼层
if(digitalRead(key1)==0)
{
i=0;//前面定义一下
delay(200);
}
if(digitalRead(key2)==0)
{
i=1;//前面定义一下
delay(200);
}
if(i==0)
{
clockwise(); //正传
}
if(i==1)
{
anticlockwise(); //反转
}
 楼主| 发表于 2022-8-25 15:34 | 显示全部楼层
int_i 发表于 2022-8-25 15:12
if(digitalRead(key1)==0)
{
i=0;//前面定义一下

老大,这样直接跑不动了,出错了。
  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 lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

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

  18. void loop()
  19. {

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

  38. }


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

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

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

  58. void setOutput(int out)
  59. {
  60.   digitalWrite(motorPin1, bitRead(lookup[out], 0));
  61.   digitalWrite(motorPin2, bitRead(lookup[out], 1));
  62.   digitalWrite(motorPin3, bitRead(lookup[out], 2));
  63.   digitalWrite(motorPin4, bitRead(lookup[out], 3));
  64. }
复制代码
发表于 2022-8-25 15:37 | 显示全部楼层
38151987 发表于 2022-8-25 15:34
老大,这样直接跑不动了,出错了。

变量i你在前面定义一下,我没定义的,程序会报错  ,定义一下int i=2;
 楼主| 发表于 2022-8-25 16:41 | 显示全部楼层
int_i 发表于 2022-8-25 15:37
变量i你在前面定义一下,我没定义的,程序会报错  ,定义一下int i=2;

这样可以运行,但是不按按钮电机也在正转,非常慢,
按键1按住可以转快点,
按键2按住也在抖动慢转,
这样好像还是不对,按键1要上拉,按键2要下拉,

            if(digitalRead(key1)==HIGH)
            {
              clockwise(); //正传
            }
            if(digitalRead(key2)==LOW)
            {
              anticlockwise(); //反转
           }

原来这样按住还可以转正常转,不能锁定,现在直接不按都在抖动,按住也不对哦。




  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 i=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.     i = 0; //前面定义一下
  24.     delay(200);
  25.   }
  26.   if (digitalRead(key2) == 0)
  27.   {
  28.     i = 1; //前面定义一下
  29.     delay(200);
  30.   }
  31.   if (i == 0)
  32.   {
  33.     clockwise(); //正传
  34.   }
  35.   if (i == 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 16:47 | 显示全部楼层
你的效果是不是要按下按钮1后正转,按钮2反转呢?

按照程序,你的两个按钮都得是上拉电阻接线才行。
发表于 2022-8-25 16:48 | 显示全部楼层
另外还有就是我没看见你的for循环也是用i定义的,你把我那个变量换一个名字
 楼主| 发表于 2022-8-25 16:51 | 显示全部楼层
int_i 发表于 2022-8-25 16:47
你的效果是不是要按下按钮1后正转,按钮2反转呢?

按照程序,你的两个按钮都得是上拉电阻接线才行。 ...

我想实现的是不按不转,按键1按下实现正传10圈,按键2按下反转5圈,我用的是esp12f模块,12脚上拉正常,14脚下拉正常,都上拉就不正常了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 00:58 , Processed in 0.121776 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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