第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

物聯(lián)網(wǎng)——Nodejs與樹(shù)莓派玩轉(zhuǎn)K型熱偶器

標(biāo)簽:
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

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 1
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消