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();


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。