阅读门槛:需要了解一些香橙派开发板的基础知识(可以去看看我之前的文章有介绍),linux系统的相关知识,并且会看基本的 python 代码,我的 orangepi 烧录的系统是 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的艺术空间