mongoose-os读取ds18b20

使用NodeMCU 脚D4(GPIO2),这个脚默认有一个12K的上拉电阻,接淘宝买的ds18b20,可以省略外接一个上拉电阻。

使用timer回调来跳过等待1秒。

后期优化,可以把reset中几百us的等待也改到timer事件。


#include "ds18b20.h"

static struct mgos_onewire *ow;
static float temp = 0.0;

void init_ds18b20(void)
{
    ow = mgos_onewire_create(DATA_DS18B20);
    if (ow == NULL)
    {
        printf("one wire init failed.\n");
    }
    else
    {
        printf("one wire init successful.\n");
    }
}

float get_temp(void)
{
    return temp;
}

// 转换到浮点
static float toFloat(uint16_t data)
{
    if (data & 0x8000)
        return -1 * ((uint16_t)(~data + 1) / 256.0f);
    else
        return (data / 256.0f);
}

//cb
static void cb_read(void *arg)
{
    if (!mgos_onewire_reset(ow))
    {
        printf("reset for read failed\n");
        return;
    }

    mgos_onewire_skip(ow);
    mgos_onewire_write(ow, 0xbe);
    //read
    uint8_t data[BYTE_READ];
    mgos_onewire_read_bytes(ow, data, BYTE_READ);
    uint16_t *p_data = (uint16_t *)(data);
    *p_data &= ~1;
    *p_data <<= 4;
    temp = toFloat(*p_data);
    printf("d0:%d,d1:%d,ds18b20 temp is:%3.1f\n", data[0], data[1], temp);

    mgos_onewire_reset(ow);

    (void)arg;
}

void read_ds18b20(void)
{
    if (mgos_onewire_reset(ow))
    {
        mgos_onewire_skip(ow);
        mgos_onewire_write(ow, 0x44);
        //wait
        mgos_set_timer(1000, false, cb_read, NULL);
    }
    else
    {
        printf("No ds18b20!\n");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容沁风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值