1.建立网络连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <ESP8266WiFi.h>        //引入库函数

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码
const char* ssidOut = "ESP8266"; //定义用户名
const char* passwordOut = "12345678"; //定义密码
void setup() {
Serial.begin(9600); //启动串口通讯
WiFi.begin(ssidIn, passwordIn); //连接网络
WiFi.softAP(ssidOut, passwordOut); //NodeMCU的AP模式(开放网络)

int i = 0;
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
Serial.print('连接到的网络为:');
Serial.println(WiFi.SSID());
Serial.print('分配的ip为:');
Serial.println(WiFi.localIP());

}
void loop() {

}
2.JSON解析

自动生成工具

解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <ArduinoJson.h>

void setup() {
Serial.begin(9600);

//解析
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(2) + 40;
DynamicJsonBuffer jsonBuffer(capacity);
const char* json = "[{\"name\":\"test\",\"message\":\"testMessage\"}]";
JsonArray& root = jsonBuffer.parseArray(json);
const char* root_0_name = root[0]["name"]; // "test"
const char* root_0_message = root[0]["message"]; // "testMessage"
}

void loop() {}
生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <ArduinoJson.h>

void setup() {
Serial.begin(9600);

//生成
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(2);
DynamicJsonBuffer jsonBuffer(capacity);
JsonArray& root = jsonBuffer.createArray();
JsonObject& root_0 = root.createNestedObject();
root_0["name"] = "test";
root_0["message"] = "testMessage";
root.printTo(Serial);
}

void loop() {}
3.网络请求
服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <ESP8266WiFi.h>        //引入wifi库函数
#include <ESP8266WebServer.h> //引入webserver库函数

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码
const char* ssidOut = "ESP8266"; //定义用户名
const char* passwordOut = "12345678"; //定义密码
ESP8266WebServer esp8266_server(80); //设置服务器暴露端口

void setup(void){

Serial.begin(9600); //启动串口通讯
WiFi.begin(ssidIn, passwordIn); //连接网络
WiFi.softAP(ssidOut, passwordOut); //NodeMCU的AP模式(开放网络)

int i = 0;
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
Serial.print('连接到的网络为:');
Serial.println(WiFi.SSID());
Serial.print('分配的ip为:');
Serial.println(WiFi.localIP());

esp8266_server.begin(); //启动服务器
esp8266_server.on("/", handleRoot); //连接成功回调函数
esp8266_server.onNotFound(handleNotFound); //连接失败回调函数
}

void loop(void){
esp8266_server.handleClient(); // 处理http服务器访问
}

void handleRoot() { //成功回调函数
esp8266_server.send(200, "text/plain", "hello word");
}

