查看: 293|回复: 8

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

[复制链接]
  • TA的每日心情
    擦汗
    2019-2-17 00:00
  • 签到天数: 43 天

    [LV.5]常住居民I

    发表于 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-2-17 00:00
  • 签到天数: 43 天

    [LV.5]常住居民I

     楼主| 发表于 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-2-17 00:00
  • 签到天数: 43 天

    [LV.5]常住居民I

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

    2019-2-15 08:47
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 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-2-18 00:01
  • 签到天数: 688 天

    [LV.9]以坛为家II

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

    该用户从未签到

    发表于 2019-1-29 18:28 | 显示全部楼层
    明显是没有去抖
  • TA的每日心情
    擦汗
    2019-2-15 20:21
  • 签到天数: 121 天

    [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-2-17 00:00
  • 签到天数: 43 天

    [LV.5]常住居民I

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

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

    [LV.5]常住居民I

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

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

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    求助,Due使用问题。
    求助,Due使用问题。
    如图,Due没有SPI库和Wire库。
    arduino+onenet+edp协议
    arduino+onenet+edp协议
    每次在edp.c这里报错,请问这是什么问题?(这一句本身应该没有问题的)
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    能够与arduino结合的嵌入式视觉识别模块
    能够与arduino结合的嵌入
    该视觉识别模块是我司于2018年新推出的产品,处理器采用双核MCU,面向创客以及steam
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表