{"id":160,"date":"2024-09-26T10:59:23","date_gmt":"2024-09-26T02:59:23","guid":{"rendered":"https:\/\/www.bgcj.pro\/?p=160"},"modified":"2024-09-26T14:38:52","modified_gmt":"2024-09-26T06:38:52","slug":"esp32c3mini%e9%9f%b3%e9%a2%91%e5%bd%95%e6%94%be%e9%a9%b1%e5%8a%a8%e6%9d%bf%e8%b5%84%e6%96%99","status":"publish","type":"post","link":"https:\/\/www.bgcj.pro\/index.php\/2024\/09\/26\/esp32c3mini%e9%9f%b3%e9%a2%91%e5%bd%95%e6%94%be%e9%a9%b1%e5%8a%a8%e6%9d%bf%e8%b5%84%e6%96%99\/","title":{"rendered":"esp32c3mini\u97f3\u9891\u5f55\u653e\u9a71\u52a8\u677f\u8d44\u6599"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u8ff7\u4f60\u5c0f\u677f\u5b50\u5c3a\u5bf8\u9002\u914d\u7684esp32c3 super mini \u5f00\u53d1\u677f\u3002\uff08\u4f46\u8fd9\u4e2a\u677f\u5b50\u5c04\u9891\u7535\u8def\u4e0d\u597d\uff0c\u4e5f\u662f\u8981\u614e\u7528\u3002\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"854\" src=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/1.jpg\" alt=\"\" class=\"wp-image-171\" srcset=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/1.jpg 1000w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/1-300x256.jpg 300w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/1-768x656.jpg 768w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/1-688x588.jpg 688w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u97f3\u9891\u5c0f\u677f\u5b50\uff0c\u7528\u7684NS4168\u97f3\u9891i2s\u97f3\u9891\u89e3\u7801\u529f\u653eIC\uff08\u8d44\u6599\uff1a<a href=\"http:\/\/www.nsiway.com.cn\/product\/18.html\">http:\/\/www.nsiway.com.cn\/product\/18.html<\/a>\uff09\u548cMSM261S4030H0R\u6570\u5b57\u9ea6\u514b\u98ce\uff08\u8d44\u6599\uff1a<a href=\"https:\/\/item.szlcsc.com\/datasheet\/MSM261S4030H0R\/3020642.html\">https:\/\/item.szlcsc.com\/datasheet\/MSM261S4030H0R\/3020642.html<\/a>\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u7406\u56fe\u975e\u5e38\u7b80\u5355\uff0c\u5355\u7eaf\u5c31\u662f\u6839\u636eIC\u8d44\u6599\u62c9\u7ebf\u5c31\u5b8c\u4e8b\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"464\" src=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1024x464.png\" alt=\"\" class=\"wp-image-161\" srcset=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1024x464.png 1024w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-300x136.png 300w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-768x348.png 768w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-688x312.png 688w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image.png 1295w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u677f\u5b50\u80cc\u9762\u53ef\u4ee5\u76f4\u63a5\u710a\u63a5esp32c3super mini\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u675c\u90a6\u7ebf\u8fde\u63a5\u5176\u4ed6\u5f00\u53d1\u677f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"443\" src=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1.png\" alt=\"\" class=\"wp-image-162\" srcset=\"https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1.png 989w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1-300x134.png 300w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1-768x344.png 768w, https:\/\/www.bgcj.pro\/wp-content\/uploads\/2024\/09\/image-1-688x308.png 688w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6839\u636e\u5982\u56fe\u4e0e\u5176\u4ed6\u5f00\u53d1\u8fde\u63a5\u5373\u53ef\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>NS4168\u4f7f\u7528\u65f6\u9700\u8981\u6ce8\u610f\u4e00\u4e2a\u95ee\u9898\uff0c\u8fd9\u4e2aIC\u6709\u4e2a\u95ee\u9898\uff0c\u5728\u505c\u6b62\u53d1\u9001i2s\u97f3\u9891\u6570\u636e\u540e\uff0c\u82af\u7247\u4e0d\u4f1a\u81ea\u52a8\u5c06\u5587\u53ed\u8f93\u51fa\u7684\u7535\u538b\u5f52\u96f6\uff0c\u6709\u65f6\u4f1a\u5bfc\u81f4\u5587\u53ed\u53d1\u70ed\u5230\u70eb\u624b\uff0c\u6240\u4ee5\u5728\u521d\u59cb\u5316\u540e\u548c\u97f3\u9891\u64ad\u653e\u7ed3\u675f\u540e\uff0c\u4e00\u5b9a\u8981\u64ad\u653e\u4e00\u6bb5\u7a7a\u767d\u97f3\u9891\uff0c\u8ba9\u5587\u53ed\u53d1\u51fa\u6700\u540e\u4e00\u4e2a\u4e00\u4e2a\u97f3\u65f6\u7a7a\u767d\u97f3\u9891\u3002<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u65f6\u4e00\u4e2a\u57fa\u672c\u5f55\u97f3\u548c\u653e\u97f3\u7684\u8303\u4f8b\uff0c\u6309\u4f4fboot\uff08IO9\uff09\u5f00\u59cb\u5f55\u97f3\uff0c\u677e\u5f00boot\u64ad\u653e\u5f55\u97f3\u3002esp32c3\u53ea\u6709\u4e00\u8defi2S\u97f3\u9891\uff0c\u6240\u4ee5\u5728\u5f55\u653e\u4e24\u4e2a\u8bbe\u5907\u5207\u6362\u524d\u8981\u91cd\u65b0\u521d\u59cb\u5316i2s\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:15px\"><code>#include \"FS.h\"\n#include \"SPIFFS.h\"\n#define FORMAT_SPIFFS_IF_FAILED true\n\n#include &lt;driver\/i2s.h&gt;\n#define REC_I2S_WS 7\n#define REC_I2S_SD 5\n#define REC_I2S_SCK 6\n\/\/#define I2S_LR_RX 3\n\n#define I2S_PORT_0 I2S_NUM_0\n#define SAMPLE_RATE 16000\n#define BUTTON_PIN 9\n\n#define PLAY_I2S_LRC 3\n#define PLAY_I2S_BCLK 2\n#define PLAY_I2S_DIN 1\n\n\n#define BUFSIZE 128\nint16_t audioData&#91;BUFSIZE]; \/\/i2s\u7f13\u5b58\nint16_t zeroData&#91;128]; \/\/\u7a7a\u767d\u97f3\u9891\nuint recordingSize = 0;\nbool wste = 0;\n\nvoid setup() {\n  pinMode(BUTTON_PIN, INPUT);\n  for(int i = 0; i &lt; 128; i ++){\n    zeroData&#91;i] = 0x00;\n  }\n\n  Serial.begin(115200);\n  if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) {   \/\/\u521d\u59cb\u5316SPIFFS\uff0c\u5b58\u50a8\u97f3\u9891\u6570\u636e\n    Serial.println(\"SPIFFS Mount Failed\");\n    return;\n  }\n  \/\/SPIFFS.format();\n  listDir(SPIFFS, \"\/\", 0);\n}\n\nvoid loop() {\n  if (digitalRead(BUTTON_PIN) == LOW) {\n    delay(20);\n    if (digitalRead(BUTTON_PIN) == LOW) {\n      i2s_rx_init();   \/\/\u521d\u59cb\u5316\u5f55\u97f3I2S\u6a21\u5f0f\n      Serial.println(\"Recording...\");\n      size_t bytes_read = 0;\n      recordingSize = 0;\n      File file = SPIFFS.open(\"\/pcm\", FILE_WRITE);\n      while (digitalRead(BUTTON_PIN) == LOW) {\n        esp_err_t result = i2s_read(I2S_PORT_0, audioData, sizeof(audioData), &amp;bytes_read, portMAX_DELAY);\n        for (int i = 0; i &lt; BUFSIZE; i++) {\n          int16_t data = audioData&#91;i];\n          byte* bytes = (byte*)&amp;data;\n          file.write(bytes, sizeof(int16_t));\n        }\n        recordingSize += bytes_read \/ 2;\n      }\n      file.close();\n      Serial.print(recordingSize);\n      Serial.println(\" Recording complete.\");\n      i2s_driver_uninstall(I2S_PORT_0);\n      wste = 1;\n    }\n  }\n\n  if (wste) {\n    i2s_tx_init();  \/\/\u521d\u59cb\u5316\u64ad\u653eI2S\u6a21\u5f0f\n\n    Serial.println(\"Playing...\");\n    size_t bytes_written = 0;\n    File file = SPIFFS.open(\"\/pcm\", FILE_READ);\n    if (!file) {\n      Serial.println(\"\u65e0\u6cd5\u6253\u5f00\u6587\u4ef6\");\n      return;\n    }\n    while (file.available()) {\n      int bytesRead = file.readBytes((char*)audioData, sizeof(audioData));\n\n      if (bytesRead &gt; 0) {\n        amplifyAudio(audioData,BUFSIZE,5);  \/\/\u653e\u5927\u97f3\u91cf\n        esp_err_t result = i2s_write(I2S_PORT_0, audioData, bytesRead, &amp;bytes_written, portMAX_DELAY);\n      } else {\n        \/\/ End of file reached, close the file\n        file.close();\n        Serial.println(\"File closed\");\n      }\n    }\n    esp_err_t result = i2s_write(I2S_PORT_0, zeroData, 16, &amp;bytes_written, portMAX_DELAY);\n    Serial.println(\"Playing complete.\");\n    i2s_zero_dma_buffer(I2S_PORT_0);  \/\/ \u6e05\u7a7aI2S DMA\u7f13\u51b2\u533a\n\n    i2s_driver_uninstall(I2S_PORT_0);\n\n    wste = 0;\n  }\n}\n\nvoid amplifyAudio(int16_t* aData, int dataSize, float gain) {\n  for (int i = 0; i &lt; dataSize; i++) {\n    aData&#91;i] = aData&#91;i] * gain;\n  }\n}\n\nvoid i2s_rx_init() {\n  const i2s_config_t i2s_config = {\n    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),\n    .sample_rate = SAMPLE_RATE,\n    .bits_per_sample = i2s_bits_per_sample_t(16),\n    .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,\n    .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_I2S),\n    .intr_alloc_flags = 0,  \/\/ default interrupt priority\n    .dma_buf_count = 8,\n    .dma_buf_len = 512,\n    .use_apll = false\n  };\n\n  esp_err_t err = i2s_driver_install(I2S_PORT_0, &amp;i2s_config, 0, NULL);\n  if (err != ESP_OK) {\n    Serial.printf(\"I2S driver install failed (I2S_PORT_0): %d\\n\", err);\n    while (true)\n      ;\n  }\n\n  const i2s_pin_config_t pin_config = {\n    .bck_io_num = REC_I2S_SCK,\n    .ws_io_num = REC_I2S_WS,\n    .data_out_num = I2S_PIN_NO_CHANGE,\n    .data_in_num = REC_I2S_SD\n  };\n  err = i2s_set_pin(I2S_PORT_0, &amp;pin_config);\n  if (err != ESP_OK) {\n    Serial.printf(\"I2S set pin failed (I2S_PORT_0): %d\\n\", err);\n    while (true)\n      ;\n  }\n}\n\nvoid i2s_tx_init() {\n  const i2s_config_t i2sOut_config = {\n    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),\n    .sample_rate = SAMPLE_RATE,\n    .bits_per_sample = i2s_bits_per_sample_t(16),\n    .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,\n    .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_I2S),\n    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,\n    .dma_buf_count = 8,\n    .dma_buf_len = BUFSIZE\n  };\n  esp_err_t err = i2s_driver_install(I2S_PORT_0, &amp;i2sOut_config, 0, NULL);\n  if (err != ESP_OK) {\n    Serial.printf(\"I2S driver install failed (I2S_PORT_0): %d\\n\", err);\n    while (true)\n      ;\n  }\n\n  const i2s_pin_config_t i2sOut_pin_config = {\n    .bck_io_num = PLAY_I2S_BCLK,\n    .ws_io_num = PLAY_I2S_LRC,\n    .data_out_num = PLAY_I2S_DIN,\n    .data_in_num = -1\n  };\n  err = i2s_set_pin(I2S_PORT_0, &amp;i2sOut_pin_config);\n  if (err != ESP_OK) {\n    Serial.printf(\"I2S set pin failed (I2S_PORT_1): %d\\n\", err);\n    while (true)\n      ;\n  }\n}\n\nvoid listDir(fs::FS &amp;fs, const char * dirname, uint8_t levels){\n    Serial.printf(\"Listing directory: %s\\r\\n\", dirname);\n\n    File root = fs.open(dirname);\n    if(!root){\n        Serial.println(\"- failed to open directory\");\n        return;\n    }\n    if(!root.isDirectory()){\n        Serial.println(\" - not a directory\");\n        return;\n    }\n\n    File file = root.openNextFile();\n    while(file){\n        if(file.isDirectory()){\n            Serial.print(\"  DIR : \");\n            Serial.println(file.name());\n            if(levels){\n                listDir(fs, file.path(), levels -1);\n            }\n        } else {\n            Serial.print(\"  FILE: \");\n            Serial.print(file.name());\n            Serial.print(\"\\tSIZE: \");\n            Serial.println(file.size());\n        }\n        file = root.openNextFile();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8ff7\u4f60\u5c0f\u677f\u5b50\u5c3a\u5bf8\u9002\u914d\u7684esp32c3 super mini \u5f00\u53d1\u677f\u3002&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-160","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/posts\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/comments?post=160"}],"version-history":[{"count":6,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/posts\/160\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/posts\/160\/revisions\/172"}],"wp:attachment":[{"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/media?parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/categories?post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bgcj.pro\/index.php\/wp-json\/wp\/v2\/tags?post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}