void handleNotFound(){ //失败回调函数
esp8266_server.send(404, "text/plain", "404: Not found");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <ESP8266WiFi.h>        //引入wifi库函数
#include <ESP8266WebServer.h> //引入webserver库函数

#define buttonPin D3 //引入按钮引脚D3

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码
bool pinState; //存储引脚状态用变量
ESP8266WebServer esp8266_server(80); //设置服务器暴露端口

void setup(void){
pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED

Serial.begin(9600); //启动串口通讯
WiFi.begin(ssidIn, passwordIn); //连接网络

int i = 0;
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
Serial.print('连接到的网络为:');
Serial.println(WiFi.SSID());
Serial.print('分配的ip为:');
Serial.println(WiFi.localIP());

//启动服务器
esp8266_server.begin();
//GET请求
esp8266_server.on("/", HTTP_GET ,handleRoot);
//GET请求
esp8266_server.on("/refresh", HTTP_POST ,handrefresh);
//创建post请求
esp8266_server.on("/led", HTTP_POST, handleLed);
//创建post请求
esp8266_server.on("/send", HTTP_GET, handSend);
//连接失败回调函数
esp8266_server.onNotFound(handleNotFound);
}

void loop(void){
//监听http请求
esp8266_server.handleClient();
//获取引脚状态
pinState = digitalRead(buttonPin);
}

void handleRoot() {
//返回html
esp8266_server.send(200, "text/html","<form action=\"/led\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form><form action=\"/refresh\" method=\"POST\"><input type=\"submit\" value=\"REFRESH\"></form>");
}

void handleNotFound(){ //失败回调函数
esp8266_server.send(404, "text/plain", "404: Not found");
}

void handrefresh(){

//开发板Flash按键控制电位,按下时D3为高电平,不按时为低电平
if(pinState == HIGH){ //当按键引脚D3为高电平
digitalWrite(LED_BUILTIN,true);
} else { // 当按键引脚D3为低电平
digitalWrite(LED_BUILTIN,false);
}

esp8266_server.sendHeader("Location","/");
//发送Http相应代码303 跳转
esp8266_server.send(303);
}

void handleLed(){
//读取当前led的灯的状态
Serial.print(digitalRead(LED_BUILTIN));
//更改led灯的状态
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
//跳转回页面根目录
esp8266_server.sendHeader("Location","/");
//发送Http相应代码303 跳转
esp8266_server.send(303);
}

void handSend(){
//更改led灯的状态
digitalWrite(LED_BUILTIN,true);
}
客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码
const char* host = "192.168.1.3";
const int httpPort = 80;

void setup(void){
//启动串口通讯
Serial.begin(9600);
Serial.println("");

WiFi.begin(ssidIn, passwordIn); //连接网络
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
}

void loop(void){
//发送请求
wifiClientRequest();
delay(1000);
}

void wifiClientRequest(){
//创建client
WiFiClient client;

//拼请求
String url = "/send"
String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n";

//连接服务器
if (client.connect(host, httpPort)) {
//发送请求
client.print(httpRequest);
//打印响应信息
Serial.println(httpRequest);
} else{
Serial.println(" failed");
}

client.stop();
}
ESP8266HTTPClient
  • GET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码

void setup(void){
//启动串口通讯
Serial.begin(9600);
Serial.println("");
//连接网络
WiFi.begin(ssidIn, passwordIn);
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
}

void loop() {
if ((WiFi.status() == WL_CONNECTED)) {
http_get();
}
delay(10000);
}

void http_get(){

//创建client
WiFiClient client;
//创建http对象
HTTPClient http;
//配置请求地址
http.begin(client, "http://api.seniverse.com/v3/weather/now.json?key=SpciTJPArpECQAq0t&location=Beijing&language=en&unit=c");
//发送请求
int httpCode = http.GET();

//判断响应
if (httpCode == HTTP_CODE_OK) {
String responsePayload = http.getString();
Serial.println("Server Response Payload: ");
Serial.println(responsePayload);
} else {
Serial.println("Server Respose Code:");
Serial.println(httpCode);
}

http.end();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码

void setup(void){
//启动串口通讯
Serial.begin(9600);
Serial.println("");
//连接网络
WiFi.begin(ssidIn, passwordIn);
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}
}

void loop() {
if ((WiFi.status() == WL_CONNECTED)) {
http_post();
}
delay(10000);
}

void http_post() {

//创建client
WiFiClient client;
//创建http对象
HTTPClient http;
//配置请求地址
http.begin(client, "http://192.168.1.3:8081/posttest");
//发送请求
int httpCode = http.POST("this is Requestbody");
//连接失败时 httpCode时为负数
if (httpCode > 0) {
//打印响应头
Serial.printf("[HTTP] POST... code: %d\n", httpCode);
//响应信息判断
if (httpCode == HTTP_CODE_OK) {
const String& payload = http.getString();
Serial.println("received payload:\n<<");
Serial.println(payload);
Serial.println(">>");
}
} else {
Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
//关闭http连接
http.end();
}
4.闪存文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <FS.h>  

//创建文件夹目录
String folder_name = "/source";
//设置文件路径
String file_name = "/source/test.txt";
String d_file_name = "/source/delete.txt";

void setup() {
Serial.begin(9600);
Serial.println("");
//格式化闪存
SPIFFS.format();

if(SPIFFS.begin()){ // 启动SPIFFS
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}

//建立文件夹目录
Dir dir = SPIFFS.openDir(folder_name);
//打印该目录的所有文件名
while (dir.next()) {
Serial.println(dir.fileName());
}
//删除文件
SPIFFS.remove(d_file_name)

//打开文件流
File dataFileWrite = SPIFFS.open(file_name, "w");
//写入数据
dataFileWrite.println("Hello World");
//关闭文件流
dataFileWrite.close();


//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
//打开文件流
File dataFileRead = SPIFFS.open(file_name, "r");
//读取文件内容并且通过串口监视器输出文件信息
for(int i=0; i<dataFileRead.size(); i++){
Serial.print((char)dataFileRead.read());
}
//关闭文件流
dataFileRead.close();

//追加信息
//File dataFile = SPIFFS.open(file_name, "a");

}

void loop() {
}
5.OLED
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库

char temp[3]={'a','b','c'};
// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
Serial.begin(115200); // 设置串口波特率
Serial.println("OLED FeatherWing test"); // 串口输出
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(2); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
display.setCursor(0,0); // 设置开始显示文字的坐标
display.println("Hello World!"); // 输出的字符
display.display(); // 使更改的显示生效
}

void loop() {}
6.心知天气
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库

const char* ssidIn = "ChinaNet-aemM"; //定义用户名
const char* passwordIn = "wp907678446"; //定义密码


// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup(void){
//启动串口通讯
Serial.begin(9600);
Serial.println("");
//连接网络
WiFi.begin(ssidIn, passwordIn);
while (WiFi.status() != WL_CONNECTED) {
Serial.println('等待网络连接');
delay(1000);
}

Serial.begin(115200); // 设置串口波特率
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
}

