第一次嵌入式课程大作业
一年级下的嵌入式期末考试,当时做完忘记录一下了,现在重新上传
课程要求:
(1) 记录24小时内 当前环境的 温、湿度、存入数据库 (每分钟记录1次);
(2) 如有人靠近树莓派1米以内时,记录靠近的时刻、持续时间;
(3) 绘制24小时内,温、湿度的变化曲线,把人的活动标注在曲线上;
(4) 分析当人靠近、停留多长时间会对温、湿度产生影响;
此课程要求需要用到linux,mysql,python相关的知识
记录时间2020-06-10 08:30: 00 开始记录温度和人体红外时间
这里我们根据任务一步一步来完成。
任务要求一:记录24小时内 当前环境的 温、湿度、存入数据库 (每分钟记录1次);
因为我用的传感器是DS18B20,只能测量温度,故这里只记录当前环境的温度并存入数据库。
第一种测温度的方法
第一步:配置文件
打开根目录下的boot目录下的config.txt,在代码的最末行加上这一句,意思是添加device tree设备,管脚为gpiopin4(BCM编码)
第二步:查看模块是否启动
重启树莓派是否设置生效,可运行lsmod命令,查看是否有如下两个模块
如果没有发现,也可运行如下命令加载模块
sudo modprobe w1-gpio
sudo modprobe w1-therm
第三步:读取温度
分别输入以下命令,在28-xxx开头的文件中读取w1-slave文件则会返回当前的温度值,可见此时的温度值为28.312°
-----------------------------------到这里,可以通过以上的步骤读出温度的代码,但也可以通过编写代码来读取温度值
第四步:建立数据库与数据表,以记录数据
建立一个other数据库,other数据库里面有表pi和表pi_hongwai,分别用来存放当前环境温度值和人体靠近的时间和持续时间(表pi_hongwai2是我自己建立的一个测试表)
数据表pi中定义了自动增量id,记录温度的时间time,当前的温度temperature
数据表pi_hongwai 中定义了自动增量id,和人体靠近的时刻closetime,持续的时间duration
表建立好了,现在我们可以开始编写代码上传数据到表中了
第二种测温度的方法
测量温度的python代码如下:
import pymysql
import time
import re
#连接数据库
way='/sys/bus/w1/devices/28-01193893fef4/w1_slave' # 文件路径
print("system start , start connect mysql")
conn = pymysql.connect(host="127.0.0.1",user="root",passwd="123456",db="other") #连接数据库
cursor=conn.cursor()
print("connect mysql succeed")
#向pi表中插入数据
def order(values):
global cursor,conn
value=str(values)
print(value)
itime=str(time.strftime('%Y-%m-%d %H:%M:%S'))
print(itime)
iorder="insert into pi(time,temperature) values('"+itime+"','"+value+"');"
cursor.execute(iorder)
conn.commit()
try: #看能不能打开文件
file=open(way,'r')
except Exception as result:
print("%s" % result)
order('-404') # 如果打开文件失败,则传送-404字符串,意思是当读出的温度值为-404时,代表文件读取失败
conn.close()
try:
file.close()
except Exception as result:
pass
exit()
try: #将温度值写入表中的temperature
temperature=file.read()
crc=re.compile('crc=.*?(.*?)\n').findall(temperature)[0]
t=re.compile('t=(.*?)\n').findall(temperature)[0]
t=str(float(t)/1000.0)
order(t)
except Exception as result: #不能写入则temperature值为-510
print("%s" % result)
order('-510')
finally:
file.close()
conn.close()
到这里一次测量温度的代码就写好了,此时当我们执行一次代码,即读出一次温度值
第六步:每分钟测量一次
根据要求我们需要每一分钟获取一次数据,此时我们用软件crontab,linux crontab是用来定期执行程序的命令,在终端窗口输入命令: crontab -e ,在里面的最末行加上如下红框中的代码,意思是每小时每分钟执行一次后面路径上的文件,DS18B20.py是我们第四步编写的代码
任务要求二: 如有人靠近树莓派1米以内时,记录靠近的时刻、持续时间;
根据要求我们需要用到人体红外传感器,同时我们用led灯来显示是否有人靠近,方便观察
#物理引脚下
#LED vcc=11 GND=9
#人体红外传感器 GPIO_IN=15; 左vcc=2 ;GND=39
import pymysql
pymysql.install_as_MySQLdb()
import RPi.GPIO as GPIO
import sys
import time
import os
GPIO_IN = 15 #人体红外传感器输入 GPIO3
*初始化引脚*
def init():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(GPIO_IN, GPIO.IN)
GPIO.setup(11,GPIO.OUT)
#连接数据库
print("开始连接数据库")
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root", passwd="123456", db="other") # 连接数据库
cursor = conn.cursor()
print("数据库连接成功")
#向pi_hongwai表中插入数据
def order(values):
global cursor, conn
value = str(values)
print(value)
itime = str(time.strftime('%Y-%m-%d %H:%M:%S'))
iorder = "insert into pi_hongwai(closetime,duration) values('" + itime + "','" + value + "');"
cursor.execute(iorder)
conn.commit()
try:
init()
while True:
if GPIO.input(15) == 1:
t1 = time.strftime('%Y%m%d%H%M%S')
GPIO.output(11,GPIO.HIGH) # 有人靠近时,led灯亮起
print("someone is closing...")
while GPIO.input(15)==GPIO.HIGH: # 为低电平才通过
pass
t2 = time.strftime('%Y%m%d%H%M%S')
print(" now nobody")
GPIO.output(11,GPIO.LOW) # 当人远离时,led灯熄灭
if t1[11]!=t2[11]: # 当时间的分钟不相等时,多减去一个40得出正确的时间,但这里并未对跨越 小时 的时候做出处理,只有在后面人为处理一下数据
t=int(t2)-int(t1)-40
else:
t = int(t2)-int(t1)
order(t)
time.sleep(0.5)
except Exception as result:
print("%s" %result)
finally:
GPIO.cleanup()
人体红外的检测代码到这里了,接下来等待24小时的数据上传…
开始记录时间:2020-06-09 08:31: 00
结束记录时间:2020-06-10 08:31: 00
任务要求三:绘制24小时内,温、湿度的变化曲线,把人的活动标注在曲线上;
经过一天的数据读取和上传,数据库中已经存放了很多数据,下面的第一张图是每隔一分钟的温度测量,第二张图是人靠近的时间以及持续的时间
将测得的所有温度值的数据汇成曲线(横坐标时间,纵坐标温度/°)
将人体红外传感器测得的人体靠近时间和持续时间绘制成曲线(横坐标时间,纵坐标持续时间/s)
任务要求四:分析当人靠近、停留多长时间会对温、湿度产生影响;
由于我采用的传感器精度不是很高,很多时间在无人的时候因为受到热源的影响也会做出反应,而且由于室内空调的影响,人对传感器的影响可以忽略不计,故这次实验我认为,人靠近和停留多久都不会对温度产生影响。