a552298242 2017-11-24 07:08 采纳率: 28.6%
浏览 3508
已采纳

arduino如何接受数字传感器的信号

学习arduino遇到点疑惑,请大家帮忙指点下怎么办?
arduino使用dht22温湿度传感器按照参考教程需要导入一个头文件dht,使用时要调用相关函数,读出具体的温湿度,从而打印输出。
但是很多传感器并非为arduino设计,但是可以兼容使用。没有现成的头文件,这种情况怎么arduino如何接受数字信号呢?
我查了很多资料,只能查到数字引脚可以通过判断low还是high来输出0或者1,但是像温湿度传感器这样的,输出内容不会这么简单,至少是整数或者是小数,因此怎么样才能让arduino接收到数字传感器所发出的8bits数据呢
因为是初学者,对于传感器所说的Data bits不理解,这个8bits的到底能表达一个多大数据量呢,看起来不应该只是0和1,感觉应该更大一点

  • 写回答

1条回答 默认 最新

  • COCO_AS 2017-11-24 15:24
    关注

    最好找传感器厂商要接口, 想了解原理的话读一下dht的库源代码就好了, 很好理解的.

    int dht11::read(int pin)
    {
        // BUFFER TO RECEIVE
        uint8_t bits[5];
        uint8_t cnt = 7;
        uint8_t idx = 0;
    
        // EMPTY BUFFER
        for (int i=0; i< 5; i++) bits[i] = 0;
    
        // REQUEST SAMPLE 请求采样
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
        delay(18);
        digitalWrite(pin, HIGH);
        delayMicroseconds(40);
        pinMode(pin, INPUT);
    
        // ACKNOWLEDGE or TIMEOUT
        unsigned int loopCnt = 10000;
        while(digitalRead(pin) == LOW)
            if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
    
        loopCnt = 10000;
        while(digitalRead(pin) == HIGH)
            if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
    
        // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT  共需读取5个字节x8=40比特
        for (int i=0; i<40; i++)
        {
            loopCnt = 10000;
            while(digitalRead(pin) == LOW)
                if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
    
            unsigned long t = micros();
    
            loopCnt = 10000;
            while(digitalRead(pin) == HIGH)
                if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
    
            if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
            if (cnt == 0)   // next byte?
            {
                cnt = 7;    // restart at MSB
                idx++;      // next byte!
            }
            else cnt--;
        }
    
        // WRITE TO RIGHT VARS
            // as bits[1] and bits[3] are allways zero they are omitted in formulas.  字节1和3总是零
        humidity    = bits[0];    //湿度
        temperature = bits[2];   //温度
    
        uint8_t sum = bits[0] + bits[2];  
    
        if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;   //校验
        return DHTLIB_OK;
    }
    
    

    参考
    http://playground.arduino.cc/Main/DHT11Lib

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥100 求一个c#通过CH341读取数据的Demo,能够读取指定地址值的功能
  • ¥15 Matlab图例修改
  • ¥15 rk3566 Android11 USB摄像头 微信
  • ¥15 torch框架下的强化学习DQN训练奖励值浮动过低,希望指导如何调整
  • ¥35 西门子博图v16安装密钥提示CryptAcquireContext MS_DEF_PROV Error of containger opening
  • ¥15 mes系统扫码追溯功能
  • ¥40 selenium访问信用中国
  • ¥20 在搭建fabric网络过程中遇到“无法使用新的生命周期”的报错
  • ¥15 Python中关于代码运行报错的问题
  • ¥500 python 的API,有酬谢
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部