void loop() {
if ((WiFi.status() == WL_CONNECTED)) {
http_get();
}
delay(10000);
}

void http_get(){

//创建client
WiFiClient client;
//创建http对象
HTTPClient http;
//配置请求地址
http.begin(client, "http://api.seniverse.com/v3/weather/now.json?key=SpciTJPArpECQAq0t&location=ChongQing&language=en&unit=c");
//发送请求
int httpCode = http.GET();

//判断响应
if (httpCode == HTTP_CODE_OK) {
String responsePayload = http.getString();
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
DynamicJsonBuffer jsonBuffer(capacity);
const char* json = responsePayload.c_str();
JsonObject& root = jsonBuffer.parseObject(json);
JsonObject& results_0 = root["results"][0];

JsonObject& results_0_location = results_0["location"];
const char* results_0_location_id = results_0_location["id"]; // "WX4FBXXFKE4F"
const char* results_0_location_name = results_0_location["name"]; // "Beijing"
const char* results_0_location_country = results_0_location["country"]; // "CN"
const char* results_0_location_path = results_0_location["path"]; // "Beijing,Beijing,China"
const char* results_0_location_timezone = results_0_location["timezone"]; // "Asia/Shanghai"
const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "+08:00"

JsonObject& results_0_now = results_0["now"];
const char* results_0_now_text = results_0_now["text"]; // "Sunny"
const char* results_0_now_code = results_0_now["code"]; // "0"
const char* results_0_now_temperature = results_0_now["temperature"]; // "24"
const char* results_0_last_update = results_0["last_update"]; // "2022-05-03T12:00:49+08:00"
Serial.println(" ");
Serial.println("====================================");
Serial.println(results_0_now_text);
Serial.println(results_0_now_temperature);
Serial.println(results_0_last_update);
Serial.println("====================================");
Serial.println(" ");

Serial.begin(115200); // 设置串口波特率
Serial.println("OLED FeatherWing test"); // 串口输出
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(1.5); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
display.setCursor(0,0); // 设置开始显示文字的坐标
display.println("Hello World!"); // 输出的字符
display.print("Weather: ");
display.println(results_0_now_text);
display.print("Temperature: ");
display.println(results_0_now_temperature);
display.print("Time: ");
display.println(results_0_last_update);
display.display(); // 使更改的显示生效


} else {
Serial.println("Server Respose Code:");
Serial.println(httpCode);
}

http.end();
}
7.汉字显示
  • test.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static const unsigned char PROGMEM hans_wen[] = {
0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x10,0x10,0x10,0x10,0x08,0x20,0x08,0x20,
0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x40,0x08,0x20,0x30,0x18,0xC0,0x06,/*"文",0*/
};

