【嵌入式】第一次大作业_记录环境温度并存入数据库

第一次嵌入式课程大作业

一年级下的嵌入式期末考试,当时做完忘记录一下了,现在重新上传

课程要求:

(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)

在这里插入图片描述

任务要求四:分析当人靠近、停留多长时间会对温、湿度产生影响;
由于我采用的传感器精度不是很高,很多时间在无人的时候因为受到热源的影响也会做出反应,而且由于室内空调的影响,人对传感器的影响可以忽略不计,故这次实验我认为,人靠近和停留多久都不会对温度产生影响。

总结:经过此次课程实验,这次任务完美结合了三者的使用,使我对linux操作系统,python语言,以及数据库mysql有了深入的了解,从小白成长为入门,这只是嵌入式的第一步,继续加油!

猜你喜欢

转载自blog.csdn.net/ndjasdn/article/details/108024939