我是一个JS开发人员,正在研究一个从蓝牙温度传感器读取数据的Raspberry-Pi3项目,试图学习一点Python。在
我需要把数据写到文件.txt每隔10秒,我怎么能做到呢?我在这里找到了类似的主题(Run certain code every n seconds),但我不知道如何在我当前的场景中使用它。在
#!/usr/bin/env python3
import argparse
import re
import logging
import sys
import time
from btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend
from mitemp_bt.mitemp_bt_poller import MiTempBtPoller, \
MI_TEMPERATURE, MI_HUMIDITY, MI_BATTERY
def valid_mitemp_mac(mac, pat=re.compile(r"4C:65:A8:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}")):
"""Check for valid mac adresses."""
if not pat.match(mac.upper()):
raise argparse.ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(mac))
return mac
def poll(args):
"""Poll data from the sensor."""
backend = _get_backend(args)
poller = MiTempBtPoller(args.mac, backend)
line1 = "Temperature: {}".format(poller.parameter_value(MI_TEMPERATURE))
line2 = "Humidity: {}".format(poller.parameter_value(MI_HUMIDITY))
print("Getting data from Mi Temperature and Humidity Sensor")
print("FW: {}".format(poller.firmware_version()))
print("Name: {}".format(poller.name()))
print("Battery: {}".format(poller.parameter_value(MI_BATTERY)))
print(line1)
print(line2)
f = open('file.txt', 'w')
f.write("%s \n %s \n" % (line1, line2))
f.close()
def _get_backend(args):
"""Extract the backend class from the command line arguments."""
if args.backend == 'gatttool':
backend = GatttoolBackend
elif args.backend == 'bluepy':
backend = BluepyBackend
elif args.backend == 'pygatt':
backend = PygattBackend
else:
raise Exception('unknown backend: {}'.format(args.backend))
return backend
def list_backends(_):
"""List all available backends."""
backends = [b.__name__ for b in available_backends()]
print('\n'.join(backends))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--backend', choices=['gatttool', 'bluepy', 'pygatt'], default='gatttool')
parser.add_argument('-v', '--verbose', action='store_const', const=True)
subparsers = parser.add_subparsers(help='sub-command help', )
parser_poll = subparsers.add_parser('poll', help='poll data from a sensor')
parser_poll.add_argument('mac', type=valid_mitemp_mac)
parser_poll.set_defaults(func=poll)
parser_scan = subparsers.add_parser('backends', help='list the available backends')
parser_scan.set_defaults(func=list_backends)
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
if not hasattr(args, "func"):
parser.print_help()
sys.exit(0)
args.func(args)
if __name__ == '__main__':
main()
您可以使用
time
模块在每次迭代中暂停程序10秒然而,这将阻止程序的其余部分的运行,尽管一个简单的多线程脚本来调用编写函数就足够了。在
对于您正在使用的代码,请在
^{pr2}$poll
函数中插入sleep
调用,并包装其中的内容。如果你想循环程序10次那么或者如果你想让它永远运行直到你
KeyboardInterrupt
或者以某种方式退出:你需要某种类型的循环,轮询你的传感器-我没有看到一个浏览你的代码。JS中还有while和for循环-如果您不确定语法,请在http://docs.python.org/3/tutorial中查找它们。
存储写入变量的时间,休眠一点轮询下一个值,检查是否通过10秒,如果通过则写入,否则不。(如果不想打印中间值,则只需在两次投票之间休眠10秒
阅读循环:
输出:
^{pr2}$更多备注:
使用
with open(filename,mode) as f:
并在其下方限定文件操作范围-它将在作用域之后自动关闭文件,并通过关闭filehandle来处理异常。使用模式“w”将在写入之前截断文件-您可能需要使用append来代替:reading and writing files
相关问题 更多 >
编程相关推荐