Server酱已经改版已经超过时效
- 很久没动笔了,这次来做个人体红外警报。市面上有很多现成的消费级产品,可是太贵了,而且还得要配个网关什么的没个一百几十是不行了,而且还要装客户端,巨麻烦,所以索性做个WIFI连接的,配合server酱服务直接推送给手机。
- 这次用的是WIFI的连接模式,使用热释电红外线传感器(是利用红外线来进行数据处理的一种传感器,大家日常看见楼道里的人体感应开关就是,外观见下面图片),当感应到人体(当然动物也可以)后就把信号反馈到单片机,在经过自己整合进代码里的信息推送给手机。
什么是 server 酱?
「Server酱」,英文名「ServerChan」,是一款「程序员」和「服务器」之间的通信软件。
说人话?就是从服务器推报警和日志到手机的工具。
开通并使用上它,只需要一分钟:
登入:用GitHub账号登入网站,就能获得一个SCKEY(在「发送消息」页面)
绑定:点击「微信推送」,扫码关注同时即可完成绑定
发消息:往 http://sc.ftqq.com/SCKEY.send 发GET请求,就可以在微信里收到消息啦
以上引自sever酱官网,使用方法不清楚的先去网站自行测试一下,sever酱还有很多其他用途,建议先去官方注册好SCKEY然后测试好,仔细看看使用规范后再继续。例如,你可以在Padavan路由固件中的微信推送中用于互联网 IP 变动、设备接入提醒、固件更新提醒等
Padavan使用Server酱推送
使用单片机发GET或者POST请求
- 大概思路流程
准备材料
材料名称 | 数量 | 单位 | 备注 |
---|---|---|---|
ESP8266开发板 | 1 | 块 | 可以是D1 mini或者是NodeMCU |
HC-SR501红外热释人体感应模块 | 1 | 个 | 输出低电平 |
杜邦线 | 若干 | 条 | |
3D打印外壳 | 可选 |
硬件接线
使用HC-SR501传感器前,务必先点击这里看看官方技术文档,仔细看看使用说明和注意事项
所需环境
-
在PlatfromIO成功编译的版本为
WifiManager 0.14
ESP8266:2.2.0 -
在ArduinoIDE成功编译的库为
WifiManager 0.14.0
ESP8266:2.5.2
代码
(点击左上三个点点放大)
#include <FS.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ArduinoJson.h>
char SCKEY[61] = "你在server酱上获取到的SCKEY";
char server[12] = "sc.ftqq.com"; //server酱服务器
//需要发送的推送内容具体规格参考:sc.ftqq.com
String Text = "?text=传感器接收到警报&desp=警报已被触发![logo](https://img.icons8.com/clouds/100/000000/box-important.png)";
bool shouldSaveConfig = false;
const int httpPort = 80;
int times = 0;
int value = 0;
int ButtonState = 0;
const int ButtonPin = D1;
const int ResetPin = D2; //设置键
const int LEDpin = D4; //指示灯
int ResetButtonState = digitalRead(ResetPin);
void saveConfigCallback()
{
Serial.println("Should save config");
shouldSaveConfig = true;
}
void setup()
{
pinMode(ButtonPin, INPUT);
pinMode(ResetPin, INPUT);
pinMode(LEDpin, OUTPUT);
digitalWrite(LEDpin,HIGH);
Serial.begin(115200);
Serial.println("mounting FS...");
if (SPIFFS.begin())
{
Serial.println("mounted file system");
if (SPIFFS.exists("/config.json"))
{
//file exists, reading and loading
Serial.println("reading config file");
File configFile = SPIFFS.open("/config.json", "r");
if (configFile)
{
Serial.println("opened config file");
size_t size = configFile.size();
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
DynamicJsonBuffer jsonBuffer;
JsonObject &json = jsonBuffer.parseObject(buf.get());
json.printTo(Serial);
if (json.success())
{
Serial.println("\nparsed json");
strcpy(SCKEY, json["SCKEY"]);
}
else
{
Serial.println("failed to load json config");
}
configFile.close();
}
}
}
else
{
Serial.println("failed to mount FS");
}
WiFiManagerParameter custom_SCKEY("SCKEY", "SCKEY", SCKEY, 61);
WiFiManager wifiManager;
wifiManager.setSaveConfigCallback(saveConfigCallback);
wifiManager.addParameter(&custom_SCKEY);
if (ResetButtonState == HIGH)
{
Serial.println("Getting Reset ESP Wifi-Setting.......");
delay(1000);
wifiManager.resetSettings();
delay(5000);
Serial.println("Formatting FS......");
delay(1000);
SPIFFS.format();
delay(5000);
Serial.println("Done.Reboot In 5 seconds......");
delay(5000);
ESP.restart();
}
if (!wifiManager.autoConnect("", ""))
{
Serial.println("failed to connect and hit timeout");
delay(3000);
ESP.reset();
delay(5000);
}
Serial.println("connected...yeey :)");
strcpy(SCKEY, custom_SCKEY.getValue());
if (shouldSaveConfig)
{
Serial.println("saving config");
DynamicJsonBuffer jsonBuffer;
JsonObject &json = jsonBuffer.createObject();
json["SCKEY"] = SCKEY;
File configFile = SPIFFS.open("/config.json", "w");
if (!configFile)
{
Serial.println("failed to open config file for writing");
}
json.printTo(Serial);
json.printTo(configFile);
configFile.close();
}
Serial.println("local ip");
Serial.println(WiFi.localIP());
}
void loop()
{
int ButtonState = digitalRead(ButtonPin);
if (ButtonState == HIGH)
{
digitalWrite(LEDpin,LOW);
times++;
delay(1000);
Serial.print("connecting to ");
Serial.println(server);
WiFiClient client;
delay(1000);
client.connect(server, httpPort);
Serial.print("Requesting URL: ");
Serial.println(SCKEY);
client.print(String("GET ") + SCKEY + Text + "自重启以来第" + times + "次警报"
" HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
Serial.println("Respond:");
client.available();
String line = client.readStringUntil('\r');
Serial.println(line);
Serial.print("推送次数: ");
Serial.println(times);
Serial.println("closing connection");
delay(300000);
digitalWrite(LEDpin, HIGH);
}
}
完成图
[https://s1.ax1x.com/2020/05/14/Y0mjC4.th.jpg]![](https://s1.ax1x.com/2020/05/14/Y0nexA.jpg)[https://s1.ax1x.com/2020/05/14/Y0nexA.th.jpg]
外壳是3D打印的,因为打印机有点问题,所以当时打印的不是很好.没有打印机的可以直接去某宝,模型稿件可以参考这里,也可以在网站内搜索下,我的已经忘记保存了,也就不再上传了
演示
由于最近不在家,所以手头上就没有拿成品拍视频了,这里的视频是以前使用一个用按钮输出电平来触发的方式,原理是一样的,我就不在重新拍视频了.
(B站审核中,都不知道能不能过审...先占位,所以说上传视频很烦)
附
设置复位功能操作:
1.按下“设置键”+RST;
2.等待设备重启
3.Serial.println("Getting Reset ESPWifi-Setting.......");
wifiManager.resetSettings(); //重置WIFI设定
4.Serial.println("Formatting FS......");
SPIFFS.format();//格式化SPIFFS
6.Serial.println("Done.Reboot In 5 seconds......");
ESP.restart();