mongoose-os读取ds18b20

来源:互联网 发布:java 图片上传非jsp 编辑:程序博客网 时间:2024/06/06 11:42

使用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);}//cbstatic 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");    }}


原创粉丝点击