使用python+sqlalchemy把温湿度传感器的数据通过usb串口存到sqlite

NO.1
前言

已经完成了前期的几个操作

  1. Arduino Software (IDE) 开发环境已配置好,实现Hello World,程序正常编译

  2. 使用DHT11和Arduino获取房间中的温度和湿度数据(需要了解基本电路,先点灯,灯亮再试传感器)

  3. 使用python实现win10系统和arduino usb串口通信(蓝牙和wifi都暂时不考虑,usb通信优先)

上述步骤能够正常拿到温湿度数据,并且传递给win10系统

本文接着描述如何通过python+sqlalchemy把数据存到sqlite数据库(后期再写接口把温湿度提供给前端可视化)

NO.2
操作

1.安装sqlalchemy

pip install SQLAlchemy

2.创建数据库和表

# 引入sqlalchemy中相关模块
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.ext.declarative import declarative_base

# 连接数据库(有会自动忽略,无会自动创建)
engine = create_engine('sqlite:///thermometer.db', echo=True)
# 基本类
Base = declarative_base()

# 表要继承基本类
# 设置温湿度数据的类
class Thermometer(Base):
    __tablename__ = 'thermometer'  # 表的名字

    # 定义各字段
    id = Column(Integer, primary_key=True)
    # 温度
    temperature = Column(String(3))
    # 湿度
    humidity = Column(String(3))
    # 时间戳
    timestamp = Column(String(20))

    def __str__(self):
        return self.id


# 创建表(有表会自动忽略,无表会自动创建)
Base.metadata.create_all(engine)

3.连接数据库并插入数据

完整例子

# 引入sqlalchemy中相关模块
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.ext.declarative import declarative_base

# 连接数据库
engine = create_engine('sqlite:///thermometer.db', echo=True)

# 绑定引擎
metadata = MetaData(engine)
# 连接数据表
thermometer_table = Table('thermometer', metadata, autoload=True)
# 创建 insert 对象
ins = thermometer_table.insert()
# 绑定要插入的数据
ins = ins.values(temperature="26",humidity="70", timestamp="123456789")
# 连接引擎
conn = engine.connect()
# 执行语句
result = conn.execute(ins)

4.python获取当前时间戳

10时间戳获取方法

# 引入内置时间模块
import time
# 获取时间戳(单位秒)
t = time.time()
# 打印结果
print int(t)

13位时间戳获取方法

# 引入内置时间模块
import time
# round()进行四舍五入,*1000为毫秒
millis = int(round(time.time() * 1000))
# 打印结果
print millis

5.python获取arduino温湿度传感器数据存到sqlite

完整代码

# 引入串口库(注意是serial,不是pyserial)
import serial
# 引入json库
import json
# 引入时间
import time

# 引入sqlalchemy中相关模块
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.ext.declarative import declarative_base

# 连接数据库(有会自动忽略,无会自动创建)
engine = create_engine('sqlite:///thermometer.db', echo=True)
# 基本类
Base = declarative_base()

# 表要继承基本类

# 设置温湿度数据的类


class Thermometer(Base):
    __tablename__ = 'thermometer'  # 表的名字

    # 定义各字段
    id = Column(Integer, primary_key=True)
    # 温度
    temperature = Column(String(3))
    # 湿度
    humidity = Column(String(3))
    # 时间戳
    timestamp = Column(String(20))

    def __str__(self):
        return self.id


# 创建表(有表会自动忽略,无表会自动创建)
Base.metadata.create_all(engine)

# 绑定引擎
metadata = MetaData(engine)
# 连接数据表
thermometer_table = Table('thermometer', metadata, autoload=True)
# 创建 insert 对象
ins = thermometer_table.insert()


# 设置端口变量和值
serialPosrt = "COM3"
# 设置波特率变量和值
baudRate = 9600
# 设置超时时间,单位为s
timeout = 0.5
# 接受串口数据
ser = serial.Serial(serialPosrt, baudRate, timeout=timeout)

# 循环获取数据(条件始终为真)
while 1:
    # 读取接收到的数据的第一行
    strData = ser.readline()
    # 把拿到的数据转为字符串(串口接收到的数据为bytes字符串类型,需要转码字符串类型)
    strJson = str(strData, encoding='utf-8')
    # 如果有数据,则进行json转换
    if strJson:
        # 只有当检测到字符串中含有温湿度字符名时才进行json转码,其他的字符串内容不作操作
        if "temperature" in strJson:
            print("当前接受到的数据位->", strJson)
            # 字符串转为json(每个字符串变量名必须为双引号包括,而不是单引号)
            jsonData = json.loads(strJson)
            print("转码成功,当前类型为->", type(jsonData))
            # 温度
            temperature = jsonData["temperature"]
            # 湿度
            humidity = jsonData["humidity"]
            # 时间戳
            timestamp = str(int(round(time.time() * 1000)))
            # 绑定要插入的数据
            ins = ins.values(temperature=temperature,
                             humidity=humidity, timestamp=timestamp)
            # 连接引擎
            conn = engine.connect()
            # 执行语句
            result = conn.execute(ins)
    else:
        print("当前接收到的数据为空")

6.使用Navicat Premium查看sqlite数据

新建sqlite连接

sqlite

填写连接参数,选择sqlite文件

sqlite

查看sqlite数据

可以看到温湿度传感器的数据已经存在数据库了

NO.3
总结

本文描述了

  • 使用python+sqlalchemy向sqlite插入数据的方法

  • python获取10位或者13位时间戳的方法

  • 把arduino通过usb串口的数据存到sqlite,以供后续提供接口调用(前端可视化)

  • Navicat Premium连接sqlite数据库并查看数据的演示

下期内容

  • 使用python+falsk+flask_sqlalchemy+sqlite生成api接口

  • 温湿度动态可视化图表

END.