差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
mp_data_logger [2021/10/04 14:31] gongyusu [文件系统] |
mp_data_logger [2021/10/04 14:36] (当前版本) gongyusu [记录温度] |
||
---|---|---|---|
行 16: | 行 16: | ||
<code python> | <code python> | ||
file.write("Hello, File!") | file.write("Hello, File!") | ||
+ | </code> | ||
当您在该行的末尾按 ENTER 时,您会看到数字 12 出现(图 9-1)。这是 MicroPython 向您确认它已将 12 个字节写入您打开的文件。数一数你写的消息中的字符数:包括字母、逗号、空格和感叹号,一共有十二个——每个占一个字节。 | 当您在该行的末尾按 ENTER 时,您会看到数字 12 出现(图 9-1)。这是 MicroPython 向您确认它已将 12 个字节写入您打开的文件。数一数你写的消息中的字符数:包括字母、逗号、空格和感叹号,一共有十二个——每个占一个字节。 | ||
行 47: | 行 48: | ||
### 记录温度 | ### 记录温度 | ||
现在您知道如何打开、写入和读取文件,您拥有在 Pico 上构建数据记录器所需的一切。 单击“新建”图标以在 Thonny 中启动一个新程序,然后键入以下内容启动您的程序: | 现在您知道如何打开、写入和读取文件,您拥有在 Pico 上构建数据记录器所需的一切。 单击“新建”图标以在 Thonny 中启动一个新程序,然后键入以下内容启动您的程序: | ||
- | + | <code python> | |
- | import machine import utime | + | import machine |
+ | import utime | ||
sensor_temp = machine.ADC(machine.ADC.CORE_TEMP) | sensor_temp = machine.ADC(machine.ADC.CORE_TEMP) | ||
conversion_factor = 3.3 / (65535) | conversion_factor = 3.3 / (65535) | ||
- | reading = sensor_temp.read_u16() * conversion_factor temperature = 27 - (reading - 0.706)/0.001721 | + | reading = sensor_temp.read_u16() * conversion_factor |
+ | temperature = 27 - (reading - 0.706)/0.001721 | ||
+ | </code> | ||
您可能会认出这个代码:它与您在第 8 章中用于读取 Pico 板载温度传感器的代码相同。 来自传感器的读数是您将要记录到文件系统的数据,因此您不想像以前那样简单地将它们打印出来。 | 您可能会认出这个代码:它与您在第 8 章中用于读取 Pico 板载温度传感器的代码相同。 来自传感器的读数是您将要记录到文件系统的数据,因此您不想像以前那样简单地将它们打印出来。 | ||
首先通过在底部添加以下行来打开一个文件进行写入: | 首先通过在底部添加以下行来打开一个文件进行写入: | ||
+ | <code python> | ||
file = open("temps.txt", "w") | file = open("temps.txt", "w") | ||
+ | </code> | ||
如果文件系统上不存在该文件,则会创建它; 如果是,它会覆盖它—— | 如果文件系统上不存在该文件,则会创建它; 如果是,它会覆盖它—— | ||
清空它的内容,为你写新数据做好准备。 | 清空它的内容,为你写新数据做好准备。 | ||
行 65: | 行 70: | ||
现在您需要向文件中写入一些内容——温度传感器的读数: | 现在您需要向文件中写入一些内容——温度传感器的读数: | ||
+ | |||
+ | <code python> | ||
file.write(str(temperature)) | file.write(str(temperature)) | ||
+ | </code> | ||
+ | |||
不像之前那样在引号中写一个固定的字符串,这次你是将变量温度——它是一个浮点数,换言之,一个带有小数点的数字——转换成一个字符串,然后写成 到文件。 | 不像之前那样在引号中写一个固定的字符串,这次你是将变量温度——它是一个浮点数,换言之,一个带有小数点的数字——转换成一个字符串,然后写成 到文件。 | ||
和以前一样,要确保写入数据,您需要关闭文件: | 和以前一样,要确保写入数据,您需要关闭文件: | ||
+ | |||
+ | <code python> | ||
file.close() | file.close() | ||
+ | </code> | ||
单击运行图标并将您的程序作为 Datalogger.py 保存到 Raspberry Pi Pico。 该程序只需几秒钟即可运行; 当 >>> 提示再次出现在 Shell 区域的底部时,单击进入它并键入以下内容以打开并阅读您的新文件: | 单击运行图标并将您的程序作为 Datalogger.py 保存到 Raspberry Pi Pico。 该程序只需几秒钟即可运行; 当 >>> 提示再次出现在 Shell 区域的底部时,单击进入它并键入以下内容以打开并阅读您的新文件: | ||
+ | <code python> | ||
file = open("temps.txt") | file = open("temps.txt") | ||
file.read() | file.read() | ||
file.close() | file.close() | ||
+ | </code> | ||
您将看到程序读取的温度读数出现在 Shell 中(图 9-3)。 恭喜:您的数据记录器工作正常! | 您将看到程序读取的温度读数出现在 Shell 中(图 9-3)。 恭喜:您的数据记录器工作正常! | ||
但是,仅记录单个读数(数据)的数据记录器并没有那么有用。为了使您的数据记录器更强大,您需要对其进行修改,使其需要大量读数。再次单击运行,并再次读取文件:。 | 但是,仅记录单个读数(数据)的数据记录器并没有那么有用。为了使您的数据记录器更强大,您需要对其进行修改,使其需要大量读数。再次单击运行,并再次读取文件:。 | ||
- | file = open("temps.txt") file.read() file.close() | + | <code python> |
+ | file = open("temps.txt") | ||
+ | file.read() | ||
+ | file.close() | ||
+ | </code> | ||
请注意文件中仍然只有一个读数。当您的程序再次打开文件进行写入时,它会自动擦除其先前的内容——这意味着每次您的程序运行时,它都会擦除文件并存储单个读数。 | 请注意文件中仍然只有一个读数。当您的程序再次打开文件进行写入时,它会自动擦除其先前的内容——这意味着每次您的程序运行时,它都会擦除文件并存储单个读数。 | ||
要解决这个问题,您需要修改您的程序。首先单击并拖动鼠标光标以突出显示线条: | 要解决这个问题,您需要修改您的程序。首先单击并拖动鼠标光标以突出显示线条: | ||
- | + | <code python> | |
- | reading = sensor_temp.read_u16() * conversion_factor temperature = 27 - (reading - 0.706)/0.001721 | + | reading = sensor_temp.read_u16() * conversion_factor |
+ | temperature = 27 - (reading - 0.706)/0.001721 | ||
+ | </code> | ||
当您突出显示两行时 - 确保不要错过任何部分 - 松开鼠标按钮并按键盘上的 CTRL+X 剪切线;你会看到它们从程序中消失了。 | 当您突出显示两行时 - 确保不要错过任何部分 - 松开鼠标按钮并按键盘上的 CTRL+X 剪切线;你会看到它们从程序中消失了。 | ||
接下来,转到程序底部并删除所有内容: | 接下来,转到程序底部并删除所有内容: | ||
+ | <code python> | ||
file = open("temps.txt", "w") | file = open("temps.txt", "w") | ||
+ | </code> | ||
敲入: | 敲入: | ||
+ | <code python> | ||
while True: | while True: | ||
+ | </code> | ||
+ | |||
在该行的末尾按 ENTER 后,按住 CTRL 键并按 V 键粘贴您之前剪切的两行。 你会看到它们出现,这样你就不必输入它们了——但只有第一行会正确缩进,所以它作为无限循环的一部分嵌套 | 在该行的末尾按 ENTER 后,按住 CTRL 键并按 V 键粘贴您之前剪切的两行。 你会看到它们出现,这样你就不必输入它们了——但只有第一行会正确缩进,所以它作为无限循环的一部分嵌套 | ||
你刚打开。 通过单击将光标放在下面一行的开头并按空格键四次以正确缩进该行,然后将光标移动到该行的末尾并 | 你刚打开。 通过单击将光标放在下面一行的开头并按空格键四次以正确缩进该行,然后将光标移动到该行的末尾并 | ||
按 ENTER。 | 按 ENTER。 | ||
键入以下行,确保正确缩进: | 键入以下行,确保正确缩进: | ||
+ | <code python> | ||
file.write(str(temperature)) | file.write(str(temperature)) | ||
+ | </code> | ||
不过,现在你需要做一些新的事情。 如果您像以前一样关闭文件,则在不重新打开文件并擦除其内容的情况下将无法再次写入文件。 如果您不关闭文件,数据将永远不会真正写入文件系统。 | 不过,现在你需要做一些新的事情。 如果您像以前一样关闭文件,则在不重新打开文件并擦除其内容的情况下将无法再次写入文件。 如果您不关闭文件,数据将永远不会真正写入文件系统。 | ||
解决方案:刷新文件,而不是关闭它。 类型: | 解决方案:刷新文件,而不是关闭它。 类型: | ||
+ | <code python> | ||
file.flush() | file.flush() | ||
+ | </code> | ||
当您写入文件但数据实际上并未写入文件系统时,它存储在所谓的缓冲区中——一个临时存储区域。 当您关闭文件时,缓冲区将在称为刷新的过程中写入文件。 使用 file.flush() 等效于 file.close(),因为它将缓冲区的内容刷新到文件中——但与 file.close() 不同的是,文件保持打开状态,以便您稍后向其中写入更多数据。 | 当您写入文件但数据实际上并未写入文件系统时,它存储在所谓的缓冲区中——一个临时存储区域。 当您关闭文件时,缓冲区将在称为刷新的过程中写入文件。 使用 file.flush() 等效于 file.close(),因为它将缓冲区的内容刷新到文件中——但与 file.close() 不同的是,文件保持打开状态,以便您稍后向其中写入更多数据。 | ||
现在你只需要在阅读之间暂停你的程序: | 现在你只需要在阅读之间暂停你的程序: | ||
+ | <code python> | ||
utime.sleep(10) | utime.sleep(10) | ||
+ | </code> | ||
您完成的程序将如下所示: | 您完成的程序将如下所示: | ||
+ | <code python> | ||
import machine import utime | import machine import utime | ||
sensor_temp = machine.ADC(machine.ADC.CORE_TEMP) | sensor_temp = machine.ADC(machine.ADC.CORE_TEMP) | ||
行 113: | 行 142: | ||
file.flush() | file.flush() | ||
utime.sleep(10) | utime.sleep(10) | ||
+ | </code> | ||
单击运行图标并数到 60,然后单击停止图标。 现在打开并阅读您的文件 | 单击运行图标并数到 60,然后单击停止图标。 现在打开并阅读您的文件 | ||
脚本区: | 脚本区: | ||
- | file = open("temps.txt") file.read() file.close() | + | <code python> |
+ | file = open("temps.txt") | ||
+ | file.read() | ||
+ | file.close() | ||
+ | </code> | ||
好消息是你的程序已经运行了,并且你已经在一个文件中记录了多个读数——大约六个,根据你计算的速度给出或取一些。 坏消息是它们都被挤在了一条线上(图 9-4)——这使得阅读变得困难。 | 好消息是你的程序已经运行了,并且你已经在一个文件中记录了多个读数——大约六个,根据你计算的速度给出或取一些。 坏消息是它们都被挤在了一条线上(图 9-4)——这使得阅读变得困难。 | ||
要解决该问题,您需要在将数据写入文件时对其进行格式化。 回到程序中的 file.write() 行,修改它,使其看起来像: | 要解决该问题,您需要在将数据写入文件时对其进行格式化。 回到程序中的 file.write() 行,修改它,使其看起来像: | ||
+ | <code python> | ||
file.write(str(temperature) + "\n") | file.write(str(temperature) + "\n") | ||
+ | </code> | ||
加号 (+) 告诉 MicroPython 您要附加后面的内容,将两个字符串连接在一起; "\n" 是一个称为控制字符的特殊字符串——它相当于按下 ENTER 键,这意味着数据日志中的每一行都应该在自己单独的行上。 | 加号 (+) 告诉 MicroPython 您要附加后面的内容,将两个字符串连接在一起; "\n" 是一个称为控制字符的特殊字符串——它相当于按下 ENTER 键,这意味着数据日志中的每一行都应该在自己单独的行上。 | ||
单击运行图标,再次数到 60,然后单击停止。 打开并阅读您的文件: | 单击运行图标,再次数到 60,然后单击停止。 打开并阅读您的文件: | ||
- | file = open("temps.txt") file.read() file.close() | + | <code python> |
- | 您已经取得了进步,但仍然不对:\n 控制字符的作用不像按 ENTER 键,而是打印为两个可见字符(图 9-5,背面)。 那是因为 file.read() 引入了文件的原始内容,并没有尝试为屏幕格式化它。 | + | file = open("temps.txt") |
+ | file.read() | ||
+ | file.close() | ||
+ | </code> | ||
+ | 您已经取得了进步,但仍然不对:\n 控制字符的作用不像按 ENTER 键,而是打印为两个可见字符(图 9-5,背面)。 那是因为 <code python> | ||
+ | file.read() | ||
+ | </code> | ||
+ | 引入了文件的原始内容,并没有尝试为屏幕格式化它。 | ||
要解决格式问题,您需要将读取的文件包装在一个 print() 函数中: | 要解决格式问题,您需要将读取的文件包装在一个 print() 函数中: | ||
- | file = open("temps.txt") print(file.read()) file.close() | + | <code python> |
+ | file = open("temps.txt") | ||
+ | print(file.read()) | ||
+ | file.close() | ||
+ | </code> | ||
这一次,您会看到每个读数都单独打印出来,格式整齐且易于阅读(图 9-6)。 | 这一次,您会看到每个读数都单独打印出来,格式整齐且易于阅读(图 9-6)。 | ||
恭喜:您已经构建了一个数据记录器,它可以获取多个读数并将它们存储在 Pico 的文件系统中! | 恭喜:您已经构建了一个数据记录器,它可以获取多个读数并将它们存储在 Pico 的文件系统中! | ||
行 136: | 行 183: | ||
在 Thonny 中,如果程序正在运行,则停止后,单击文件菜单,然后单击另存为。在出现的弹出窗口中单击“Raspberry Pi Pico”,然后在单击“保存”之前键入“main.py”作为文件名。起初,似乎什么都不会发生:那是因为 Thonny 将您的 Pico 置于交互模式,这会阻止它自动运行您刚刚保存的程序。 | 在 Thonny 中,如果程序正在运行,则停止后,单击文件菜单,然后单击另存为。在出现的弹出窗口中单击“Raspberry Pi Pico”,然后在单击“保存”之前键入“main.py”作为文件名。起初,似乎什么都不会发生:那是因为 Thonny 将您的 Pico 置于交互模式,这会阻止它自动运行您刚刚保存的程序。 | ||
要强制程序运行,请单击 Shell 区域底部并按住 CTRL 键,按 D 键,然后松开 CTRL 键。这会向您的 Pico 发送一个软重置命令,这将使其退出交互模式并启动程序运行。找点别的事情做五分钟左右,然后按停止图标并打开您的数据日志: | 要强制程序运行,请单击 Shell 区域底部并按住 CTRL 键,按 D 键,然后松开 CTRL 键。这会向您的 Pico 发送一个软重置命令,这将使其退出交互模式并启动程序运行。找点别的事情做五分钟左右,然后按停止图标并打开您的数据日志: | ||
- | file = open("temps.txt") print(file.read()) file.close() | + | <code python> |
+ | file = open("temps.txt") | ||
+ | print(file.read()) | ||
+ | file.close() | ||
+ | </code> | ||
即使您没有单击“运行”图标,您也会看到温度读数列表——因为当 Pico 重置时,您的程序会自动运行。 | 即使您没有单击“运行”图标,您也会看到温度读数列表——因为当 Pico 重置时,您的程序会自动运行。 | ||
如果您有微型 USB 充电器或 USB 电池组,请将 Pico 与 Raspberry Pi 断开连接,将其带到另一个房间,然后将其连接到充电器或电池组。 把它放在那里十分钟,然后回来拔掉它。 将它带回您的 Raspberry Pi,重新插入,然后再次阅读您的文件:您将看到另一个房间的读数,证明您的 Pico 可以在没有您的 Raspberry Pi 帮助的情况下完美运行。 | 如果您有微型 USB 充电器或 USB 电池组,请将 Pico 与 Raspberry Pi 断开连接,将其带到另一个房间,然后将其连接到充电器或电池组。 把它放在那里十分钟,然后回来拔掉它。 将它带回您的 Raspberry Pi,重新插入,然后再次阅读您的文件:您将看到另一个房间的读数,证明您的 Pico 可以在没有您的 Raspberry Pi 帮助的情况下完美运行。 |