ESP8266(MicroPython):如何在没有锁定的情况下进行轮询?

时间:2018-02-10 16:35:53

标签: microcontroller esp8266 micropython

我是微控制器编程的新手,并尝试每隔2分钟从连接到ESP8266的DHT11读取温度和湿度读数。我的初始尝试是一个天真的while循环,在每次迭代中都有一个睡眠...这锁定了设备,但确实按预期每2分钟读取一次。显然这不是一个好的方法,我觉得我在如何使用MicroPython在ESP8266上编写连续过程方面缺少一些基本的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

有一个Arduino示例草图,它实现了类似问题的解决方案:" BlinkWithoutDelay"。虽然它的C ++与你的python问题相反,但这个想法仍然是一样的。

我们可以重复检查当前时间,而不是轮询传感器数据并utime.sleep() - 直到下一次读取。如果当前时间减去我们最后一次做某事超过一定的间隔时间,我们会做那件事并记住我们做的时间。另外,我们只是继续做不同的事情。

micropython blog post一样,我们可以这样做:

import dht
import machine
import utime

d = dht.DHT11(machine.Pin(4))

# keep track of the last time we did something
last_measurement_ms = 0
# define in what intervals we want to do something
INTERVAL = 5000 # do something every 5000 ms

# main "loop".
while True:
    # has enough time elapsed? we need to use ticks_diff here
    # as the documentation states. 
    #(https://docs.micropython.org/en/latest/pyboard/library/utime.html)
    if utime.ticks_diff(utime.ticks_ms(), last_measurement_ms) >= INTERVAL:
        # yes, do a measurement now.
        d.measure()
        temp = d.temperature() 
        print("Temperature is %d." % (temp)) 

        #save the current time.
        last_measurement_ms = utime.ticks_ms()
    # do the stuff you would do normally.
    # this will be spammed, as  there is nothing else to do 
    print("Normal loop") 

请注意,我没有一个带有micropython固件的实际ESP8266来验证这一点,但你应该明白这一点。

答案 1 :(得分:1)

另一种方法是让机器在读数之间“深度睡眠”。

然后,如果您将RST引脚连接到引脚16,它可以自动唤醒(并进行下一次测量)。

我一直这样做,我的main.py看起来像是:

import wifi
import mqtt
import dht
import time    

# This function will wait for the wifi to connect, or timeout
# after 30 seconds.
wifi.connect()
# This import/function inits the sensor, and gets data from it
result = dht.sensor.measure()
# In my case, I'm pushing the data to an MQTT broker - this
# function connects to the broker and sends the relevant data.
mqtt.send(result)
# We need to sleep here, otherwise our push to the broker may not
# complete before we deepsleep below.
time.sleep(5)
# This function will stop all processing, and then try to wake
# after the given number of microseconds. This value should be 2
# minutes.
esp.deepsleep(1000000 * 60 * 2)

注意事项。

  • 您必须将引脚16连接到RST引脚。
  • 我遗漏了wifi,dht和mqtt模块 - 它们会根据您的要求(例如凭据,或者如果您使用的是MQTT之外的其他内容)而有所不同。
  • 您必须进行time.sleep()通话,否则ESP8266可能会在发送消息之前休眠。当通过串口连接时,它还会给Ctrl-C一些时间并停止重启循环。

显然,如果您需要在设备上执行其他操作(除了唤醒,读取和发送数据之外),那么您还需要做其他事情。