查看: 762|回复: 2

旋转编码器的使用

[复制链接]
  • TA的每日心情
    无聊
    2019-5-24 13:13
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-5-13 12:03 | 显示全部楼层 |阅读模式
    旋转编码器是一个精确旋转测定和点击合二为一的器件,用它来控制舵机比用电位器要精确得多,同时使用它也实现菜单的选择和修改设置项的值也比使用多个按键的方式方便很多。

    20190512171830670.jpg

    在网上面很容易就找到这些便宜的器件,直接在TB上搜 旋转编码器 即可。
    我买的旋转编码器模块有5个引脚,分别是GND, VCC(+), SW, DT, CLK。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。这个编码器的详细介绍可以看网上的资料,网上面还有不少的例子介绍这个编码器的使用,但在我看来这些例子都是用来讲述原理的,我还是觉得把这些代码封装成一个类来使用更为简单清晰,以下是我封装好再写的两个例子。

    常规的使用:

    kittenblock中小学创客名师推荐的图形化编程软件

    #include "flexmisc.h"
     
    //---------------------------------------------------------------------------------
    /*
    旋转编码器例子1,常规轮询使用
    TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
    如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
    编写:flexitime
    2019-5-12
    */
    //---------------------------------------------------------------------------------
     
    TFlexRotaryEncoder re(2, 3, 4);
     
    void reRotateEvent(int direct){
      Serial.print("Position: ");
      Serial.println(re.getCount());
      if (direct == 1){ Serial.println("Turn Right");}
      if (direct == -1){ Serial.println("Turn Left");};
    }
     
    void reButtonClickEvent(){
      Serial.print("Click ");
      Serial.println(re.getCount());  
    }
     
    void setup() {
      Serial.begin (9600);
      //绑定旋转响应事件,不绑定表示不响应该事件。
      re.attachRotateEvent(reRotateEvent);
      //绑定按键响应事件,不绑定表示不响应该事件。
      re.attachButtonClickEvent(reButtonClickEvent);
      //设置当按下按键时将计数器归 0,默认是不归0;
      re.setClickResetCount(true);
    }
     
    void loop() { 
      //检查旋转编码器的状态。
      re.checkState();
    }
    

    以下这个是利用硬件中断,适应高响应要求的:

    kittenblock中小学创客名师推荐的图形化编程软件

    #include "flexmisc.h"
     
    //---------------------------------------------------------------------------------
    /*
    旋转编码器例子2,使用中断方式调用,当系统处于高负载,无法太好响应轮询时使用
    TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
    如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
    编写:flexitime
    2019-5-12
    */
    //---------------------------------------------------------------------------------
    //旋转编码器的CLK接在Arduino的2脚上,2脚对应的是Arduino中断0
    TFlexRotaryEncoder re(2, 3, 4);
     
    void reRotateEvent(int direct){
      Serial.print("Position: ");
      Serial.println(re.getCount());
      if (direct == 1){ Serial.println("Turn Right");}
      if (direct == -1){ Serial.println("Turn Left");};
    }
     
    void Int0Event(){
      // 注意,在中断调用时无法响应按键事件
      re.checkState();
    }
     
    void setup() {
      Serial.begin (9600);
     
      //绑定旋转响应事件,不绑定表示不响应该事件。
      re.attachRotateEvent(reRotateEvent);
      
      //设置中断0的处理函数,电平变化触发,但此中断无法响应按键事件
      attachInterrupt(0, Int0Event, CHANGE);
      
    }
     
    void loop() { 
      //检测按键事件
      if (re.isClick()){Serial.println("click");};
      
      //假设系统响应很慢~~
      delay(100);
    }
    

    至于 flexmisc.h这个库,我稍晚上传后再补充。


  • TA的每日心情
    开心
    2019-4-4 09:00
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-5-14 22:54 | 显示全部楼层

    flexmisc.h
    在哪里有啊??
  • TA的每日心情
    无聊
    2019-5-24 13:13
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2019-5-23 22:10 | 显示全部楼层
    到的我博客里看看:https://blog.csdn.net/flexitime/article/details/90142596
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    arduino首次编译通过第二次编译必报错
    arduino首次编译通过第二
    如题: 刚打开ide 首次编译 上传都没问题 不管你改不改代码 直接进行 编译 或者上传
    【Arduino】108种传感器系列实验(06)---声音传感器模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    旧版本ide中 ino文件名不能以数字开头,不能有中文?
    旧版本ide中 ino文件名不
    最近下载了站长编著的ARDUINO程序设计基础一书的配套例程。发现用arduino ide打开 里
    用Blinker获取天气信息并用ArduinoJson6分析数据(arduino D1)
    用Blinker获取天气信息并
    在Blinker最新版本的库中我们看到它用了ArduinoJson6,图中的两个类是ArduinoJson6的类
    一波三折,分享我的esp32编译环境搭建arduino
    一波三折,分享我的esp32
    买了个esp-wroom32开发板,想用熟悉的arduino敲代码。 但是上网查遍了所有办法,要么
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表