# 前言
使用 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 行代码实现了一个最简单的智能家居小应用,还是很简单吧