static const unsigned char PROGMEM hans_peng[] = {
0x00,0x10,0x77,0x20,0x55,0x7C,0x55,0x44,0x55,0x64,0x77,0x54,0x55,0x44,0x55,0x4C,
0x55,0x40,0x77,0x7E,0x55,0x02,0x55,0x02,0x55,0x7A,0xB5,0x02,0x89,0x0A,0x13,0x04,/*"鹏",1*/
};

static const unsigned char PROGMEM hans_xiao[] = {
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x11,0x04,
0x21,0x04,0x21,0x02,0x41,0x02,0x81,0x02,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"小",2*/
};

static const unsigned char PROGMEM hans_pang[] = {
0x00,0x20,0x3C,0x20,0x25,0x24,0x24,0xA4,0x24,0xA8,0x3C,0x20,0x25,0xFC,0x24,0x20,
0x24,0x20,0x3C,0x20,0x27,0xFE,0x24,0x20,0x24,0x20,0x44,0x20,0x54,0x20,0x88,0x20,/*"胖",3*/
};

static const unsigned char PROGMEM hans_zi[] = {
0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x01,0x80,0x01,0x00,0xFF,0xFE,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"子",4*/
};
  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库

#include "test.h"

// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
Serial.begin(115200); // 设置串口波特率
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址

}

void loop() {
hans_display();
}

void display_test(){

display.clearDisplay(); // 清空屏幕
display.setTextSize(1.5); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
display.setCursor(0,0); // 设置开始显示文字的坐标
display.print("Hello World!");
display.setCursor(0, 20);
display.print("time: ");
//打印自开发板重置以来的秒数:
display.print(millis() / 1000);
display.print(" s");
display.setCursor(0, 40);
display.print("Author: ");
display.print("Dapenson");

display.display(); // 使更改的显示生效

}


