Air-duino / Arduino-AirMCU

Arduino core for the Air MCU.
https://arduino.luatos.com/
MIT License
69 stars 21 forks source link

DS18b20无法驱动 #59

Closed stosc closed 1 year ago

stosc commented 1 year ago

描述一下这个bug / Describe the bug

驱动DS18b20失败,无法正确读数。同样的程序在esp32c3中可以正常准确读数。

复现步骤 / To Reproduce

/*********************************************************************
 ——————1.开发环境:Arduino IDE——————————————————————————————————
 ——————2.使用开发板型号:Arduino UNO——————————————————————
 ——————3.传感器类型:DS18B20数字温度传感器———————————————————————
 ----esp32 c3 验证通过————————————————————————————
*********************************************************************/
int DSPIN = 6;
void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
}

void loop() {
    // put your main code here, to run repeatedly:
    double temp = TempRead();
    temp *= 0.0625;//转换精度为0.0625/LSB
    Serial.println(temp);
    delay(500);
}

boolean DS18B20_Init()
{
    pinMode(DSPIN, OUTPUT);
    digitalWrite(DSPIN, HIGH);
    delayMicroseconds(5);
    digitalWrite(DSPIN, LOW);
    delayMicroseconds(750);//480-960
    digitalWrite(DSPIN, HIGH);
    pinMode(DSPIN, INPUT);
    int t = 0;
    while(digitalRead(DSPIN))
    {
        t++;
        if(t > 60) return false;
        delayMicroseconds(1);
    }
    t = 480 - t;
    pinMode(DSPIN, OUTPUT);
    delayMicroseconds(t);
    digitalWrite(DSPIN, HIGH);
    return true;
}

void DS18B20_Write(byte data)
{
    pinMode(DSPIN, OUTPUT);
    for(int i=0; i<8; i++)
    {
        digitalWrite(DSPIN, LOW);
        delayMicroseconds(10);
        if(data & 1) digitalWrite(DSPIN, HIGH);
        else digitalWrite(DSPIN, LOW);
        data >>= 1;
        delayMicroseconds(50);
        digitalWrite(DSPIN, HIGH);
    }
}

byte DS18B20_Read()
{
    pinMode(DSPIN, OUTPUT);
    digitalWrite(DSPIN, HIGH);
    delayMicroseconds(2);
    byte data = 0;
    for(int i=0; i<8; i++)
    {
        digitalWrite(DSPIN, LOW);
        delayMicroseconds(1);
        digitalWrite(DSPIN, HIGH);
        pinMode(DSPIN, INPUT);
        delayMicroseconds(5);
        data >>= 1;
        if(digitalRead(DSPIN)) data |= 0x80;
        delayMicroseconds(55);
        pinMode(DSPIN, OUTPUT);
        digitalWrite(DSPIN, HIGH);
    }
    return data;
}

int TempRead()
{
    if(!DS18B20_Init()) return 0;
    DS18B20_Write(0xCC);//发跳过ROM命令
    DS18B20_Write(0x44);//发读开始转换命令
    if(!DS18B20_Init()) return 0;
    DS18B20_Write(0xCC);//发跳过ROM命令
    DS18B20_Write(0xBE);//读寄存器,共九字节,前两字节为转换值
    int temp = DS18B20_Read();//低字节
    temp |= DS18B20_Read() << 8;//高字节
    return temp;
}

如果正常,应该是什么样 / Expected behavior

应该打印正确的温度

截图 / Screenshots

显示 4096 拔掉 数据线的连接后 显示 0

日志 / Logs

显示 4096 拔掉 数据线的连接后 显示 0

系统 / System

win10h2

PACK包版本 / Version

1.0.1.1

验证

HalfSweet commented 1 year ago

建议检查硬件连接(如是否有上拉电阻,是否存在供电,IO口连接是否有误等)

如果硬件确定没问题,建议使用逻辑分析仪进行数据采集分析,并确定错误发生在什么地方。

自行编写的库文件不属于本仓库处理的问题,除非是具体的某个API或者用到的库的bug

chenxuuu commented 1 year ago

我测试过了,你把主频改到48M,串口波特率改为9600,就可以正常获取到数据了 图片 图片

chenxuuu commented 1 year ago

温度传感器 DS18B20

文档也已经更新