基于树莓派的实时温度测量网站系统,及温控继电器控制风扇
这是一个我们学校大三上学期的课,在大一的理论基础课(线性代数,高等数学,概率论等等)和大二的专业基础课(模电数电等等)之后,终于在大三开始了正老八经的专业学科的学习,于是就出现了这个课程设计的存在。
这个课设出现的意义铺垫到此结束,我和我的朋友(两人一组)选的是关于“电子电路实现温度”的实时测量并予以显示出来的课题。理论上是要用电路实现,就类似于这个:
极其丑陋和混乱
之前很早就像入手一个树莓派研究研究,故此次课设就决定使用树莓派实现此功能(单片机实现)
正文开始:
目录简概: 1.准备器件 2.树莓派的系统烧录以及系统配置 3.温度传感器接线以及系统内核配置 4.搭建Apache和网站前端平台,完场最初的二维码扫码查看效果 5.继电器的链接以及python实现代码
壹
正值19年树莓派更新换代的好时候,便不假思索的入手了一个树莓派4B+,DS18B20水温传感器(-55°C~+125°C),4.7KΩ电阻,单路继电器,5V200mA直流供电风扇,杜邦线若干
不得不提一下,这一代的树莓派供电接口换做了type-C口,以及视屏接口换成了两个miniHDMI可同时支持双4K输出,处理器全系为1.8Ghz的4核CPU,我这里因为预算有限购买的是1G内存版本,以及绰绰有余了。树莓派麻雀虽小,五脏俱全,性能异常的强大
贰
首先我们先将树莓派的官方镜像系统文件烧录进事先准备好的tf卡中,可以再官网下载到最新的,当然也可以烧录其他的系统。烧录软件使用的是Win32DiskImager,可以自行百度下载,非常小的软件
这个系统发行的时间正好是我20岁的生日这一条,真实缘分,缘分...
若是没有显示器,只能通过ssh远程局域网控制树莓派的话,烧录成功后可以再在中boot这个磁盘中新建一个名为“ssh”的文件(不要扩展名,就是一个淡淡的文件,可以先创建txt文件然后将后缀名删掉就好了)这样就能开机自动打开ssh,而后在boot跟磁盘下写入如下文件
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1network={
ssid="Alexz" //wifi名称
psk="19990710" //wifi密码(我的生日,哈哈哈是不是发行哪一天正好是20岁哈哈哈)
key_mgmt=WPA-PSK //安全协议(默认为这个)
priority=1
}
就可以开机自动打开ssh服务并且自动连接上无线局域网,树莓派是自带了无线网开且无需其他配置就可以使用的
我们现在使用xshell连接(前提需要知道树莓派的ip)
系统默认用户是:pi密码是:raspberry 我这里直接使用root用户登录,但第一次登录是无法使用root用户登录的
首先创建root用户的密码
sudo passwd root
而后就会提示输入密码等等,然后编辑
nano /etc/ssh/sshd_config Debian系列最好用的文本编辑器nano需要注意一下,比vim这个智障玩意儿强太多了
这样下次登陆的时候就可以直接登录root用户了
这里需要知道一个很实用的命令:raspi-config
通过提示可以修改默认用户密码,vnc服务是否打开,ssh是否打开,屏幕分辨率,树莓派设备名称,wifi选项,语言以及时区等等,自行去探索发现,这里就不再过多阐述了
至此,一个基于Debian命令系的linux系统就安装完成可以正常使用了
叁
先上接线图
就是这个东西接上去,同时在并一个电阻。DS18B20传感器内部接有数模转换器,所以不用担心数模转换的问题
首先更新内核信息
sudo apt-get upgrade 别忘了换一个国内的源,阿里中科大网易都不错,自己去找吧这里懒得给了
然后在/boot/config.txt下添加如下内容:
dtoverlay=w1-gpio,gpiopin=4
查看设备标识符:
cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves
查看温度,命令:
cat /sys/bus/w1/devices/这里填写你上面得到的设备标识符]/w1_slave
我这里的设备标识符是28-030c9794289f,然后红框内就是当前温度的数值,当然这里转换为这是杜是要除以1000,即该温度测量设备的精确度是千分之一摄氏度,还是蛮高的
至此,温度传感器就已经配置成功且可以正常运行使用了
肆
我们的目的是要创建一个可以同一个无线局域网内实施使用浏览器查看温度的物联网设备,我们首先需要基于树莓派平台搭建一个网站服务器,这里我们使用的是LAMP(Linux+Apache+MySQL+PHP)
首先安装apache2
sudo apt-get install apache2
安装PHP5
sudo apt-get install php5 libapache2-mod-php5
然后在shell中关闭防火墙,使得外部可以直接访问
systemctl stop firewalld
然后你就可以用同一个局域网比如手机或者电脑访问树莓派的ip
该网站服务器在/var/www/html/目录下
这里我们须事先所预期中的功能,使用以下php脚本:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);echo "当前时间: " . date('Y-m-d H:i:s') . "\r\n<br>";
$str = file_get_contents('/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves');
$dev_ds18b20 = preg_split("/\\r\\n|\\r|\\n/", $str);
foreach( $dev_ds18b20 as $val ){
if( $val!='' ){
echo "当前设备型号:DS18B20- $val<br>\r\n";
$temp_path = "/sys/bus/w1/devices/$val/w1_slave";
$str = file_get_contents($temp_path);
if( preg_match('|t\=([0-9]+)|mi', $str, $m) ){
$temp = $m[1] / 1000;
echo "实时温度=$temp" . "℃" . "<br>\r\n";
}
}
}
?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<br>
<title>实时温度测量系统</title><script>
function reload(){
location.reload()
}
</script>
</head><body>
<input type="button" value="点击刷新温度" οnclick="reload()">
<br>
<br>
<img border="0" src="timg.jpg" width="512" height="384"></body>
</html>
直接在浏览器中访问该php文件:
这里我还加了一个学校的航拍照片,直接放在/html目录下直接调用,记得给文件夹和php文件权限,不然可能无法调用图片
即刷新一次网页就刷新一次温度显示,我还做了一个二维码,通过微信扫一扫这个功能直接可以在连接上局域网的前提下访问该网站
当然这个二维码你们肯定用不了的啊,自己去网上找一个生成二维码的网站生成一个就好了
至此基本文书试试测量系统就建立成功了
伍
下面通过树莓派控制继电器来监控CPU内核温度
先上接线图:
这里接线要注意,风扇也是用的树莓派上的5V针脚供电,因为我这里选用的是5V直流风扇,还要注意接线的时候继电器的常开常闭公共端还有in,gnd,vcc极别接错了
随意位置创建python文件(这里的python使用python2.7写的,系统基本上都会自带Python环境)
#! /usr/bin/env python3
import os
import RPi.GPIO as GPIO
import time
import datetime
import sys# Identify which pin controls the relay
FAN_PIN = 18 # the yellow box ex: GPIO18
# Temperature check. Start fan if temp > 49C
FAN_START = 49
# Temperature check. Shut down under 28C
FAN_END = 28# Get what action. If you manually turning on/off the fan
action = sys.argv.pop()
def GPIOsetup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_PIN, GPIO.OUT)def fanON():
GPIOsetup()
GPIO.output(FAN_PIN, 0) #fan on
return()
def fanOFF():
GPIOsetup()
GPIO.output(FAN_PIN, 1) #fan off
return()def get_temp_from_system():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))def check_fan(pin):
GPIOsetup()
return GPIO.input(pin)def run(pin):
current_date = datetime.datetime.now()
temp = get_temp_from_system()
if float(temp) >= FAN_START:
print(temp+' @ '+str(current_date))
if check_fan(pin) == 1:
print('Fan is Off...Starting Fan')
fanON()
else:
time.sleep(5) # Remove, if you want real-time checking
print('Fan is ON')
elif float(temp) <= FAN_END:
print(temp+' @ '+str(current_date))
if check_fan(pin) == 0:
print('Fan is on...Shuting it Down')
fanOFF()
GPIO.cleanup()
return 1 # exit script. The pi has cooled down
else:
time.sleep(5) # Remove, if you want real-time checking
print('Fan is OFF')
else:
pass # while the script is passing through here, there will be no output on screen
if action == "on" :
print "Turning fan on"
fanON()
elif action == "off" :
print "Turning fan off"
fanOFF()# first check if script is already running
if check_fan(FAN_PIN) == 0:
print('Fan is on, script must be running from another instance...')
else:
temp = get_temp_from_system()
if float(temp) < FAN_START:
print('Pi is operating under normal temperatures.')
else:
try:
while(True):
tmp = run(FAN_PIN)
if tmp == 1: # value returned from line 60
break
except KeyboardInterrupt:
fanOFF()
GPIO.cleanup()
finally:
fanOFF()
GPIO.cleanup()
然后sudo下运行此文件,即可通过温度调整风扇开启与关闭了
大功告成
妈的,我是搞安全的,为什么要搞电子电路呢?