Espruino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3863|回复: 9

【Espruino】NO.10 数字温度传感器DS18B20

[复制链接]

26

主题

92

帖子

879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
879

最佳新人活跃会员突出贡献论坛元老

发表于 2014-6-6 19:17:27 | 显示全部楼层 |阅读模式
【小鱼有点电】
DS18B20是很常用的数字温度传感器,供电范围为3.0V到5.5V,测温范围为-55~+125℃,在-10~+85℃范围内精度为+-0.5℃,每个器件都有唯一的64为序列号存储在内部存储器中,因此在一根总线上可以挂载多个器件,且独特的单线接口方式,使得DS18B20与微控制器连接时仅需一条口线即可实现微控制器与DS18B20的双向通讯,不过,需要注意的是,DS18B20的中间引脚DQ需要连接一个4.7K欧姆电阻到电源引脚。



在开发板上,我们将DQ引脚连接到引脚B1,开发时我们需要用到OneWire类。Espruino的OneWire API函数与Arduino的OneWire库很相似,操作流程如下:

var ow = new OneWire(pin);   
  • var device = ow.search()[0]; // 获取器件ID  
  • if (device===undefined) print("No OneWire devices found");  
  • ow.reset();  
  • ow.select(device);   
  • ow.write(42);  
  • var result = ow.read()  

对于DS18B20,官方已经提供了相关模块,可以直接调用,非常方便,具体操作如下:

var ow = new OneWire(B1);  
  • var sensor = require("DS18B20").connect(ow);  
  • setInterval(function() {  
  •   console.log(sensor.getTemp());//1s打印一次温度值  
  • }, 1000);  

需要注意的是第一次获取的温度值是不正确的需要舍弃。如下图红框所示:


DS18B20支持四种温度转换分辨率,9、10、11、12位。设置状态在掉电情况下依旧会保存下来。

获取下当前温度分辨率,使用函数getRes(),得到结果为12;

sensor.getRes();  

若要设置分辨率为9,则使用函数setResearch(res),其中res的值必须为9、10、11、12当中的一个;
sensor.setRes(9);  

我们除了可以让测量值显示在终端上,还能让其在LCD上显示,代码如下:




  • //DS18B20  
  • var ow = new OneWire(B1);  
  • var sensor = require("DS18B20").connect(ow);  
  • //Sharp Memory LCD  
  • SPI1.setup({ sck:B3, mosi:B5, order: "lsb", baud: 1000000 });  
  • var g = require("MemoryLCD").connect(SPI1, B4/*SCS*/, C12/*EXTCOMIN*/,128/*width*/, 128/*height*/);   
  • //在LCD上显示温度  
  • function showTemp(){  
  •   g.clear();  
  •   g.setFontVector(32);  
  •   g.drawString("Temp.",0,0);  
  •   g.drawLine(0,40,g.getWidth(),40);  
  •   g.drawLine(0,41,g.getWidth(),41);  
  •   g.drawLine(0,42,g.getWidth(),42);  
  •   g.setFontVector(20);  
  •   g.drawString(sensor.getTemp(),20,45);  
  •   g.flip();  
  • }  
  • //1s更新频率  
  • setInterval(showTemp, 1000);  




画个带曲线的温度传感器,示例如下:
var ow = new OneWire(B1);  
  • var temp = require("DS18B20").connect(ow);  
  • clearInterval();  
  • SPI1.setup({ sck:B3, mosi:B5, order: "lsb", baud: 1000000 });  
  • var g = require("MemoryLCD").connect(SPI1, B4/*SCS*/, C12/*EXTCOMIN*/,128/*width*/, 128/*height*/);   
  • var history = new Int8Array(g.getWidth());  
  • function onTimer() {  
  •   // 获取温度  
  •   var t = temp.getTemp();  
  •   for (var i=1;i<history.length;i++)  
  •     history[i-1] = history;  
  •   history[history.length-1] = t;  
  •   // 函数,温度转化为lcd的y坐标  
  •   var tempToY = function(t) { return 50-t; };  
  •   // 画图  
  •   g.clear();  
  •   g.moveTo(0,tempToY(history[0]));  
  •   for (i=1;i<history.length;i++)  
  •     g.lineTo(i,tempToY(history));  
  •     g.setFontVector(10);  
  •   g.drawString("Temp:",0,64);  
  •   g.setFontVector(16);  
  •   g.drawString(t,40,64);  
  •   // 显示到LCD上  
  •   g.flip();  
  • }  
  • setInterval(onTimer, 500);//500ms更新一次数据  


1

主题

6

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2014-7-28 10:42:07 | 显示全部楼层
接了1一个很久前买的DS18B20,espruino可以识别,温度显示正常。
最近又买了几个DS18B20,这几个espruino就不认了,出来的数据都是-0.1
这几个在arduino上测试,都是正常的。真是奇怪。

26

主题

92

帖子

879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
879

最佳新人活跃会员突出贡献论坛元老

 楼主| 发表于 2014-7-28 13:34:25 | 显示全部楼层
i7456 发表于 2014-7-28 10:42
接了1一个很久前买的DS18B20,espruino可以识别,温度显示正常。
最近又买了几个DS18B20,这几个espruino ...

