Arduino Nano RP2040 Connect — 代码例程

知识库
知识库文档
/firmware/开发板/Arduino Nano RP2040 Connect/Arduino Nano RP2040 Connect — 代码例程.md

文档

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 库。

信息

路径
/firmware/开发板/Arduino Nano RP2040 Connect/Arduino Nano RP2040 Connect — 代码例程.md
更新时间
2026/5/26