void hans_display(void)
{
// 显示之前清屏
display.clearDisplay();

// 显示文字 (左上角x坐标,左上角y坐标, 图形数组, 图形宽度像素点, 图形高度像素点, 设置颜色)
display.drawBitmap(20 * 1, 16, hans_wen, 16, 16, 1);
display.drawBitmap(20 * 2, 16, hans_peng, 16, 16, 1);
display.drawBitmap(20 * 3, 16, hans_xiao, 16, 16, 1);
display.drawBitmap(20 * 4, 16, hans_pang, 16, 16, 1);
display.drawBitmap(20 * 5, 16, hans_zi, 16, 16, 1);

//显示图形
display.display();
delay(2000);
}
8.图片显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
static const unsigned char PROGMEM boy[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,
0xFF,0xF0,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFE,0x3F,0xFF,
0xFF,0x01,0xFF,0xF0,0xFF,0xFF,0xFE,0x3B,0xFF,0xF8,0x03,0x87,0xF0,0xFD,0xFF,0xFE,
0xFF,0xFF,0xC0,0x01,0xCF,0xF0,0xFF,0xFF,0xFC,0xF8,0xFC,0x00,0x07,0xFF,0xF0,0xEE,
0xFF,0xFF,0xC0,0xE0,0x00,0x7F,0xFF,0xF0,0xF0,0xE9,0xFF,0xF0,0x00,0x01,0xFF,0xFF,
0xF0,0xFC,0xE3,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xF0,0xFD,0x2F,0xFF,0x80,0x00,0x03,
0xFF,0xFF,0xF0,0xFC,0x10,0xFF,0xE0,0x00,0x07,0xFF,0xFF,0xF0,0xFE,0x2D,0xFF,0x80,
0x00,0x0F,0xFF,0xFF,0xF0,0xFF,0x65,0xFF,0xC0,0x00,0x1F,0xFF,0xFF,0xF0,0xFD,0xE7,
0xFF,0xC0,0x00,0x3F,0xFF,0xFF,0xF0,0xFF,0x83,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xF0,
0xFF,0x97,0xFF,0x00,0x00,0x3F,0xFF,0xFF,0xF0,0xFF,0x8F,0xFE,0x00,0x00,0x3F,0xFF,
0xFF,0xF0,0xFF,0xDF,0xFE,0x70,0x00,0x3F,0xFF,0xFF,0xF0,0xFD,0xFF,0xEF,0xF8,0x00,
0x3F,0xFF,0xFF,0xF0,0xFD,0xFF,0xFB,0xFC,0x00,0x1F,0xFF,0xFF,0xF0,0xFD,0xBF,0xA1,
0xC4,0x00,0x1F,0xFF,0xFF,0xF0,0xFD,0xBF,0xF0,0xF0,0x00,0x1F,0xFF,0xFF,0xF0,0xFD,
0x9F,0xF0,0x00,0x00,0x1F,0xFF,0xFF,0xF0,0xFF,0x03,0xD0,0x00,0x00,0x0F,0xFF,0xFF,
0xF0,0xFF,0x01,0x62,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0xFF,0x80,0x07,0x00,0x00,0x07,
0xFF,0xFF,0xF0,0xFF,0xC0,0x0F,0x00,0x00,0x03,0xFF,0xFF,0xF0,0xFB,0xE0,0x3F,0x80,
0x00,0x03,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xF0,0xFF,0xFF,
0xFF,0xC0,0x00,0x03,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xC0,0x00,0x03,0xFF,0xFF,0xF0,
0xFF,0xFF,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xE0,0x00,0x01,0xFF,
0xFF,0xF0,0xFF,0xFF,0xFF,0xE1,0xFE,0x00,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xE7,0xFF,
0xC0,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xEF,0xFF,0xF8,0x7F,0xFF,0xF0,0xFF,0xFF,0xFF,
0xDF,0xF3,0xFC,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xC8,0x3F,0xFF,0xFF,0xF0,0xFF,
0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0x87,0x2F,0xFF,0xFF,
0xF0,0xFF,0xFF,0xFF,0xFF,0xCF,0xBF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0x1F,0xFF,
0xEF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFC,
0x7F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,
0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,0xFF,0xF0,
0xFF,0xFF,0xFF,0x87,0xFF,0xFE,0xFF,0xFF,0xF0,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFD,
0xFF,0xF0,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0x71,0xFF,0xF0,0xFF,0xFF,0xF8,0x3F,0xFF,
0xFF,0xD1,0xFF,0xF0,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xF9,0xFF,0xF0,0xFF,0xFF,0xF0,
0x7F,0xFF,0xFF,0xF9,0xFF,0xF0,0xFF,0xFF,0xE9,0xFF,0xFF,0xFF,0xF9,0xFF,0xF0,0xFF,
0xFF,0xF9,0xFF,0xFF,0xFF,0xF8,0xFF,0xF0,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFC,0xFF,
0xF0,0xFF,0xFF,0xC7,0xFF,0xFF,0xFF,0xFC,0x7F,0xF0,0xFF,0xFD,0x8F,0xFF,0xFF,0xFF,
0xFC,0xFF,0xF0,0xFF,0xFD,0x0F,0xFF,0xFF,0xFF,0xEC,0xFF,0xF0,0xFF,0xF8,0x7F,0xFF,
0xFF,0xFF,0xFC,0xFF,0xF0,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xF0,0xFF,0xF8,
0xFF,0xFF,0xFF,0xFF,0xF0,0x7F,0xF0,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xF0,0x7F,0xF0,
0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xF7,0xBF,0xF0,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xF7,
0xFF,0xF0,0xFF,0x00,0x7F,0xFF,0xFF,0xFF,0xF7,0x9F,0xF0,0xFF,0x00,0x00,0x00,0x00,
0x01,0xFB,0x80,0x30,0xFF,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,
};



