简介
大家好今天给大家分享一款超级小的开发板,来自Seeed studio的ESP32C3小开发板。 那么具体由多小呢?我们来看一下下图的对比。左侧是一块正常大小的来自某宙的Esp32c3, 第二个便是我们今天的主角ESP32C3-XIAO。为了方便大家直观的观察到底有多小。这边放上了一个矿泉水的瓶盖。实际上它连矿泉水瓶盖大都没有。
下图为实际焊接好排针的样子
由于这个开发板实在是太小了,所以它的射频天线使用了外部引出的方式。
不过麻雀虽小,五脏俱全。除去5V,GND 和 3V3,它一共由11个可用的IO。 包括Analog, I2C, UART 和 SPI等。它具备400KB的Sarm 和 4MB的板载Flash 用于程序的烧录和存储。下图为具体的参数信息等。
环境搭建和Web服务构建
在我们已经对Xiao 开发板充分了解之后,我们便可以来搭建开发环境和基于官方的教程自己来构建一个Web的页面。
1- 首先我们打开Arduino,在首选项开发板管理器地址处添加Xiao的支持。
https: //raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
接下来我们便可以在开发板管理器中找到ESP32C3-XIAO的支持
我们来尝试烧录一个blink的demo来验证环境是否正确配置成功。
// define led according to pin diagram in article const int led = D10; // there is no LED_BUILTIN available for the XIAO ESP32C3. void setup() { // initialize digital pin led as an output pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); // turn the LED on delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off delay(1000); // wait for a second }
LED正常点亮无误。 不过由于开发板过于小, 所以这个LED需要外接在D10 PIN上。
接着我们来尝试根据官方的教程来搭建一个WEB服务。首先让我们连接上WIFI
#include <WiFi.h> const char* ssid = "你的WIFI名称"; const char* password = "你的WIFI密码"; void WiFiConnect(void) { WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.println(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected!"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFiConnect(); } void loop() { }
此时我们即可正常获取到路由器分配的IP地址。
接下来我们来构建一个Server , 使其在局域网内的其他设备可以放到到当前提供的服务。
WiFiServer server(80); WiFiClient client1;
接着定义80端口将向外提供的服务页面数据。
const char html_page[] PROGMEM = { "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n" "Connection: close\r\n" // the connection will be closed after completion of the response //"Refresh: 1\r\n" // refresh the page automatically every n sec "\r\n" "<!DOCTYPE HTML>\r\n" "<html>\r\n" "<head>\r\n" "<meta charset=\"UTF-8\">\r\n" "<title>Cloud Printer: ChatGPT</title>\r\n" "<link rel=\"icon\" href=\"https://files.seeedstudio.com/wiki/xiaoesp32c3-chatgpt/chatgpt-logo.png\" type=\"image/x-icon\">\r\n" "</head>\r\n" "<body>\r\n" "<img alt=\"SEEED\" src=\"https://files.seeedstudio.com/wiki/xiaoesp32c3-chatgpt/logo.png\" height=\"100\" width=\"410\">\r\n" "<p style=\"text-align:center;\">\r\n" "<img alt=\"ChatGPT\" src=\"https://files.seeedstudio.com/wiki/xiaoesp32c3-chatgpt/chatgpt-logo.png\" height=\"200\" width=\"200\">\r\n" "<h1 align=\"center\">Cloud Printer</h1>\r\n" "<h1 align=\"center\">OpenAI ChatGPT</h1>\r\n" "<div style=\"text-align:center;vertical-align:middle;\">" "<form action=\"/\" method=\"post\">" "<input type=\"text\" placeholder=\"Please enter your question\" size=\"35\" name=\"chatgpttext\" required=\"required\"/>\r\n" "<input type=\"submit\" value=\"Submit\" style=\"height:30px; width:80px;\"/>" "</form>" "</div>" "</p>\r\n" "</body>\r\n" "<html>\r\n" };
定义几个变量用于存储数据信息。
String json_String = ""; // JSON 数据的字符串 String dataStr; // 存储 HTTP 方法 int dataStart; // 存储数据起始位置 String chatgpt_Q; // 存储用户提交的问题
在Setup中调用Server.beign() 来启动80服务。
void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFiConnect(); server.begin(); }
在loop中来发送服务的内容,即上述定义的字符串信息,同时接收用户的输入。
void loop() { client1 = server.available(); if (client1) { Serial.println("New Client."); boolean currentLineIsBlank = true; while (client1.connected()) { if (client1.available()) { char c = client1.read(); json_String += c; if (c == '\n' && currentLineIsBlank) { dataStr = json_String.substring(0, 4); Serial.println(dataStr); if (dataStr == "GET ") { client1.print(html_page); } else if (dataStr == "POST") { json_String = ""; while (client1.available()) { json_String += (char)client1.read(); } Serial.println(json_String); dataStart = json_String.indexOf("chatgpttext=") + strlen("chatgpttext="); chatgpt_Q = json_String.substring(dataStart, json_String.length()); Serial.println("User Question: " + chatgpt_Q); client1.print(html_page); delay(10); client1.stop(); } json_String = ""; break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } } }
这个插入代码的功能不是很好用,我已经尽力的格式化了。
此时将程序烧录到开发板中之后,我们访问ESP32C3-XIAO的地址即可获取到这个WEB页面。
同时当用户在页面的Input中输入数据后,开发板也可以正确的获取到用户的输入。
到这里,网页的部署完成了。 那么在下一个章节中,我将演示如何将这个开发板接入到ChatGPT来实现问答。
附件