阅读门槛:需要了解一些香橙派开发板的基础知识(可以去看看我之前的文章有介绍),linux系统的相关知识,并且会看基本的python代码,我的机子烧录的系统是 Ubuntu22,其它系统的话可以作为参考。
简介
本文主要记录通过 orangePi(香橙派)连接温度传感器,并用Python 脚本最终实现温度监控的过程。主要是其间有不少坑,我也算是提前踩了,希望对你们有用。
前期准备
-
orangePI zero 3(其它的板子也行)
-
面包板
-
Ds18b20 温度传感器
-
小灯珠(可选)
操作流程
1. 线路连接
首先我们需要知道开发板的每个pin针脚代表的意思。可以参考我之前的介绍orangePI的文章。
当知道原理的情况下,连接起来就很简单。
我们需要知道的是温度传感器上有三个引脚,分别对应的:
-
红色:电源(我接的是5v电压,由于温度传感器可以支持3.3v - 5.5v电压,所以 3v 电压引脚也是可以的)
-
灰色:地线
-
绿色:数据传输(理论上只要是gpio的口都可以,我这里连接的是pin12引脚)
连接原理图参考如下:
我这里用了额外的连接线方便用小灯珠调试,实际操作过程中这个额外的连接杜邦线可以不用,按照上面的连接原理形成一个电路闭环即可,实物连接图如下:
线连接好,基本上已经成功一半了。接下来就是代码的编写了。
2. 安装环境依赖
这里我用到了一个依赖包 wiringpi,默认情况下香橙派是自带的,这个步骤就可以跳过。
如果系统没有的话也可以自己安装一下,步骤也很简单(以下步骤需要在root权限下运行)
一、安装依赖包
root@orangepi:~# sudo apt-get update root@orangepi:~# sudo apt-get -y install git swig python3-dev python3-setuptools
二、下载 wiringOP-Python 的源码
注意,下面的 git clone**--recursive** 命令会自动下载 wiringOP 的源码,因为wiringOP-Python 是依赖 wiringOP 的。请确保下载过程没有因为网络问题而报错。
root@orangepi:~# git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python -b next root@orangepi:~# cd wiringOP-Python root@orangepi:~/wiringOP-Python# git submodule update --init --remote
三、编译 wiringOP-Python
root@orangepi:~# cd wiringOP-Python root@orangepi:~/wiringOP-Python# python3 generate-bindings.py > bindings.i root@orangepi:~/wiringOP-Python# sudo python3 setup.py install
四、查看安装是否成功
当提示下面的内容,则表示安装成功了!
root@orangepi:~/wiringOP-Python# python3 -c "import wiringpi; help(wiringpi)" Help on module wiringpi: NAME wiringpi DESCRIPTION # This file was automatically generated by SWIG (http://www.swig.org). # Version 4.0.2 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. ...
3. 代码编写
创建一个脚本叫:index.py,参考以下代码:
# index.py import wiringpi from wiringpi import GPIO import time PIN = 6 # 这里对应的是物理针脚 12号 def oneWireReset(pin): wiringpi.pinMode(pin, GPIO.OUTPUT) wiringpi.digitalWrite(pin, GPIO.HIGH) wiringpi.digitalWrite(pin, GPIO.LOW) wiringpi.delayMicroseconds(500) wiringpi.digitalWrite(pin, GPIO.HIGH) wiringpi.delayMicroseconds(60) wiringpi.pinMode(pin, GPIO.INPUT) if not wiringpi.digitalRead(pin): ack = 1 else: ack = 0 wiringpi.delayMicroseconds(500) return ack def writeBit(pin, bit): wiringpi.pinMode(pin, GPIO.OUTPUT) wiringpi.digitalWrite(pin, GPIO.LOW) wiringpi.delayMicroseconds(2) wiringpi.digitalWrite(pin, bit) wiringpi.delayMicroseconds(80) wiringpi.digitalWrite(pin, GPIO.HIGH) wiringpi.delayMicroseconds(1) def oneWireSendComm(pin, byte): i = 0 while i < 8: sta = byte & 0x01 writeBit(pin, sta) byte >>= 1 i += 1 def readBit(pin): wiringpi.pinMode(pin, GPIO.OUTPUT) wiringpi.digitalWrite(pin, GPIO.HIGH) wiringpi.digitalWrite(pin, GPIO.LOW) wiringpi.delayMicroseconds(2) wiringpi.digitalWrite(pin, GPIO.HIGH) wiringpi.pinMode(pin, GPIO.INPUT) wiringpi.delayMicroseconds(2) tmp = wiringpi.digitalRead(pin) wiringpi.delayMicroseconds(40) return tmp def oneWireReceive(pin): i = 0 k = 0 while i < 8: j = readBit(pin) k = (j << 7) | (k >> 1) i += 1 k = k & 0x00FF return k def tempchange(lsb, msb): if (msb >= 0xF0): msb = 255 - msb lsb = 256 - lsb tem = -(msb*16*16 + lsb) else: tem = (msb*16*16 + lsb) temp = tem*0.0625 print("Current Temprature: %.2f"%(temp)) def main(): wiringpi.wiringPiSetup() lsb = 0 msb = 0 if oneWireReset(PIN): oneWireSendComm(PIN, 0xcc) oneWireSendComm(PIN, 0x44) if oneWireReset(PIN): oneWireSendComm(PIN, 0xcc) oneWireSendComm(PIN, 0xbe) lsb = oneWireReceive(PIN) msb = oneWireReceive(PIN) tempchange(lsb, msb) if __name__ == '__main__': while True: # 创建一个循环,两秒钟输出一次温度信息 main() time.sleep(2)
4. 结果展示
运行脚本:python index.py, 就会有当前实时温度信息展示
小结
随着对开发板的日渐熟悉,我越来越坚定认为软件硬件都是服务于人的。如果生活中不能满足你的需求,每个人都可以通过自己DIY来实现自己的一些小想法。而目前来看这需要的成本是非常低的,并且成就感满满,让自己快乐其实很简单。
本期分享就到这了,以后我会陆续分享关于 硬件+软件 联动的案例,最终目标是自己部署一个大模型,制作一个自己的AI机器人,下次见 👋
全网首发:dev的艺术空间