文档
Arduino Nano RP2040 Connect (RP2040) 代码例程
例程 1:双核并行 — Core0 + Core1
// Nano RP2040 Connect - 双核并行示例
// Core0: 主循环 + WiFi
// Core1: 传感器采集
void setup() {
Serial.begin(115200);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Dual-Core Demo");
}
void setup1() {
// Core1 初始化(运行在第二核心)
// 注意:delay() 在每个核心独立计时
}
void loop() {
// === Core0:主任务 ===
static unsigned long last = 0;
if (millis() - last > 1000) {
last = millis();
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
// 从 Core1 接收数据(FIFO)
if (rp2040.fifo.available()) {
int sensorValue = rp2040.fifo.pop();
Serial.print("Core0 received from Core1: ");
Serial.println(sensorValue);
}
}
}
void loop1() {
// === Core1:传感器采集 ===
int adc = analogRead(A0);
// 通过 FIFO 发送给 Core0(非阻塞)
rp2040.fifo.push_nb(adc);
delay(500); // Core1 独立的 delay
}
例程 2:RGB LED (WS2812) 控制
// Nano RP2040 Connect - WS2812 RGB LED(D3 控制)
#include <Adafruit_NeoPixel.h>
#define LED_PIN 3
#define NUM_LEDS 1
Adafruit_NeoPixel rgb(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
rgb.begin();
rgb.setBrightness(30); // 0-255
rgb.clear();
rgb.show();
}
void loop() {
// 彩虹渐变
static unsigned long hue = 0;
rgb.setPixelColor(0, rgb.ColorHSV(hue));
rgb.show();
hue += 256; // 16位色相
delay(20);
}
例程 3:MEMS 麦克风 声级检测
// Nano RP2040 Connect - MP34DT05 PDM 麦克风
// 使用 PDM 库读取数字麦克风
#include <PDM.h>
#define PDM_CLK 2
#define PDM_DIN 3
#define SAMPLE_RATE 16000
#define BUFFER_SIZE 512
short sampleBuffer[BUFFER_SIZE];
volatile int samplesRead = 0;
void onPDMdata() {
samplesRead = PDM.read(sampleBuffer, BUFFER_SIZE);
}
void setup() {
Serial.begin(115200);
while (!Serial);
PDM.onReceive(onPDMdata);
if (!PDM.begin(1, SAMPLE_RATE)) { // 单声道
Serial.println("PDM init failed!");
while (1);
}
Serial.println("Microphone ready. Reading audio levels...");
}
void loop() {
if (samplesRead) {
// 计算 RMS(声级)
float sum = 0;
for (int i = 0; i < samplesRead; i++) {
sum += (float)sampleBuffer[i] * sampleBuffer[i];
}
float rms = sqrt(sum / samplesRead);
float db = 20.0f * log10(rms / 32768.0f) + 94.0f; // 近似 dB SPL
Serial.print("RMS: "); Serial.print(rms, 0);
Serial.print(" Level: "); Serial.print(db, 1);
Serial.println(" dB");
samplesRead = 0;
}
delay(100);
}
例程 4:LittleFS 文件系统(16MB Flash)
// Nano RP2040 Connect - LittleFS 文件读写
// 利用16MB Flash存储数据
#include <LittleFS.h>
void setup() {
Serial.begin(115200);
while (!Serial);
if (!LittleFS.begin()) {
Serial.println("LittleFS mount failed!");
// 首次使用需格式化
if (!LittleFS.format()) {
Serial.println("Format failed!");
while (1);
}
LittleFS.begin();
}
// 列出已有文件
Serial.println("Files on LittleFS:");
File dir = LittleFS.open("/");
File file = dir.openNextFile();
while (file) {
Serial.print(" ");
Serial.print(file.name());
Serial.print(" ");
Serial.print(file.size());
Serial.println(" bytes");
file = dir.openNextFile();
}
// 写入文件
File f = LittleFS.open("/data.csv", "a");
if (f) {
f.println("timestamp,adc_value");
for (int i = 0; i < 10; i++) {
f.print(millis()); f.print(",");
f.println(analogRead(A0));
}
f.close();
Serial.println("Data written to /data.csv");
}
// 读取并打印
f = LittleFS.open("/data.csv", "r");
if (f) {
Serial.println("\n--- /data.csv ---");
while (f.available()) {
Serial.write(f.read());
}
f.close();
}
// 检查剩余空间
Serial.printf("\nFree space: %d bytes\n", LittleFS.remaining());
}
void loop() {
// 主循环
}
例程 5:WiFi + MQTT 物联网节点
// Nano RP2040 Connect - WiFi MQTT 客户端
#include <WiFiNINA.h>
#include <PubSubClient.h>
const char* ssid = "YOUR_SSID";
const char* pass = "YOUR_PASSWORD";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message [");
Serial.print(topic);
Serial.print("]: ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
Serial.begin(115200);
while (!Serial);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi OK");
mqtt.setServer(mqtt_server, 1883);
mqtt.setCallback(callback);
}
void reconnectMQTT() {
while (!mqtt.connected()) {
Serial.print("MQTT connecting...");
String clientId = "RP2040-";
clientId += String(random(0xffff), HEX);
if (mqtt.connect(clientId.c_str())) {
Serial.println("connected!");
mqtt.subscribe("rp2040/command");
} else {
Serial.print("failed, rc=");
Serial.print(mqtt.state());
delay(2000);
}
}
}
void loop() {
if (!mqtt.connected()) reconnectMQTT();
mqtt.loop();
static unsigned long lastPub = 0;
if (millis() - lastPub > 5000) {
lastPub = millis();
int adc = analogRead(A0);
float voltage = adc * (3.3f / 4095.0f);
String payload = "{\"adc\":" + String(adc) +
",\"voltage\":" + String(voltage, 3) + "}";
mqtt.publish("rp2040/sensors", payload.c_str());
Serial.println("Published: " + payload);
}
}
编译提示:Arduino IDE →
Tools → Board → Arduino Nano RP2040 Connect,需安装Arduino Mbed OS RP2040 Boards。WS2812 需安装Adafruit_NeoPixel库。MQTT 需PubSubClient库。