查看: 580|回复: 8

[已解决] 光耦传感器如何设置不连续相加

[复制链接]
  • TA的每日心情
    擦汗
    2019-5-19 00:00
  • 签到天数: 121 天

    [LV.7]常住居民III

    发表于 2019-1-28 21:32 | 显示全部楼层 |阅读模式
    本帖最后由 thsel 于 2019-1-29 23:54 编辑

    代码在下边.
    光耦传感器接4号数字脚.
    通过遮挡光耦传感器的对射区,计数变量可以记录数值且连续相加.
    但问题来了,我想要实现光耦传感器的对射区被遮挡,计数变量就加1...只加1.不管遮挡多久!
    但现在的情况是,光耦传感器的对射区被遮挡以后,计数变量就一直连续加1,加到离开遮挡为止.
    各位大神,有没有什么好办法解决这个问题啊!

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

    const int PSENSOR = 4;
    int COUNT_X = 0;
    void setup() {
      // put your setup code here, to run once:
      pinMode(PSENSOR, INPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      if (digitalRead(PSENSOR) == 1) {
        COUNT_X++;
        Serial.println(COUNT_X);
        while (digitalRead(PSENSOR) == 0);
      }
    }

    这个下面的截图就是上面的程序产生的,4mm宽的挡片瞬间通过对射区,就产生了50多次的计数.
    sc10.png
  • TA的每日心情
    擦汗
    2019-5-19 00:00
  • 签到天数: 121 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-29 00:38 | 显示全部楼层
    本帖最后由 thsel 于 2019-1-29 23:55 编辑

    问题已经顺利解决.代码如下!


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

    const int SensorPin=4;
    int SensorState=0;
    int lastSensorState=0;
    int SensorCounter=0;
    void setup(){
      pinMode(SensorPin,INPUT);
      Serial.begin(9600);
    }
    void loop(){
      SensorState=digitalRead(SensorPin);
      if(SensorState!=lastSensorState){
        if(SensorState==HIGH){
          SensorCounter++;
          Serial.print("遮挡 ");
          Serial.print("计数 ");
          Serial.println(SensorCounter);
        }
        else{
          Serial.println("通过");
          delay(50);
        }
        lastSensorState=SensorState;
      }
    }
    
  • TA的每日心情
    擦汗
    2019-5-19 00:00
  • 签到天数: 121 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-29 00:32 | 显示全部楼层
    没人回复...唉!!!!!
  • TA的每日心情

    2019-4-23 14:20
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2019-1-29 11:16 | 显示全部楼层

    const int PSENSOR = 4;
    int COUNT_X = 0;
    void setup() {
    // put your setup code here, to run once:
    pinMode(PSENSOR, INPUT);
    Serial.begin(9600);
    }

    void loop() {
    if (digitalRead(PSENSOR) == 0) {
    if (digitalRead(PSENSOR) == 1) {
    COUNT_X++;
    Serial.println(COUNT_X);
    while (digitalRead(PSENSOR) == 0);
    }
    }
    }

  • TA的每日心情
    开心
    2019-5-20 00:06
  • 签到天数: 779 天

    [LV.10]以坛为家III

    发表于 2019-1-29 11:28 | 显示全部楼层
    要么设置中间变量,作为标志,进行判断;
    要么使用中断(上升沿或下降沿触发,貌似这个更靠谱)。

    该用户从未签到

    发表于 2019-1-29 18:28 | 显示全部楼层
    明显是没有去抖
  • TA的每日心情

    2019-5-19 11:02
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2019-1-29 20:51 | 显示全部楼层
    void loop() {
      if (digitalRead(PSENSOR) == 1) {
       while (digitalRead(PSENSOR) == 0);
        COUNT_X++;
        Serial.println(COUNT_X);
    }
    这样不知可以不
       
  • TA的每日心情
    擦汗
    2019-5-19 00:00
  • 签到天数: 121 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-29 23:51 | 显示全部楼层
    cluse 发表于 2019-1-29 18:28
    明显是没有去抖

    嗯嗯.昨晚研究了半宿去抖.
    经测试,用新代码好用,已经在3楼贴出完整的代码.
  • TA的每日心情
    擦汗
    2019-5-19 00:00
  • 签到天数: 121 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-29 23:52 | 显示全部楼层
    上海老王 发表于 2019-1-29 11:28
    要么设置中间变量,作为标志,进行判断;
    要么使用中断(上升沿或下降沿触发,貌似这个更靠谱)。 ...

    使用中断,我这边会记录2次.不知道为什么.
    由于还要整合其它代码进来.所以没找太麻烦的代码.
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    博哥零基础教你玩转ESP8266(四) 认识一下ESP8266WiFi库
    博哥零基础教你玩转ESP826
    帖子导航: 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    博哥零基础教你玩转ESP8266(一) 重识ESP8266
    博哥零基础教你玩转ESP826
    https://blog.csdn.net/wubo_fly 帖子导航: 博哥零基础教你玩转ESP8266(一) 重识
    无线遥控四个灯泡
    无线遥控四个灯泡
    我有一个遥控器,一个接收板,还有四个灯泡,不知道如何连接在一起,然后控制灯亮
    AS608指纹模块在MEGA2560上的发出滋滋滋的声音
    AS608指纹模块在MEGA2560
    各位大佬求助!近日萌新在做一个门禁系统的毕设,老师要求买个指纹模块,我就去淘宝买
    求助~~!完全不懂的小白只想做一个简单的东西,大神请进。
    求助~~!完全不懂的小白只
    事情是这样,我想做一个通过人体红外感应模块控制电机的装置,这个电机只有一个,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表