static const unsigned char PROGMEM girl[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0xFC,0x01,0xFF,0xFF,0xFC,0xFF,0xC0,0x00,0x7F,
0xFF,0xFC,0xFF,0x80,0x00,0x1F,0xFF,0xFC,0xFE,0x00,0x00,0x0F,0xFF,0xFC,0xFE,0x00,
0x00,0x03,0xFF,0xFC,0xFC,0x00,0x00,0x01,0xFF,0xFC,0xF8,0x00,0x00,0x01,0xFF,0xFC,
0xF8,0x00,0x00,0x00,0xFF,0xFC,0xF0,0x00,0x00,0x00,0xFF,0xFC,0xF8,0x00,0x00,0x00,
0x7F,0xFC,0xF8,0x00,0x00,0x00,0x7F,0xFC,0xE0,0x00,0x00,0x00,0x7F,0xFC,0xE0,0x00,
0x00,0x00,0xFF,0xFC,0xF0,0x00,0x00,0x00,0x7F,0xFC,0xF0,0x00,0x08,0x00,0x3F,0xFC,
0xF0,0x00,0x18,0x00,0x3F,0xFC,0xE0,0x00,0x10,0x0F,0x3F,0xFC,0xE0,0x00,0x34,0x7F,
0x3F,0xFC,0xE0,0x00,0x3F,0xFF,0x3F,0xFC,0xE0,0x00,0x3F,0x0F,0xBF,0xFC,0xE0,0x10,
0x3F,0xFF,0x9F,0xFC,0xE0,0x30,0x3F,0xFF,0xDF,0xFC,0xE0,0x38,0x7F,0xFF,0xDF,0xFC,
0xC0,0x3C,0x7F,0xFF,0xFF,0xFC,0xC0,0x3C,0x7F,0xFF,0x9F,0xFC,0xC0,0x1C,0x7F,0xFF,
0x9F,0xFC,0xC0,0x04,0x3F,0xFC,0x1F,0xFC,0xC0,0x00,0x3F,0xFF,0x1F,0xFC,0xC0,0x00,
0x7F,0xFF,0x1F,0xFC,0xC0,0x00,0x7F,0xFF,0x1F,0xFC,0x80,0x00,0x7F,0xFF,0x1F,0xFC,
0x80,0x00,0x7C,0x7E,0x1F,0xFC,0x80,0x00,0x7E,0x00,0x9F,0xFC,0x80,0x00,0xFE,0x00,
0x3F,0xFC,0x80,0x00,0xC0,0x30,0xFF,0xFC,0xC0,0x00,0x00,0x27,0xFF,0xFC,0xC0,0x00,
0x1F,0xED,0xFF,0xFC,0xF0,0x00,0x1E,0x2F,0xFF,0xB4,0xF8,0x00,0x42,0x05,0xFE,0x4C,
0xFC,0x40,0x3C,0x00,0xF8,0x1C,0xFF,0xF0,0x78,0x00,0x78,0x1C,0xFF,0xF2,0x78,0x00,
0x78,0xBC,0xFF,0xF0,0xF0,0x00,0x3C,0xBC,0xFF,0xE3,0xE0,0x00,0x3F,0x9C,0xFF,0xEB,
0xC0,0x00,0x1F,0xFC,0xFF,0xE7,0x80,0x00,0x1F,0xFC,0xFF,0xDF,0x00,0x00,0x1F,0xFC,
0xFF,0x5C,0x00,0x00,0x1F,0xFC,0xFF,0x70,0x00,0x00,0x1F,0xFC,0xFE,0xC4,0x00,0x00,
0x1F,0xFC,0xFE,0x90,0x00,0x00,0x1F,0xFC,0xFC,0x60,0x00,0x00,0x0F,0xFC,0xFC,0x00,
0x00,0x00,0x1B,0xFC,0xFC,0x00,0x00,0x00,0x13,0xFC,0xF8,0x00,0x00,0x00,0x13,0xFC,
0xF8,0x00,0x00,0x00,0x01,0xFC,0xF8,0x00,0x00,0x00,0x00,0xFC,0xF8,0x00,0x00,0x00,
0x00,0xFC,0xF8,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,
0x00,0x00,0x00,0xFC,0xFE,0x00,0x00,0x00,0x00,0xFC,0xFE,0x00,0x00,0x00,0x00,0xFC,
0xFE,0x00,0x00,0x00,0x01,0xFC,0xFF,0x00,0x00,0x00,0x01,0xFC,0xFF,0x00,0x00,0x00,
0x03,0xFC,0xFF,0x00,0x00,0x00,0x03,0xFC,0xFF,0x00,0x00,0x00,0x07,0xFC,0xFF,0x80,
0x00,0x00,0x07,0xFC,
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库

#include "image.h"

// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
Serial.begin(115200); // 设置串口波特率
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址

}

void loop() {
image_display();
}

void image_display(void)
{
// 显示之前清屏
display.clearDisplay();

//1,2为显示起始位置,左上角为坐标原点
//3位置为图形数组
//4,5为图像宽度和高度(错误不会显示原像)
//6 颜色
display.drawBitmap(0,0,boy, 72, 70, 1);
display.drawBitmap(75,0,girl, 48, 70, 1);

//显示图形
display.display();
delay(2000);
}
9.蜂鸣器使用(学习来自博客)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

