# 前言
使用 Siri 来获取当前的温度和湿度是不是很有 B 格?其实几十行代码就可以做到,原理就是使用 esp8266 做一个 HttpServer , 使用 Siri 来访问某个路由,访问的时候读取当前的温湿度数据即可.
当前使用的温湿度传感器是 dht11 , 也可以使用 dht22 , 更精准一点而已.
# 写点代码
| #include <string> | |
| #include <ESP8266WiFi.h> | |
| #include <ESP8266WebServer.h> | |
| #include "DHT.h" | |
| // 定义 dht 数据位为 gpio5,开发板不一样则该设置不一样 | |
| #define DHTPIN 5 | |
| #define DHTTYPE DHT11 | |
| DHT dht(DHTPIN, DHTTYPE); | |
| // 定义 wifi 名称和密码 | |
| const char* ssid = "HUAWEI-KTT6S5_HiLink"; | |
| const char* password = "15008683399lwp"; | |
| // 设置 led 灯的 gpio | |
| const int led = 2; | |
| // 创建一个 WebServer 监听 80 端口 | |
| ESP8266WebServer server(80); | |
| void handleRoot(){ | |
| const String Html = "<!DOCTYPE html>\ | |
| <html>\ | |
| <head>\ | |
| <meta charset=\"utf-8\">\ | |
| <title>Hello ESP8266!</title>\ | |
| </head>\ | |
| <body>\ | |
| <h1>看到的这个网页为ESP8266提供<h1>\ | |
| </body>\ | |
|     </html>"; | |
| digitalWrite(led,1); | |
| server.send(200,"text/html",Html); | |
| digitalWrite(led,0); | |
| } | |
| void handleNotFound(){ | |
| digitalWrite(led, 1); | |
| String message = "File Not Found\n\n"; | |
| message += "URI: "; | |
| message += server.uri(); | |
| message += "\nMethod: "; | |
| message += (server.method() == HTTP_GET) ? "GET" : "POST"; | |
| message += "\nArguments: "; | |
| message += server.args(); | |
| message += "\n"; | |
| for (uint8_t i = 0; i < server.args(); i++) { | |
| message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; | |
|   } | |
| server.send(404, "text/plain", message); | |
| digitalWrite(led, 0); | |
| } | |
| // 获取温湿度数据 | |
| void getTemperature(){ | |
| digitalWrite(led,0); | |
|   // 湿度 | |
| float h = dht.readHumidity(); | |
|   // 温度 | |
| float t = dht.readTemperature(); | |
| String Html = "<!DOCTYPE html>\ | |
| <html>\ | |
| <head>\ | |
| <meta charset=\"utf-8\">\ | |
| <title>温湿度</title>\ | |
| </head>\ | |
| <body>\ | |
|   "; | |
| if (isnan(h) || isnan(t)) { | |
| Serial.println(F("Failed to read from DHT sensor!")); | |
| Html += "温湿度读取失败"; | |
| server.send(200,"text/html",Html); | |
| digitalWrite(led,1); | |
| return; | |
|   } | |
| char t_str[20]; | |
| char h_str[20]; | |
| sprintf(t_str,"%2.1f",t); | |
| sprintf(h_str,"%2.0f",h); | |
| String t_string = t_str; | |
| String h_string = h_str; | |
| Html += "当前温度: "+t_string+" 摄氏度。湿度:百分之"+h_string; | |
| Html += "</body>\ | |
|     </html>"; | |
| server.send(200,"text/html;charset=utf-8;",Html); | |
| digitalWrite(led,1); | |
| } | |
| void setup() { | |
| Serial.begin(115200); | |
| dht.begin(); | |
|   // 设置 led 为输出模式 | |
| pinMode(led,OUTPUT); | |
| digitalWrite(led,1); | |
|   // 设置 Wifi 连接模式为 STA | |
| WiFi.mode(WIFI_STA); | |
| WiFi.begin(ssid,password); | |
| while(WiFi.status() != WL_CONNECTED){ | |
| Serial.print("."); | |
| delay(2000); | |
|   } | |
| server.on("/",handleRoot); | |
| server.on("/get",getTemperature); | |
| server.onNotFound(handleNotFound); | |
| server.begin(); | |
| Serial.println("WiFi connected"); | |
| Serial.println("IP address: "); | |
| Serial.println(WiFi.localIP()); | |
| } | |
| void loop() { | |
| server.handleClient(); | |
| } | 
# 上电测试
上电测试一下,访问 http://192.168.1.43/get , 如期返回了温湿度数据.

# 使用 Siri 读取温湿度
苹果 IOS 系统的捷径功能的自定义化程度非常高,可以借助捷径功能读取到温湿度数据并且朗读出来.
以下是我的一个简单设置
保存,然后对着手机说 "Siri, 告诉我温度和湿度", 短短 100 行代码实现了一个最简单的智能家居小应用,还是很简单吧
