查看: 418|回复: 8

ADC模拟输入读取独立按键值

[复制链接]
  • TA的每日心情
    开心
    2019-9-20 18:45
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-7-29 11:30 | 显示全部楼层 |阅读模式
    在论坛H2O了这么久,给大家分享一个实用的小技巧!在使用按键与单片机进行人机交互时,觉得按键太占用I/O引脚,一个独立按键就占用一个I/O口,十分浪费单片机资源。使用矩阵按键,虽说能节省一半的引脚,但一个4*4的矩阵按键也得用到八个I/O,数量还是比较惊人。为解决按键占用过多I/O口这个问题,小弟查了一下,可以使用带IIC的按键,只占用两个I/O(SDA与SCL),但这不是我要说的重点。小弟苦思冥想许久,终思得一计(帖中所诉方法由本人思考而得,若有前辈在此贴之前使用过,纯属雷同),那就是利用模拟输入去读取按键。其原理为:在VCC与GND之间串接若干个电阻,电阻与电阻之间的节点使用按键接到GND,ADC模拟输入引脚接入某一节点,当有按键按下后,ADC模拟输入引脚上的电压就会改变,由此识别到按键按下。具体原理如下:

    以四个独立按键为例

    以四个独立按键为例
      
    如图示:(以四个按键为例,读者可根据需要自行增加,选取适当的电阻值,能使读取区间变宽)按图中所选电阻参数(VCC=5V),无按键按下时,ADC=4±0.1V ;SW1按下:ADC=0V;SW2按下:ADC=1±0.1V;SW3按下:ADC=2±0.1V;SW4按下:ADC=3±0.1V 。其中R2与C1组成一个低通滤波器,起消抖作用。
    用串口看一下各按键对应的AD数值:
    void setup() {
      // put your setup code here, to run once:
        Serial.begin(9600);               //串口波特率  
    }

    void loop() {
        Serial.println(analogRead(A3));        //ADC输入引脚
        delay(100);
    }

    读取按键的时候,不要识别具体的数值,而要识别一个区间,这样当电源电压有所波动的时候,不会影响按键读取。如:SW1按下的AD值为0,可这么识别if(analogRead(A3)<5 )// ;SW2按下的AD值为196,可这么识别if(analogRead(A3)>190&&analogRead(A3)<200 )//
  • TA的每日心情
    开心
    2019-9-20 18:45
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2019-7-30 20:52 | 显示全部楼层

    哈哈哈,就会点儿简单的,你才是真厉害
  • TA的每日心情
    奋斗
    2019-8-25 00:01
  • 签到天数: 87 天

    [LV.6]常住居民II

    发表于 2019-8-16 21:40 | 显示全部楼层
    谢谢啦!拯救了我
    觉得好就打赏一下吧!!让我有动力继续写教程
  • TA的每日心情
    开心
    2019-8-20 11:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-8-20 10:58 | 显示全部楼层
    这思路好啊有点意思
  • TA的每日心情
    奋斗
    2019-8-25 00:01
  • 签到天数: 87 天

    [LV.6]常住居民II

    发表于 2019-8-21 20:43 | 显示全部楼层
    我试过了 好像不行233
    觉得好就打赏一下吧!!让我有动力继续写教程
  • TA的每日心情
    开心
    2019-9-20 18:45
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2019-8-25 13:10 | 显示全部楼层
    新手之帆 发表于 2019-8-21 20:43
    我试过了 好像不行233

    哈哈哈,电路没焊对吧
  • TA的每日心情
    奋斗
    2019-8-25 00:01
  • 签到天数: 87 天

    [LV.6]常住居民II

    发表于 2019-8-25 15:21 | 显示全部楼层
    WT..#/#/..WT 发表于 2019-8-25 13:10
    哈哈哈,电路没焊对吧

    有啊 最后我用分压网络才能行 打的板子上飞了几条线2333
    觉得好就打赏一下吧!!让我有动力继续写教程
  • TA的每日心情
    开心
    2019-9-20 18:45
  • 签到天数: 5 天

    [LV.2]偶尔看看I

     楼主| 发表于 2019-8-25 19:32 | 显示全部楼层
    新手之帆 发表于 2019-8-25 15:21
    有啊 最后我用分压网络才能行 打的板子上飞了几条线2333

    哈哈,就这点儿东西,看一眼就知道可行与否了。你自己研究吧
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    求ESP8266+0.96oled的天气代码
    求ESP8266+0.96oled的天气
    新人求助
    新人求助
    仿真出错!显示原因是这个,但是找不到该出错文件
    用Arduino制作支持ROS机器人操作系统的7轴机械臂
    用Arduino制作支持ROS机器
    参赛项目:[/backcolor] 用Arduino制作支持ROS机器人操作系统的7轴机械臂[/backcolor
    为拍月亮而生的便携望远镜系统。
    为拍月亮而生的便携望远镜
    参赛项目: 便携望远镜系统 参赛组员: 1人 布丁:嵌入式软件、上位机软件、电路、结
    光敏电阻检测环境光实验
    光敏电阻检测环境光实验
    本文节选自《Arduino程序设计基础》 一些简单的电子元件就可以做传感器使用,例如我
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表