为了账号安全,请及时绑定邮箱和手机立即绑定

物联网——Nodejs与树莓派玩转K型热偶器

标签:
Node.js Linux

之前还没玩树莓派之前,网上经常看到python与树莓派成对出现,我一直很奇怪难道别的语言就不能在树莓派上调用Gpio了吗?之前别人说用python写爬虫比较方便的时候,我也不是用node写爬虫了吗?

昨天帮一个做测量的朋友做一个树莓派检测热偶数值的工具。我是电气自动化毕业,对热偶还是听说过的。但是学校都没教过怎么样去把电偶的电势差信号转为数字信号。于是朋友就给了一份C++的树莓派驱动Max6675芯片代码。代码不长,所以我想用node重写一份,到时候写api也比较容易。

写代码前的思考

因为之前没有实战过物联网(IoT),虽然一直想玩,买了树莓派,但没买线材和元器件,所以以前一直是看别人做。

在写代码之前,会涉及到两个问题:

  • 软硬件通信
  • nodejs调用Gpio

要用软件和硬件通信,首先要解决数模转换模数转换的问题。就目前这么简单的项目来说,主要是模数转换。从电势信号转0/1信号,会涉及到一个问题:模拟值要转电频值,精度丢失。因为芯片内存是有限的,模拟值虽然有取值范围,但是范围内有无限个数值。抛开精度问题,模拟信号转换电信号就使用 Max6675 芯片解决。

nodejs 在 npmjs 上面有树莓派 Gpio 调用库,我找了一个 onoff 来写。

Max6675芯片

好久都没接触过电子元件了,上网找这个芯片的驱动说明,很多都不懂啊。但是我是能看懂代码的,反推芯片工作原理还是可以的。

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 封装模块可以得到下面几个信息

  • 树莓派通过设置CS针脚来设置芯片是获取数据状态还是读取信息状态
  • 树莓派从Max6675的SO针脚获取二进制状态
  • 树莓派通过设置Max6675的SCK针脚的高低电平来获取SO针脚的状态
  • CS针脚为高电平时,需要200ms时间来收集数据
  • 二进制数可以通过移位累加来转换十进制数
  • Max6675芯片的精度是0.25°C,有十二位有效读数,其中有两位是小数点后面的。

资料

图片描述

图片描述

小结

  1. 使用程序将CS置高电平200ms,收集数据,再将CS置低电平度数
  2. Max6675 有十六位度数,温度位有12位。其中左边为低位,右边为高位
  3. SCK 高电平的时候读SOSCK 低电平时为下一位读数
  4. CS置高电平时,结束这次数据读取,并进行数据采集

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));

onoff

nodejs也有树莓派Gpio库,onoff就是其中一个。

具体使用方法可以看npmjs上面的文档,这里就不对文档做翻译了。

我实现的源码在Max6675-Raspberry-pi-nodejs,英语实在太蹩脚了,等有空写个完整的中文文档吧,到时候翻译成英文再发布到npmjs(已发布到npmjs),方便大家使用(万把块钱的K型热偶想必没人会拿来做室内温度计吧?)。

效果

图片描述

实际操作

图片描述

后来,需求来了

朋友:能不能同时接5支偶,毕竟一支偶才用了5个gpio,多买几个Max6675不就能接5只偶了吗?

emmmm,有道理,于是把原来的代码重构一遍,把SO单独拿出来接,其他端口所有的偶公用同一针脚,这样子就能只要循环12次SCK高、低电平,就能同时拿到5支偶的度数。emmmmm,机智。

于是就有了这个:

图片描述

图片描述

发布到npmjs

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JS工程师
手记
粉丝
9582
获赞与收藏
319

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 1
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消