首页 > IT职业 > IT生活 > 物联网——Nodejs与树莓派玩转K型热偶器

之前还没玩树莓派之前,网上经常看到python与树莓派成对出现,我一直很奇怪难道别的语言就不能在树莓派上调用Gpio了吗?之前别人说用python写爬虫比较方便的时候,我也不是用node写爬虫了吗?
昨天帮一个做测量的朋友做一个树莓派检测热偶数值的工具。我是电气自动化毕业,对热偶还是听说过的。但是学校都没教过怎么样去把电偶的电势差信号转为数字信号。于是朋友就给了一份C++的树莓派驱动Max6675芯片代码。代码不长,所以我想用node重写一份,到时候写api也比较容易。
因为之前没有实战过物联网(IoT),虽然一直想玩,买了树莓派,但没买线材和元器件,所以以前一直是看别人做。
在写代码之前,会涉及到两个问题:
要用软件和硬件通信,首先要解决数模转换和模数转换的问题。就目前这么简单的项目来说,主要是模数转换。从电势信号转0/1信号,会涉及到一个问题:模拟值要转电频值,精度丢失。因为芯片内存是有限的,模拟值虽然有取值范围,但是范围内有无限个数值。抛开精度问题,模拟信号转换电信号就使用 Max6675 芯片解决。
nodejs 在 npmjs 上面有树莓派 Gpio 调用库,我找了一个 onoff 来写。
好久都没接触过电子元件了,上网找这个芯片的驱动说明,很多都不懂啊。但是我是能看懂代码的,反推芯片工作原理还是可以的。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# set pin number for communicate with MAX6675
def set_pin (CS, SCK, SO, UNIT):
global sck
sck= SCK
global so
so = SO
global unit
unit = UNIT
GPIO.setup(CS, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(SCK, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(SO, GPIO.IN)
def read_temp(cs_no):
GPIO.output(cs_no, GPIO.LOW)
time.sleep(0.002)
GPIO.output(cs_no, GPIO.HIGH)
time.sleep(0.22)
GPIO.output(cs_no, GPIO.LOW)
GPIO.output(sck, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(sck, GPIO.LOW)
Value = 0
for i in range(11, -1, -1):
GPIO.output(sck, GPIO.HIGH)
Value = Value + (GPIO.input(so) * (2 ** i))
GPIO.output(sck, GPIO.LOW)
GPIO.output(sck, GPIO.HIGH)
error_tc = GPIO.input(so)
GPIO.output(sck, GPIO.LOW)
for i in range(2):
GPIO.output(sck, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(sck, GPIO.LOW)
GPIO.output(cs_no, GPIO.HIGH)
if unit == 0:
temp = Value
if unit == 1:
temp = Value * 0.25
if unit == 2:
temp = Value * 0.25 * 9.0 / 5.0 + 32.0
if error_tc != 0:
return -cs_no
else:
return temp
GPIO.cleanup()

python 的 Max6675 封装模块可以得到下面几个信息


SO 读数的原理如下代码一致。
const bin = "100000000000"; // 左边为低位,右边为高位,右边先取
const bin2dec = (c, value = 0) => {
for (let i = 11; i > -1; i--) {
// value = value + parseInt(c[i]) * Math.pow(2, i);
value += parseInt(c[i]) << i;
}
return value * 0.25;
}
console.log(bin2dec(bin));
nodejs也有树莓派Gpio库,onoff就是其中一个。
具体使用方法可以看npmjs上面的文档,这里就不对文档做翻译了。
我实现的源码在Max6675-Raspberry-pi-nodejs,英语实在太蹩脚了,等有空写个完整的中文文档吧,到时候翻译成英文再发布到npmjs(已发布到npmjs),方便大家使用(万把块钱的K型热偶想必没人会拿来做室内温度计吧?)。

实际操作

朋友:能不能同时接5支偶,毕竟一支偶才用了5个gpio,多买几个Max6675不就能接5只偶了吗?
emmmm,有道理,于是把原来的代码重构一遍,把SO单独拿出来接,其他端口所有的偶公用同一针脚,这样子就能只要循环12次SCK高、低电平,就能同时拿到5支偶的度数。emmmmm,机智。
于是就有了这个:



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1680/viewspace-2821827/ ,如需转载,请注明出处,否则将追究法律责任。