首页 > 解决方案 > 使用 Python 设置将插入 MySQL 的温度和湿度的最大值和最小值

问题描述

我对如何设置温度或湿度的最大值/最小值有一些疑问,因为有时在重新启动期间,湿度值突然飙升至 >5000% 或有时温度 >100C。

所以,我想确保这些数据没有插入到 SQL 中,并使用添加到.py

我应该改变这条线吗?

            if temp is not and hum is not None:

import serial
import time
import pymysql.cursors
#Connect to database
connection = pymysql.connect(host='localhost',
                             user='ubuntu',
                             password='testing',
                             database='Blabla',
                             cursorclass=pymysql.cursors.DictCursor)
arduino = serial.Serial('/dev/ttyACM0', 9600)
print('Established serial connection to Arduino')
with connection:
    while True:
            arduino_data = arduino.readline()
            decoded_values = str(arduino_data[0:len(arduino_data)].decode("utf-8"))
            list_values = decoded_values.split(' ')
            print(f'Collected readings from Arduino: {list_values}')
            arduino_data = 0
            temp = list_values[0]
            hum = list_values[1]
            #Here we are going to insert the data into the Database
            if temp is not and hum is not None:
                with connection.cursor() as cursor:
                    cursor.execute("INSERT INTO `SensorTest` (`Temperature`, `Humidity`) VALUES (%s,%s)", (temp,hum))
                    connection.commit()
                    cursor.close()
            else:
                print('Failed to read the sensor')
            time.sleep(60)

图1

图2

标签: mysqlpython-3.xarduinosensors

解决方案


当然,您可以在此行中添加更多过滤器以确保值没有错误。

我建议在脚本开始时(在导入之后)为 temp 和 hum 设置 const 有效最小值和最大值,例如:

MIN_VALID_TEMP = -20
MAX_VALID_TEMP = 90
MIN_VALID_HUM = 10
MAX_VALID_HUM = 1000

接下来,我建议将 temp 和 hum 验证拆分为辅助函数,例如:

def validate_reading(temp, hum):
    if not temp or not hum:
        return false
    if (temp > MIN_VALID_TEMP  and temp < MAX_VALID_TEMP and
    hum > MIN_VALID_HUM and hum < MAX_VALID_HUM):
        return true
    return false

并在以下情况下切换您的原件:

if temp and hum is not None:

到:

if validate_reading(temp, hum):

此外,您接下来可以做的是在读数无效时添加不同的打印!

最终文件将如下所示:

import serial
import time
import pymysql.cursors

# define valid temp and hum
MIN_VALID_TEMP = -20
MAX_VALID_TEMP = 90
MIN_VALID_HUM = 10
MAX_VALID_HUM = 1000


def validate_reading(temp, hum):
    if not temp or not hum:
        return False
    if temp > MIN_VALID_TEMP and temp < MAX_VALID_TEMP and hum > MIN_VALID_HUM and hum < MAX_VALID_HUM:
        return True
    return False


# Connect to database
connection = pymysql.connect(
    host="localhost", user="ubuntu", password="testing", database="Blabla", cursorclass=pymysql.cursors.DictCursor
)
arduino = serial.Serial("/dev/ttyACM0", 9600)
print("Established serial connection to Arduino")
with connection:
    while True:
        arduino_data = arduino.readline()
        decoded_values = str(arduino_data[0 : len(arduino_data)].decode("utf-8"))
        list_values = decoded_values.split(" ")
        print(f"Collected readings from Arduino: {list_values}")
        arduino_data = 0
        temp = list_values[0]
        hum = list_values[1]
        # Here we are going to insert the data into the Database
        if validate_reading(temp, hum):
            with connection.cursor() as cursor:
                cursor.execute("INSERT INTO `SensorTest` (`Temperature`, `Humidity`) VALUES (%s,%s)", (temp, hum))
                connection.commit()
                cursor.close()
        else:
            print("Failed to read the sensor")
        time.sleep(60)

推荐阅读