【Python】_读取温湿度传感器_并传入本地数据库

一、准备

温湿度传感器的搭建(是我们老师搭建的平台,我们连接校网就可以读取了)
提示:
不用连接哆点,只要能连上WiFi(或者连上网线)就行;
毕竟我没有校网拖到现在才做啊!

二、获取温湿度传感器的值

  • 新建工程
    在这里插入图片描述

源码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import socket
import codecs
import time

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
address = ('10.1.156.82', 8001)
sk.connect(address)
while True:
    inp = "030300000002c5e9"
    time.sleep(3)
    sk.send(codecs.decode(inp, 'hex'))
    data = sk.recv(1024)
    print("接受到的数据:")
    print(data)

    sd = codecs.encode(data[3:5], 'hex')
    sd = int(sd, base=16) / 100
    wd = codecs.encode(data[5:7], 'hex')
    wd = int(wd, base=16) / 100
    print("处理后的数据:")
    print("湿度:%s,温度:%s" % (sd, wd))
    print("  ")
sk.close()

运行结果:
在这里插入图片描述
在这里插入图片描述

三、传入本地数据库中

准备工作在我上一篇博客中说过了,链接点这儿:
【Python】_ 连接MySQL_(建表、查询、插入、删除)

  • 1连接数据库

  • 2获取传值并查看

  • 3传入数据库并查看数据库全部内容

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import socket
import codecs
import time
import datetime
import pymysql

#=========连接数据库=============
con = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='wy123456',
    db='python_windu',
    charset='utf8'
)
cur = con.cursor()  # 定义一个游标,通过游标来操作数据库
#==================获取传值=======================
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
address = ('10.1.156.82', 8001)
sk.connect(address)
while True:
    inp = "030300000002c5e9"
    time.sleep(3)
    sk.send(codecs.decode(inp, 'hex'))
    data = sk.recv(1024)
    print("=========================================")
    print("接受到的数据:")
    print(data)
    #==十六进制转int
    sd = codecs.encode(data[3:5], 'hex')
    sd = int(sd, base=16) / 100
    wd = codecs.encode(data[5:7], 'hex')
    wd = int(wd, base=16) / 100
    print("----------------------------------------")
    print("处理后的数据:")
    print("湿度:%s,温度:%s" % (sd, wd))
    print("  ")
    data = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")  # strftime格式化时间函数
    print("---------成功保存到数据库中!----------")
    #==插入到数据库中
    cur.executemany("INSERT pytest VALUE(%s,%s,%s)", [
        (data, str(wd), str(sd))])  # int转str
    con.commit()
    print("--------显示数据库内容------------")
    #===读取数据库
    select = cur.execute('SELECT * FROM pytest')
    all = cur.fetchall()
    print(all)

sk.close()

运行结果:
在这里插入图片描述
(排版什么的,请自动忽略,暴力达到目的)
看看MySQL有界面版吧!还行~
在这里插入图片描述
在这里插入图片描述
修改了一下界面,还是惨不忍睹,可以尝试用wxpython画个界面!不过本实验主要为获取传值,毕竟工地上没人去看界面,hhhh,我就偷懒啦!

四、打印成txt形式保存

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import socket
import codecs
import time
import datetime
import pymysql

#=========连接数据库=============
con = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='wy123456',
    db='python_windu',
    charset='utf8'
)
cur = con.cursor()  # 定义一个游标,通过游标来操作数据库
print("1、正在连接:")
#==================获取传值=======================
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
print("2、正在获取传值:")
address = ('10.1.156.82', 8001)
sk.connect(address)
while True:
    inp = "030300000002c5e9"  # 请求码
    time.sleep(3)
    sk.send(codecs.decode(inp, 'hex'))
    data = sk.recv(1024)
    print("3、接受到的数据:")
    print(data)
    #==十六进制转int
    sd = codecs.encode(data[3:5], 'hex')  # 16进制读取data第3到第5个数的值
    sd = int(sd, base=16) / 100     # 16进制转10进制保留两位小数,int类型
    wd = codecs.encode(data[5:7], 'hex')
    wd = int(wd, base=16) / 100
    print("4、处理后的数据:")
    print("湿度:%s,温度:%s" % (sd, wd))
    now_time = datetime.datetime.now().strftime(
        "%Y-%m-%d %H:%M:%S")  # strftime格式化时间函数
    print("5、成功保存到数据库中!")
    #==插入到数据库中
    cur.executemany("INSERT pytest VALUE(%s,%s,%s)", [
        (now_time, str(wd), str(sd))])  # int转str
    con.commit()
    print("6、显示数据库内容:")
    print("----------------------------------------")
    #===读取数据库打印表格
    sql = """ SELECT * FROM pytest """
    results = cur.fetchall()
    file = r"wendu.txt"
    fp = open(file, "w")
    fp.write("     温湿度传感器表1\n")
    fp.write("-----------------------------------\n")
    fp.write("时间" + "\t\t\t\t" + "温度" + "\t" + "湿度" + "\n")
    sum = 0  # 统计已录入数据次数
    try:
        # 执行SQL语句
        cur.execute(sql)
        # 获取所有记录列表
        results = cur.fetchall()
        print("       温湿度传感器表 ")
        print("-----------------------------\n")
        print("时间                                    温度           湿度\n")
        for it in results:
            fp.write(it[0] + "\t\t")
            fp.write(it[1] + "\t")
            fp.write(it[2] + "\n")
            for i in range(len(it)):
                print(it[i], end='    ')
            sum += 1
            print("\n")
        print("-----------------------------\n")
        print("    统计:(" + str(sum) + ")条记录\n")
        fp.write("------------------------------------\n")
        fp.write("总计:%d条记录\n" % sum)
        fp.close()
    except:
        print("未查询到数据")

sk.close()

运行截图:
在这里插入图片描述
在这里插入图片描述
查看txt文档:
在这里插入图片描述


附:
本次实验遇到的问题记录:
1、创表全为varchar类型,需要把全部输入数据库类型转换为str类型
在这里插入图片描述
2、起初创建表是 name(key value)、wendu、shidu
我插入语句时遇见问题:主键已存在、不能重复插入
最初:
在这里插入图片描述在这里插入图片描述
改为:(用时间插入)
在这里插入图片描述
3、还有这里我没设置sleep,一直读取,可以设置一下,我不详说了!


本次实验追加 客户端远程查询 操作,下一篇博客给出:
https://blog.csdn.net/cungudafa/article/details/86525807

猜你喜欢

转载自blog.csdn.net/cungudafa/article/details/85690998