#define NTD0 0

// low
#define NTDL1 262 // NOTE_C4 262 L1
#define NTDL2 294 // NOTE_D4 294 L2
#define NTDL3 330 // NOTE_E4 330 L3
#define NTDL4 349 // NOTE_F4 349 L4
#define NTDL5 392 // NOTE_G4 392 L5
#define NTDL6 440 // NOTE_A4 440 L6
#define NTDL7 494 // NOTE_B4 494 L7

#define NTD1 523 // NOTE_C5 523 1
#define NTD2 587 // NOTE_D5 587 2
#define NTD3 659 // NOTE_E5 659 3
#define NTD4 698 // NOTE_F5 698 4
#define NTD5 784 // NOTE_G5 784 5
#define NTD6 880 // NOTE_A5 880 6
#define NTD7 988 // NOTE_B5 988 7

// high
#define NTDH1 1047 // NOTE_C6 1047 H1
#define NTDH2 1175 // NOTE_D6 1175 H2
#define NTDH3 1319 // NOTE_E6 1319 H3
#define NTDH4 1397 // NOTE_F6 1397 H4
#define NTDH5 1568 // NOTE_G6 1568 H5
#define NTDH6 1760 // NOTE_A6 1760 H6
#define NTDH7 1976 // NOTE_B6 1976 H7


// notes in the melody:
int melody[] = {
NTD3,NTD2,NTD2,NTD1,NTD1,NTD2,NTD1,NTD2,NTD1,NTD2,NTD5,NTD6,NTD5,NTD5,
NTD0,NTD3,NTDH1,NTDH1,NTD7,NTD7,NTD6,NTD5,NTD5,NTD3,NTD3,NTD5,NTD6,NTD5,NTD5,
NTD0,NTD5,NTD6,NTD6,NTD6,NTD6,NTD6,NTD5,NTD5,NTD1,NTD1,NTD1,NTD2,NTD3,NTD0,
NTDL5,NTDL5,NTD3,NTD2,NTD0,NTD1,NTD1,NTD1,NTD1,NTDL6,NTDL6,NTD2,
NTD0,NTD3,NTD2,NTD2,NTD1,NTD1,NTD2,NTD1,NTD2,NTD1,NTD2,NTD5,NTD6,NTD5,NTD5,
NTD0,NTD3,NTDH1,NTDH1,NTD7,NTD7,NTD6,NTD5,NTD5,NTD3,NTD3,NTD5,NTD6,NTD5,NTD5,
NTD0,NTD5,NTD6,NTD6,NTD6,NTD6,NTD6,NTD5,NTD5,NTD1,NTD1,NTD1,NTD2,NTD3,NTD0,
NTDL5,NTDL5,NTD3,NTD2,NTD0,NTD2,NTD2,NTD3,NTD4,NTD5,NTD5,NTD2,
NTD3,NTDL6,NTD2,NTD1,NTD0,NTD0,NTD2,NTD1,NTD0,NTD0,
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 6, 2, 8,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
8, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 6, 4, 8,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 2, 8,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8,
8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
8, 12, 4, 6, 8, 8, 4, 6, 8, 8,
};

//针脚,GPIO后面的数字即是针脚数
int tonepin=4;

void common_play() {

//主要是 tone()函数,第一个参数是针脚数,第二个参数是设置电位强弱,第三个参数是持续时间
for (int thisNote = 0; thisNote < sizeof(melody)/4; thisNote++) {

//节拍设置为8拍
int noteDuration = ( 1000 / 8 ) * noteDurations[thisNote];
tone(tonepin, melody[thisNote], noteDuration);
delay(noteDuration);
// stop the tone playing:
noTone(tonepin);
}
}

void setup() {
Serial.begin(9600);
Serial.print(" init ...");
Serial.print(sizeof(melody));
Serial.print(sizeof(noteDurations));
//将该针脚作为输出
pinMode(tonepin,OUTPUT);
}

void loop() {
common_play();//Play the music.
delay(3000);//Pause for a while.
}