多个ds18b20的程序,
The DS18B20 communicates over a 1-Wire bus, which allows connecting multiple thermometers on the same data line.

To create an array containing three sensors, simply:[mw_shl_code=javascript,true]var ow = new OneWire(A1);
var sensor1 = require("DS18B20").connect(ow, 0);
var sensor2 = require("DS18B20").connect(ow, 1);
var sensor3 = require("DS18B20").connect(ow, 2);
var sensors = [sensor1, sensor2, sensor3];
[/mw_shl_code]



数据线接4.7K的上拉电阻了吗?
麻烦上个大图靓照,

1

主题

6

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2014-7-28 13:42:30 | 显示全部楼层
qwert1213131 发表于 2014-7-28 13:34
多个ds18b20的程序,
The DS18B20 communicates over a 1-Wire bus, which allows connecting multiple  ...

没有4.7k的,用的10k的。
新买的18B20在家,晚上发图。

26

主题

92

帖子

879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
879

最佳新人活跃会员突出贡献论坛元老

 楼主| 发表于 2014-7-28 13:49:00 | 显示全部楼层
i7456 发表于 2014-7-28 13:42
没有4.7k的,用的10k的。
新买的18B20在家,晚上发图。

并联下你的10k变成5k,

1

主题

6

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2014-7-28 15:34:08 | 显示全部楼层
qwert1213131 发表于 2014-7-28 13:49
并联下你的10k变成5k,

当时想并联来着,焊接难度太大了,我只有0805封装的电阻,一个电阻焊上去都很勉强。

26

主题

92

帖子

879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
879

最佳新人活跃会员突出贡献论坛元老

 楼主| 发表于 2014-7-28 15:37:25 | 显示全部楼层
i7456 发表于 2014-7-28 15:34
当时想并联来着,焊接难度太大了,我只有0805封装的电阻,一个电阻焊上去都很勉强。

把第二个压在上面。如果有插的电阻就更好了

1

主题

6

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2014-7-29 00:21:35 | 显示全部楼层
qwert1213131 发表于 2014-7-28 15:37
把第二个压在上面。如果有插的电阻就更好了



以前买的DS18B20.jpg 用的以前买的DS18B20,旁边放着的是最近买的

最近买的DS18B20.jpg 用的是最近买的,旁边放着的是以前买的


上拉电阻2.7k.jpg 上拉电阻,现在的是2.7k的,也试过10k的。



















26

主题

92

帖子

879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
879

最佳新人活跃会员突出贡献论坛元老

 楼主| 发表于 2014-7-29 11:22:51 | 显示全部楼层
i7456 发表于 2014-7-29 00:21
用的以前买的DS18B20,旁边放着的是最近买的

用的是最近买的,旁边放着的是以前买的

[mw_shl_code=javascript,true]var ow = new OneWire(C8);
var sensor1 = require("DS18B20").connect(ow, 0);
var sensor2 = require("DS18B20").connect(ow, 1);
var sensors = [sensor1, sensor2];
setInterval(function() {
sensors.forEach(function (sensor, index) {
console.log(index + ": " + sensor.getTemp());
});
}, 1000);[/mw_shl_code]

下面是我的测试情况:
QQ图片20140729112200.jpg

QQ图片20140729111515.jpg
QQ图片20140729111640.jpg

10

主题

42

帖子

517

积分

高级会员

Rank: 4

积分
517
发表于 2017-1-10 00:07:58 | 显示全部楼层
共享一下我撸的温控代码,记录数据到 sd 卡:

[mw_shl_code=javascript,true]var ow = new OneWire(C5);
var sensor = require("DS18B20").connect(ow);
/**
* 获取当前日期时间
*/
function now() {
        var t = new Date();
        var date = [ t.getFullYear(), [t.getMonth() + 1], t.getDate()].join('-');
        var time = [t.getHours() , ("0" + t.getMinutes()).substr(-2), ("0" + t.getSeconds()).substr(-2) ].join(':');
        return [date, time].join(' ');
}

var print = function (temp) {
        console.log("Temp is " + temp + "°C");
};
var file = 'temp-record.csv';
var f = E.openFile(file, 'w');
var write = function (txt) {
        f.write(txt + '\n');
};
var recordTemp = function (temp) {
        write([now(), temp].join(','));
};
var handler = function (temp) {
        recordTemp(temp);
        print(temp);
};

// 闪烁
function blink(led, count, delay) {
        led = led || LED1;
        count = (count || 3) * 2;
        delay = delay || 1;
        var on = false;
        var timer = setInterval(function () {
                if (count--) {
                        led.write(on = !on);
                } else {
                        clearInterval(timer);
                        led.write(false);
                }
        }, delay * 1e3);
}

function run() {
        sensor.getTemp(handler);
        setInterval(function () {
                sensor.getTemp(handler);
        }, 60000);
        console.log('launched.');
        blink(null, 3);// 启动提醒
}

run();

E.on('init', function () {
        run();
});[/mw_shl_code]
Learning & Sharing
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|Espruino中文社区 ( 苏14007051 )

GMT+8, 2018-1-22 10:02 , Processed in 0.591687 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表