首页 > 代码库 > 【Espruino】NO.10 数字温度传感器DS18B20
【Espruino】NO.10 数字温度传感器DS18B20
http://blog.csdn.net/qwert1213131/article/details/28845147
本文属于个人理解,能力有限,纰漏在所难免,还望指正!
【小鱼有点电】
【Espruino中文社区】
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[i]; 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[i])); g.setFontVector(10); g.drawString("Temp:",0,64); g.setFontVector(16); g.drawString(t,40,64); // 显示到LCD上 g.flip(); } setInterval(onTimer, 500);//500ms更新一次数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。