运行 BASIC 的 Arduino RP2040 独立物联网计算机。

崧峻
转载
发布时间: 2025-06-14 14:50:14 | 阅读数 0收藏数 0评论数 0
封面
本教程是关于构建运行 BASIC 方言的独立计算机,适用于物联网和交互式工作。它使用现成的低成本组件,并且可以轻松集成。那么为什么要在微控制器上运行 BASIC?每个在 80 年代的微控制器上编程过的人都忽略了现代计算机的一件事。当你想快速做某事时,它就是易用性。

准备工作:

材料:

计算机的核心部件是

  1. Arduino RP2040 连接微控制器板(https://store.arduino.cc/products/arduino-nano-rp2040-connect
  2. 基于 ILI9488 的显示屏蔽。这些屏蔽基于 SPI,具有 SD 卡插槽和可选触摸输入(此处不需要)。这些屏蔽非常常见。请确保为该硬件项目购买基于 SPI 的屏蔽。
  3. 电压电平转换器。
  4. 一个旧的 PS2 键盘和一个 PS2 插头。
  5. 要么是大型面包板,要么最好是 10x15 厘米的电路板。
  6. 如果您在面包板上构建,则需要面包板电缆。
  7. 可选 SD 卡。
  8. 可选 DS1307 或 DS3231 实时时钟。
  9. 可选的 7805 稳压器、0.1 uF 和 0.33 uF 电容器以及电源插头。
  10. 可选配串行热敏打印机。
  11. 一些胶合板和一块用于支架的小面包板,外加一个电源。

除了硬件供应之外,您还需要一些软件组件。

  1. Arduino IDE。我使用 1.8.15,但较新版本也可以使用。
  2. Arduino Mbed OS Nano 板文件可以从 Arduino IDE 中的板管理器下载。
  3. Adadfruit_GFX 库可以通过库管理器在 Arduino IDE 中下载(https://github.com/adafruit/Adafruit-GFX-Library)。我使用的是 1.10.14 版本。
  4. 来自 Arduino IDE 的 uRTC 库(https://github.com/Naguissa/uRTCLib)。我使用的是 6.4.0 版本。
  5. Arduino IDE 库管理器 ( https://github.com/khoih-prog/LittleFS_Mbed_RP2040 ) 支持 LittleFS_Mbed。我使用的是 1.1.0 版本。
  6. ILI9488 库,我推荐我的 fork https://github.com/slviajero/ILI9488
  7. 修补的键盘库https://github.com/slviajero/PS2Keyboard
  8. 如果您想使用 EEPROM 文件系统,您还需要 EEPROM 库https://github.com/slviajero/EepromFS 。
1

将显示器连接到微控制器

ILI9488 SPI 背面有两排连接器。左侧有电源、显示器和触摸屏连接器(如果您有触摸型号)。右侧有 4 个 SD 卡连接器。对于此项目,不使用触摸连接器。

如果您使用电路板,请将屏幕放在电路板的右上角。默认情况下,BASIC 解释器将以横向模式使用屏幕。使用图片中的布局,可以从上方取出 SD 卡,并且电路板下侧有空间容纳其他组件。

另外,安装 Arduino 时,应使电源连接器位于电路板的上方。这样可以更轻松地布线和安装计算机。

ILI9488 显示器是 3.3V 系统,Arduino RP2040 也是。这里不需要电平转换器。

将 Arduino 的 3.3V 电源引脚和 GND 引脚与显示屏上的相应引脚连接起来。它们是最上面的引脚。

要驱动显示器,CS 引脚必须与 Arduino 的引脚 9 连接,DC 与引脚 8 连接,RESET 与引脚 7 连接。

Arduino 上的 SPI 总线引脚有 13 个用于 SCK,12 个用于 MISO(=CIPO),13 个用于 MOSI(=COPI)。这些是标准的 Arduino 设置。将这些引脚与显示器上的相应引脚连接起来。

LED 引脚可用于控制显示屏的亮度。您可以将其与电位器连接,也可以将其连接到模拟引脚 A3。后者可让您通过 BASIC 程序控制显示屏的亮度。

完成这些连接后,您就大功告成了。如果您迫不及待,可以立即尝试 BASIC 解释器。

将文件从https://github.com/slviajero/tinybasic/tree/main/IoTBasic上传到您的 Arduino IDE。

打开文件 IoTBasic.ino 并编辑语言定义部分:

#define BASICFULL
#undef BASICINTEGER
#undef BASICSIMPLE
#undef BASICMINIMAL
#undef BASICTINYWITHFLOAT

仅应定义 BASICFULL。这将编译所有语言特性。

打开 hardware-arduino.ino 并编辑硬件功能部分:

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488 #undef
ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA #undef
ARDUINOEEPROM
#undef ARDUINOEFS
#undef ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#undef ARDUINORTC
#undef ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

除 ARDUINOILI9488 和 DISPLAYCANSCROLL 之外,所有内容都应未定义。

您还需要下载 ILI9488 库。我建议使用我的 repo https://github.com/slviajero/ILI9488中的副本。这是基于 Adafruit_GFX 的 Jaret Burkett 库的一个分支。我将来会研究硬件滚动。您还需要通过 Arduino IDE 库管理器或直接从 repo adafruit/Adafruit-GFX-Library 安装 Adafruit_GFX 库:Adafruit GFX 图形核心库,这是我们所有其他图形库都从中派生的“核心”类 (github.com)

编译草图并将其上传到 Arduino。BASIC 解释器应提示在串行线上输入。

进入

PRINT &2, "Hello World"

如果接线正确,显示屏上就会显示该信息。

2

连接 SD 卡或激活 LittleFS

对于独立计算机,您将需要文件存储。RP2040 有两种选择。要么使用显示器的 SD 卡插槽,要么使用带有 LittleFS 的控制器的内部闪存。考虑到 SD 卡的不稳定性及局限性,我建议使用 LittleFS 作为独立计算机的文件系统。

SD 卡

关于 SD 卡,需要注意一点:有些卡可以在带有标准 SD 库的 Arduino 上运行,有些则不行。根据我的经验,在 Windows 系统上,格式化干净并检查过错误的卡是最好的选择。如果您的系统出现偶发错误,请检查接线,也可以尝试使用其他卡。这些卡直接连接到 SPI 总线,只用几个电阻。时序行为混乱的卡可能会导致奇怪的偶发错误。我在这台电脑上使用金士顿 1GB 卡。

要使用 SD 卡插槽,您需要将显示器右侧 SD 端口的 SD_MISO、SD_MOSI 和 SD_SCK 连接到如上所示的 SPI 总线引脚。

除此之外,将 Arduino 的第 10 针连接到 SD_CS 针。

打开hardware-arduino.h,将SD卡系统添加到硬件定义部分:

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA #undef
ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#undef ARDUINORTC
#undef ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

仅 ARDUINOILI9488 和 ARDUINOSD 被定义,其他均未定义。

我们在此代码中使用标准 Arduino SD 库。

编译并上传草图。插入 SD 卡并重新启动 Arduino。

再次,BASIC 应该在串行监视器上显示命令提示符。

输入一个小程序,如


10 PRINT &2, "hello world"
20 PRINT "hello world"

然后输入

SAVE
CATALOG

BASIC 应在第二个命令后列出 SD 卡的内容。您的程序显示为 file.bas。

如果这些命令中的任何一个出现错误,请检查接线并尝试使用不同的 SD 卡。

小小FS

如果您不需要可移动文件存储或没有合适的 SD 卡,最好使用内部闪存。不要使用编译器设置 ARDUINOSD,而是使用 RP2040LITTLEFS。您还需要从 Arduino IDE 库管理器安装库 LittleFS_Mbed,或从此处下载https://github.com/khoih-prog/LittleFS_Mbed_RP2040

在这种情况下,编译器设置为

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA #undef
ARDUINOEEPROM
#undef ARDUINOEFS
#undef ARDUINOSD
#undef ESPSPIFFS
#define RP2040LITTLEFS
#undef ARDUINORTC
#undef ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

编译并上传程序。

BASIC 启动后,您会看到第一个命令行,输入

FDISK

初始格式化内部 LittleFS 文件存储。此后,所有文件命令都可以在内部存储上使用。默认文件系统大小为 1GB。这可以在编译时使用参数“RP2040_FS_SIZE_KB”进行更改。

SAVE“文件名”保存一个程序。

LOAD“文件名”加载一个程序。

CATALOG 显示存储的文件。

DELETE 删除文件。

OPEN 和 CLOSE 打开和关闭文件以供读取。有关更多信息,请参阅手册https://github.com/slviajero/tinybasic/blob/main/MANUAL.md的文件 I/O 部分。


3

替代大容量存储 - EEPROM

如果您手头没有合适的 SD 卡但仍想在计算机中添加可移动大容量存储设备,EEPROM 模块是一个很好的替代方案。

将 SDA 和 SCL 分别连接到 Arduino 引脚 A4 和 A5,并将电源连接到 VCC 和 GND。我推荐使用 32kB 或 64kB EEPROM 模块。

从我的 repo https://github.com/slviajero/EepromFS下载 EEPROM 文件系统库。此库可在任何 I2C EEPROM 上创建一个非常简单的文件系统。它可以在没有 BASIC 解释器的情况下用作独立组件。文件系统将 EEPROM 划分为多个大小相等的插槽,并在其中存储文件。API 是 C 样式。

不要设置 ARDUINOSD 或 RP2040LITTLEFS,而是设置编译器标志 ARDUINOEFS。

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA
#undef ARDUINOEEPROM
#define ARDUINOEFS
#undef ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#undef ARDUINORTC
#undef ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

您还需要设置 EEPROM 大小和 I2C 地址。这在代码部分完成


#define EEPROMI2CADDR 0x050
#define RTCI2CADDR 0x068
#define EFSEEPROMSIZE 32767

暂时保持 RTC 设置不变并在那里添加数据。

编译草图并上传。

一旦 BASIC 解释器启动,您就可以格式化 EEPROM 文件系统

FDISK 4

将在 32kB EEPROM 上创建 4 个 8kB 的文件槽。

现在可以在 EEPROM 上使用 CATALOG、SAVE、LOAD、OPEN、CLOSE 和 DELETE 等文件命令。

EEPROM 模块可以在不同的 BASIC 计算机之间轻松交换。它们有点像旧 ATARI 计算机的程序模块。EEPROM 模块的优点是能耗低。

或者,实时时钟的 EEPROM 可用作文件系统。有关详细信息,请参阅“添加时间”部分。

有关 EEPROM 的更多信息,请参阅“构建小兄弟”下面的部分以及教程https://www.instructables.com/Use-I2C-EEPROMs-As-a-File-System-on-an-Arduino/


4

间奏曲 - 尝试图形

一旦有了可运行的 SD 卡和显示器,您就可以尝试一些图形。关闭 Arduino,取出 SD 卡,将其放入计算机。

将教程部分中的程序https://github.com/slviajero/tinybasic/blob/main/examples/00tutorial/mandelv.bas放在SD 卡上,然后将其重新插入 Arduino。

在 BASIC 命令提示符下输入

LOAD "MANDELV.BAS"
RUN

曼德布洛特集合应该出现在您的显示屏上。

5

添加时间。

实时时钟板连接到计算机的 I2C 总线。我将板子放在 Arduino 正下方稍右的位置。

将 VCC 和 GND 连接器连接到 Arduino。

时钟的 SDA 与 Arduino 上的 A4 相连,SCL 与 A5 相连。这是标准引脚排列。图片中时钟右侧的两个插头是 I2C 连接器。两者上都有 I2C 总线,顺序为(GND、VCC、SDA、SCL)。这是标准的 Grove 引脚排列。这些连接器稍后用于连接传感器。

再次使用设置重新编译草图

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA
#undef ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

除了之前的定义之外,还定义了ARDUINORTC和ARDUINOWIRE。

您将获得 uRTC 库。可以使用 Arduino 库管理器下载。

请检查 I2C 设置


#define EEPROMI2CADDR 0x050
#define RTCI2CADDR 0x068
#define EFSEEPROMSIZE 32767

值 0x068 是标准 I2C 实时时钟值。如果您使用具有不同地址的模块,则需要在此处进行更改。如果您使用上述 EFS 文件系统,并且有一个额外的 EEPROM 连接到 I2C 总线,请检查是否存在地址冲突。有些时钟的 EEPROM 位于 0x057,有些位于 0x050。系统上只能有一个 EEPROM。

命令行上出现 BASIC 提示符后,输入

@T(0)=0
PRINT @T$

第一个命令初始化时钟,第二个命令应显示日期字符串。


6

添加键盘

到目前为止,3.3V 领域的所有工作都已完成。犯错很少会对 Arduino 或任何组件造成永久性损坏。

PS2 键盘需要 5V。要使电路板上有 5V 电压,您需要在 Arduino 背面短路一个连接,如图所示。焊接此连接。现在 Arduino 的 5V 引脚有电了。将其与任何其他引脚连接都可能会损坏电路板。

您现在需要电平转换器。将 3.3V、GND 以及 Arduino 引脚 2 和 5 连接到电平转换器的 3.3V 侧。将 5V 和 GND 连接到电平转换器的 5V 侧。我将电平转换器和所有其他 5 V 设备放在电路板的下侧,以避免发生任何意外。

现在,您可以像图中所示那样连接 PS2 插座。插座右侧的时钟引脚连接到电平连接器 5 V 侧的引脚,该引脚具有 Arduino 的引脚 2 数据。数据引脚与电平连接器引脚相连,该引脚具有 Arduino 的引脚 5 数据。电源和地线分别连接。

您现在可以再次扩展 hardware-arduino.h 中的硬件定义

#undef USESPICOSERIAL 
#define ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT #undef
ARDUINOVGA
#undef ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

添加定义 ARDUINOPS2。您将需要 Arduino PS2 库。我建议使用我从https://github.com/slviajero/PS2Keyboard中分叉的库,因为我添加了一些有用的功能。

现在您可以连接键盘并重新启动 Arduino。重新启动后,键盘的状态灯应闪烁。PS2 键盘通常需要大量电力。有时键盘初始化太慢。如果出现问题,可能需要通过断开电源并重新连接来重新启动 Arduino。

键盘闪烁后,你可以尝试使用 BASIC 程序

10 FOR I=1 TO 100
20 GET &2, A: PRINT A
30 DELAY 500
40 NEXT

输入 RUN 启动程序。按键的 ASCII 值应出现在串行监视器上。

7

使其独立

现在您已准备好独立运行。

通过定义相应的行来设置 hardware-arduino.h 中的 STANDALONE 选项。重新编译并上传程序。一段时间后,屏幕上应该会出现命令提示符

恭喜!您已经从头构建了一台独立计算机。

提示符显示版本、可用内存和 EEPROM 大小(在 RP2040 上为 0)。没有出现闪烁的光标。只需开始输入和编程即可。

8

电源播放-添加电压调节器

对于真正的独立计算机,USB 电源的独立性会很有帮助。您可以使用 USB 电源加上合适的电缆,也可以添加电源插头和电压调节器。

稳压器电路很简单。7805 稳压器有一个输入端,连接到电源插头。正极在内部引脚上,负极在插头外部。输出引脚直接与电平转换器的 5V 侧相连。只有电平转换器和键盘使用 5V 引脚。此电路没有对计算机 USB 引脚的保护。切勿同时插入电源和计算机。

建议使用示意图中所示的两个电容器,但这里实际上不需要。通常电源和 PS2 键盘内部已经装有这个电容器。

9

添加打印机

小型热敏打印机对于快速获取 Arduino 收集的数据的硬拷贝非常有用。

这些热敏打印机使用 5V 逻辑,通常需要 5V 2A 电源。连接打印机应通过电平转换器进行。

将 Arduino 的 TX 和 RX 引脚连接到电平转换器的 3.3V 侧。然后将这些引脚的 5V 侧连接到合适的插头。

我使用标准立体声音频电缆和插头。这可能有点不合常规,但这些电缆价格便宜、质量好且屏蔽性好。9600 的波特率可以通过它们安全传输。

地线连接到插头的外侧,TX 和 RX 则通过内侧。确保 Arduino 的 TX 与打印机的 RX 相连,反之亦然。

要激活打印,请在配置 hardware-arduino.h 后重新编译解释器

#undef USESPICOSERIAL 
#define ARDUINOPS2
#define ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT
#undef ARDUINOVGA
#undef ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#undef ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#define STANDALONE

ARDUINOPRT 已定义。这使得 Serial1 在 BASIC 中可用作输出流 &4。

数据通过命令发送到打印机

PRINT &4, "Hello World"

请阅读手册https://github.com/slviajero/tinybasic/blob/main/MANUAL.md以获取有关 BASIC 输出流和 & 修饰符的使用的更多信息。

10

将计算机安装到框架中

电路板完成后,最好将其安装到框架中。我使用胶合板将其以 45 度角固定到位。支架有足够的空间容纳中等尺寸的面包板进行实验和 Arduino RP2040 引脚分布的小型打印件。

计算机的外设使用引脚 D2、D5(PS2 键盘)、D7、D8、D9 和 A3(显示器)以及 D10(SD 卡 CS)。如果使用时钟,则 A4 和 A5 用于 I2C 总线。所有其他引脚都是空闲的。这意味着 D3、D4、D6、A0、A1、A2、A6 和 A7 可用于应用程序。

我使用该系统的主要用例是在计算机前的面包板上以交互方式测试传感器和设备。无需耗费时间上传草图。

对于这样的计算机,我还喜欢打印微控制器的引脚分布图并将其粘贴在可见的地方。这有助于快速接线。

11

完成所有Arduino操作

您在此步骤之前构建的计算机具有全功能的 BASIC 解释器,就像 80 年代的家用计算机一样,以及 Arduino IDE 提供的用于控制设备的大多数功能。

如果您将标准 8 欧姆扬声器和 200 欧姆电阻连接到引脚 D4 和 GND,则可以播放声音。类型

PLAY 4, 300, 2000

在命令行上。 300 赫兹音调在引脚 4 上播放 2 秒。

使用相同的电阻和引脚 4 上的 LED。然后输入闪烁程序并运行它

10 PINM 4,1
20 DWRITE 4,1
30 DELAY 1000
40 DWRITE 4,0
50 DELAY 1000
60 GOTO 20
RUN

现在,LED 灯以 1 秒为间隔闪烁。可以通过输入“#”字符来中断正在运行的程序。

模拟数据也可以轻松读取。将 10 kOhm 电位器连接到 GND 和 3.3V,并将其变量引脚连接到 D14,即第一个模拟引脚 A0。程序

10 PINM 14, 0
20 PRINT AREAD(14)
30 DELAY 1000
40 GOTO 20

会将模拟引脚的原始输入电平打印到屏幕上。它是从 0 到 1024 的数字。显示伏特的输出需要再执行一个命令


10 PINM 14, 0
20 A=AREAD(14)
30 V=MAP(A, 0, 1023, 0, 330)
40 PRINT V/100
50 DELAY 1000
60 GOTO 20

Map 是 BASIC 中众所周知的 Arduino MAP 命令。它在后台处理长整数。


12

进入网络

BASIC 解释器中添加了非常基本的 IoT 支持。要将您的系统连接到网络,请首先打开文件 wifisettings.h。此文件应如下所示

const char* ssid = "";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const short mqtt_port = 1883;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xE9, 0xE9, 0xE9};

在此处添加您的 SSID 和网络密码。这不安全。我为此使用了游乐场网络。

接下来的两行包含 mqtt 服务器的地址和端口。目前仅支持未经身份验证和未加密的 MQTT。同样,这对于任何现实世界的东西来说都不安全。预配置的服务器是 mosquitto 测试服务器。

配置完此文件后,再次打开hardware-arduino.h并做以下更改:

#undef USESPICOSERIAL 
#define ARDUINOPS2
#define ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT
#undef ARDUINOVGA
#undef ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#define ARDUINOMQTT
#undef ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#define STANDALONE

ARDUINOMQTT 现在除了所有其他设置之外还进行了定义。

您现在需要 Arduino 库管理器中的 Pubsub MQTT 库和 Arduino WifiNINA 库。

重新编译并将草图上传至开发板。

重启后输入

NETSTAT

如果计算机连接到网络,则输出应为

网络已连接

MQTT state -1
MQTT out topic
MQTT inp topic
MQTT name iotbasicxxx

现在计算机就可以接收和发送 MQTT 消息了。

没有任何错误处理的典型发送程序可能看起来像这样

10 OPEN &9, "iotbasic/testdata", 1
20 PRINT &9, "data:", AREAD(AZERO)
30 DELAY 2000
40 GOTO 20

该程序将打开 MQTT 主题 iotbasic/testdate 进行写入,打印字符串“data:”和 A0 上的模拟值,等待两秒钟然后再次测量。

https://github.com/slviajero/tinybasic/tree/main/examples/16mqtt 中有一个关于 MQTT 功能的教程。

此代码正在开发中。很快会有更多内容发布。

13

连接 I2C 设备和传感器

BASIC 内置了一组传感器,可以通过 BASIC 命令直接访问 I2C 总线。

从 repo 下载程序 https://github.com/slviajero/tinybasic/blob/main/examples/13wire/ident.bas 或输入。

10 REM "Identify devices on the I2C bus"
20 REM ""
100 REM "the setup()"
110 FOR I=1 TO 127
120 @S=0
130 REM "Try to open a device and send a byte"
140 OPEN &7, I
150 PUT &7, 0
160 IF @S=0 THEN PRINT "device found on", #3, I;": ";:GOSUB 500
190 NEXT
200 PRINT 
210 END
500 REM "Search the device name"
505 IF I=56 THEN PRINT "AH10" : RETURN
510 IF I=60 THEN PRINT "Oled" : RETURN
520 IF I>=80 AND I<=87 THEN PRINT "EEPROM" : RETURN 
530 IF I=104 THEN PRINT "Real Time Clock" : RETURN
540 IF I=118 OR I=119 THEN PRINT "BMP/E280" : RETURN
590 PRINT "Unknown"
600 RETURN

如果您运行该程序,它应该会检测 I2C 总线上的实时时钟。将任何其他 I2C 传感器连接到 SDA、SCL 和电源,然后重新运行该程序。现在已检测到传感器。

I/O 通道 &7 上的 BASIC 命令 GET、PUT、PRINT 和 INPUT 允许直接访问 I2C 设备。传感器可以在字节级别读取,数据可以在程序中使用。

请查看 I2C 教程了解更多信息https://github.com/slviajero/tinybasic/blob/main/examples/13wire/README.md

一些传感器在 BASIC 中是预定义的。它们可以作为代码的一部分激活。在 hardware-arduino.h 中查看 ARDUINOSENSORS 部分

/*
 * 传感器库代码 - 实验性
 */
#ifdef ARDUINOSENSORS
#undef ARDUINODHT
#define DHTTYPE DHT22
#define DHTPIN 2
#undef ARDUINOSHT
#ifdef ARDUINOSHT
#define ARDUINOWIRE
#endif
#undef ARDUINOMQ2
#define MQ2PIN A0
#undef ARDUINOLMS6
#define ARDUINOAHT
#undef ARDUINOBMP280
#undef ARDUINOBME280
#endif

这些传感器目前作为 BASIC 的内置传感器受到支持。通过设置定义并在此处激活传感器来激活 ARDUINOSENSORS 将使传感器值在 BASIC 中可用。

如果有 DHT22 传感器可用,并将其连接到引脚 D3,则上面的 DHT 部分将更改为

#define ARDUINODHT
#define DHTTYPE DHT22
#define DHTPIN 3

在硬件定义之后,我们将添加

#undef USESPICOSERIAL 
#define ARDUINOPS2
#define ARDUINOPRT
#undef DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT
#undef ARDUINOVGA
#undef ARDUINOEEPROM
#undef ARDUINOEFS
#define ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#define ARDUINOMQTT
#define ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#define STANDALONE

现在ARDUINOSENSORS也定义了。

下载 DHT22 库并重新编译草图。

将 DHT 传感器连接到引脚 3,然后重新启动 Arduino。

要读出传感器,请使用 SENSOR 函数。其第一个参数是传感器编号,第二个参数是传感器要读出的值。

PRINT SENSOR(1,2), SENSOR(1,1)

将打印当前的温度和湿度。

将此数据发送到 MQTT 服务器的程序将是


10 OPEN &9, "iotbasic/testdata", 1
20 PRINT &9, "dhtdata:", SENSOR(1,2), SENSOR(1,1)
30 DELAY 2000
40 GOTO 20

使用四行 BASIC 代码即可测量和传输数据。将此文件作为“autoexec.bas”保存到 SD 卡后,每次重启计算机后都会自动运行该文件。这样,计算机就可以作为独立的传感器设备运行。

传感器代码也正在开发中。未来将集成来自 Adafruit 库的更多传感器。


14

读取并显示传感器数据

在上面的例子中,传感器数据被发布到互联网上的 MQTT 主题。数据也可以从互联网上读取并显示在屏幕上。

最基本的阅读器程序如下所示

10 OPEN &9, "iotbasic/testdata"
20 IF AVAIL(9)=0 THEN DELAY 1000: GOTO 20
30 INPUT &9, A$
40 PRINT A$
50 GOTO 20

该程序打开 MQTT 主题进行读取,每 1 秒循环一次,查看流 9(即 MQTT 流)中是否有可用字符,并打印它们。

照片中的输出显示了我家的自动化测试中当前运行的两个传感器的值。一个传感器测量 CO_2 值,另一个传感器测量温度和空气湿度。

15

制作小弟弟

本文中的硬件设计适用于 RP2040,但可以轻松适应其他微控制器。

我最喜欢的开发板之一是 Arduino MKR Wifi 1010。它是一款低能耗开发板,具有强大的计算能力。

引脚排列与 RP2040 不同,但所有步骤都可以相同。

要构建如图所示的显示器和 EEPROM 系统,请将显示器 SPI 引脚连接到 Arduino SPI 引脚。对于显示器的其他引脚,请将 CS 连接到引脚 7,将 RST 连接到引脚 6,将 DC 连接到引脚 4,将 LED 连接到引脚 A3,就像在其他示例中一样。

BASIC 解释器的编译器设置为

#undef USESPICOSERIAL 
#undef ARDUINOPS2
#undef ARDUINOPRT
#define DISPLAYCANSCROLL
#undef ARDUINOLCDI2C
#undef ARDUINONOKIA51
#define ARDUINOILI9488
#undef ARDUINOSSD1306
#undef LCDSHIELD
#undef ARDUINOTFT
#undef ARDUINOVGA
#undef ARDUINOEEPROM
#define ARDUINOEFS
#undef ARDUINOSD
#undef ESPSPIFFS
#undef RP2040LITTLEFS
#define ARDUINORTC
#define ARDUINOWIRE
#undef ARDUINOWIRESLAVE
#undef ARDUINORF24
#undef ARDUINOETH
#define ARDUINOMQTT
#define ARDUINOSENSORS
#undef ARDUINOSPIRAM 
#undef STANDALONE

由于系统没有键盘,因此必须撤消 STANDALONE,包括 ARDUINOPS2 设置。

EEPROM 的大小和连接必须按照上面的部分进行设置。

设置以下定义

#define ILI_CS 7
#define ILI_DC 4
#define ILI_RST 6

它们覆盖标准 ILI 设置并告诉 BASIC 解释器使用哪些引脚进行显示。

編輯並上传。

BASIC 解释器将会开始输出类似

> Stefan's Basic 1.4a Memory 22455 0

并期待命令行的输入。它有 22 kB 的内存可供程序使用。

如果添加合适的锂聚合物电池,系统可以通过运行程序与计算机断开连接,稍后再重新连接,而无需重新启动程序。

在 Arduino MKR 上,低功耗应用支持睡眠模式。使用如下命令

10 SLEEP 10000

将使 Arduino 休眠 10000 毫秒,然后恢复程序执行。休眠后 USB 总线不会重新连接。该设备将作为标牌、网络或传感器设备独立运行。

或者,可以使用 ESP32 构建相同的系统。显示器的引脚排列如下

#define ILI_CS 12
#define ILI_DC 27
#define ILI_RST 14
#define ILI_LED 26

像上例一样,EEPROM 可用作大容量存储器。SPI 总线默认值为 SCK 18、MISO 19 和 MOSI 23。

或者,在 ESP 上可以使用内置 SPIFFS 文件系统。对编译器定义进行以下更改

#undef ARDUINOEFS
#define ESPSPIFFS

第一次启动 BASIC 解释器后,使用 FDISK 格式化内部磁盘。

ESP32 上的睡眠行为与 Arduino MKR 上的行为不同。与 MKR 不同

10 SLEEP 10000

不会恢复 BASIC 程序,但会在唤醒后重新启动控制器。程序必须存储为“autoexec.bas”,以便在深度睡眠后重新加载和重新启动。它必须自行处理睡眠后的入口点,例如通过使用 EEPROM 变量。这种差异是由于 ESP 睡眠和 ArduinoLow 电源库之间的差异造成的。

16

在 Raspberry Pi Pico

本教程主要介绍 Arduino RP2040 开发板。有人问是否可以在 Raspberry PI Pico 的基础上构建计算机。

我测试了没有 WLAN 的电路板(如照片中所示),并使用了 Arduino IDE 中的 Arduino RP2040 和电路板定义核心。编译器定义 ARDUINOMQTT 必须是“undef”,因为这些电路板上没有 WLAN。使用这些设置,可以使用正确的电路板定义编译和上传 BASIC 解释器。

在 Arduino IDE 中,查找 Arduino Mbed OS RP2040 板,下载它们并从中使用 Raspberry Pi Pico 板。使用此核心,可以使用原生 Raspberry PI Pico 引脚号:https ://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

由于这些板上没有引脚 A3,因此必须将 ILI_LED 引脚改为 A2。SPI 位于这些板上的引脚 16 (MISO)、18(SCK) 和 19 (MOSI)。

ILI_CS、ILI_RST 和 ILI_DC 可以设置为任意数字引脚。我的选择是

#define ILI_LED A2
#define ILI_CS 15
#define ILI_RST 14
#define ILI_DC 13

因为这些引脚位于电路板的底部,所以接线很简单。

17

此处未涉及的主题

BASIC 解释器具有本教程中未讨论的许多功能。它可以作为 Wire 从设备运行,还可以使用无线电模块接收和发送数据。

该系统有一个大哥https://www.instructables.com/Build-a-80s-Style-Home-Computer-From-Scratch-From-/,基于类似于80年代家用电脑的Arduino DUE。

有一个基于 ESP8266 主板和数据记录器屏蔽的小型系统https://www.instructables.com/The-10-Euro-IoT-Computer-With-ESP-8266/。它的成本非常低。当我开始构建它时,我受到了 AIM 65 的启发。

这些小兄弟分别是基于 NOKIA5110 和 ESP8266 的,没有键盘;基于 ESP01 的,只有传感器;或者基于 AVR 8bit 的,没有互联网。

目前 ESP8266 和 ESP32 以及 Arduino 8bit 平台均得到良好支持。如果资源充足,一个平台上的所有 BASIC 程序都可以在其他系统上运行。

该解释器可在 Mac、Windows、Linux 和 MSDOS 上运行,具有相同的功能。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载