【问题标题】:is there a way for python to check for value change and then trigger a function?python有没有办法检查值变化然后触发函数?
【发布时间】:2020-05-23 15:14:03
【问题描述】:

我正在做一个使用树莓派模型 3b 和 dht11 来测量温度的学校项目。我希望仅在温度值增加或减少时将温度数据发送到云服务(Beebott)。我需要为此使用观察者模式吗?下面是我学校项目的代码:

import pygame
import Adafruit_DHT #Import DHT Library for sensor
import time
import datetime
from time import sleep, strftime
import Adafruit_CharLCD as LCD
import requests
from beebotte import *

_accesskey  = 'My accesskey'
_secretkey  = 'My secretkey'
bbt = BBT( _accesskey, _secretkey)

GPIO.setwarnings(False)

lcd_rs = 27
lcd_en = 22
lcd_d4 = 25
lcd_d5 = 24
lcd_d6 = 23
lcd_d7 = 18
lcd_backlight = 4

lcd_columns = 16
lcd_rows = 2

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)

ReedSwitchPin = 17
LED = 21

sensor_name = Adafruit_DHT.DHT11 #we are using the DHT11 sensor
sensor_pin = 16 #The sensor is connected to GPIO16 on Pi

RawValue = 0

timer = time.time()

#buzzer = 5

#Setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(ReedSwitchPin, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
#GPIO.setup(buzzer,GPIO.OUT)
#SFX
pygame.init()
pygame.mixer.init()
Alarm = pygame.mixer.Sound("/home/pi/python_games/bomb.wav")

try:
    while True:
        RawValue = GPIO.input(ReedSwitchPin)

        if (RawValue == 0):
            lcd.clear() #Clear the LCD screen
            GPIO.output(LED,True)
            if time.time() - timer > 30:
                def telegram_bot_sendtext(bot_message):
                    bot_token = 'my bot_token' #token that can be generated talking with @BotFather on telegram
                    bot_chatID = 'my bot_chatID'
                    send_text = 'https://api.telegram.org/bot' + bot_token + '/sendMessage?chat_id=' + bot_chatID + '&parse_mode=Markdown&text=' + bot_message

                    response = requests.get(send_text)

                    return response.json()
                    GPIO.output(LED,True)
                    Alarm.play()
                test = telegram_bot_sendtext("The refrigerator door is left open! Please close it immediately") # the message to send 

        else:
            GPIO.output(LED, False)
            Alarm.stop()
            humidity, temperature = Adafruit_DHT.read_retry(sensor_name, sensor_pin) #read from sensor & save respective values in temperature and humidity variable
            lcd.clear() #Clear the LCD screen
            lcd.message ('Temp = %.1f C' % temperature) # Display the value of temperature
            previous_temperature = None

            while True:
                if temperature != previous_temperature:
                    bbt.write("MonitoringTemperature", "Temperature", temperature)
                previous_temperature = temperature
                break

        # 0 is off, 1 is activated by magnet
        #print(" ,RawValue:",RawValue)

        time.sleep(1)

except KeyboardInterrupt:
    pass
print("Exiting Reed Switch Test ...")

GPIO.cleanup()

【问题讨论】:

  • 您只需要跟踪前几个读数,并可能进行一些平滑处理以应对环境变化。
  • 完全不相关,但您想将 telegram_bot_sendtext 函数定义移出主循环 - 无需一遍又一遍地重新定义相同的函数。此外,return reponse.json() 之后的两行将永远不会被执行。

标签: python python-3.x raspberry-pi3 dashboard temperature


【解决方案1】:

您可以使用previous_temperaturevariable 来检查值是否发生了变化:

previous_temperature = None

while True:
    temperature = input("Give me the new temperature :")
    if temperature != previous_temperature:
        print("trigger something !")
    previous_temperature = temperature

** 编辑 **

在我的示例中,我使用input() 来模拟您的新温度,但在您的情况下,您使用humidity, temperature = Adafruit_DHT.read_retry(...)。所以你必须把这段代码放在while循环中。我还添加了time.sleep(),因此系统在读取新温度值之前等待 10 秒。

试试这个:

        else:
            GPIO.output(LED, False)
            Alarm.stop()
            lcd.clear() #Clear the LCD screen
            previous_temperature = None

            while True:
                humidity, temperature = Adafruit_DHT.read_retry(sensor_name, sensor_pin) #read from sensor & save respective values in temperature and humidity variable
                lcd.message ('Temp = %.1f C' % temperature) # Display the value of temperature
                if temperature != previous_temperature:
                    bbt.write("MonitoringTemperature", "Temperature", temperature)
                    break
                previous_temperature = temperature
                time.sleep(10) # wait 10 seconds before reading the new temperature

【讨论】:

  • 感谢您的回复!我是否需要使用 temperature = input("Give me the new temperature :") 因为我的温度变量是 = 从传感器读取的数据。以及如何退出 while True 循环?抱歉回复晚了!
  • 忘掉我问的最后一个问题吧!我找到了答案,就是break语句。但是当我使用 previous_temperature 变量并检查我的仪表板时,即使温度相同,它仍然会发送数据。无论如何,我已经在运行一个我没有包含在这个问题中的 while True 循环。如果我要运行 2 while True 循环,它会影响什么吗?
  • 我已经更新了代码。请看一看!非常感谢
  • 在答案中查看我的EDIT 部分:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多