查看: 10763|回复: 2

[教程] ESP8266 Arduino教程,第3部分

[复制链接]

该用户从未签到

发表于 2019-8-16 14:48:43 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 美好的一天 于 2019-8-16 14:53 编辑

QQ截图20190816145245.jpg
  • 使用HTTP API记录数据
    我们都听说过HTTP - 它现在在浏览器栏中!但是什么是HTTP,真的,我们如何使用它将数据发送到服务器?嗯,HTTP代表超文本传输​​协议。它运行在TCP或传输控制协议之上。您不需要完全理解这些协议,只需掌握基础知识。TCP负责从应用程序获取数据,将其组装到数据包中,并将其传递到以太网或Wi-Fi卡以通过Internet传输。另一方面,相反的情况发生了。在HTTP的情况下,数据是超文本或HTML。不过,这并不  具备成为HTML。HTTP可用于传输文件,图像,脚本,视频等。
    两个最重要的请求称为GET和POST。这些是HTTP标准中的命令,HTTP服务器将理解这些命令。当我想查看,我的浏览器会向google.com的网络服务器发送GET命令,然后返回主页。当我在搜索栏中输入搜索并按回车键时,我的浏览器会向我的服务器发送一个POST命令。想想就像发信一样!
    这个项目的面包传感器!
    除了GET和POST命令,HTTP还会发送一些名为headers的额外数据  。这些标题是服务器可以用来修改它给你的信息的一小部分信息。例如,公共标头是User-Agent标头。这告诉服务器我们正在使用什么类型的浏览器。有没有想过当你去智能手机上的网站时,你会得到一个不同的布局?您的智能手机的浏览器通过User-Agent标题告诉服务器它是移动设备,因此服务器发送不同的布局,以便它适合您的小屏幕!
    在我们的例子中,我们要做的就是从传感器获取一些数据,并将其发送到服务器。所以我们只会使用POST请求。我们还将在HTTP标头中包含一些数据,以便服务器知道我们是谁并且不拒绝我们的请求(他们不希望您将数据发送到其他人的流!)。
    有大量服务可供您免费存储和显示数据。许多都是开源的,这是一个奖励!对于本教程,我们将使用Adafruit IO,但一旦您了解该过程,您就可以轻松替换任何其他服务。流行的包括Freeboard.ioThingsboard节点REDThingspeak,和很多很多。
    Adafruit IO REST API的文档位于此处。在阅读本教程的其余部分之前,我建议至少采用粗略的外观。请务必查看createData操作 - 这是我们将要使用的操作。

  • 2


    注册Adafruit IO
    正如我之前提到的,您可以自由使用您想要的任何云数据服务!但是,如果您希望能够使用所提供的代码,那么使用Adafruit IO会更容易。您可以访问https://io.adafruit.com/并单击“注册”按钮进行注册。
    注册后,导航到左侧工具栏中的“源”部分,然后创建两个源。在下面的图片中,我创建了一个名为bedroomhumidity的feed和bedroomtemp。我也把这些放在一个名为Bedroom的小组中,但这不是必需的。
    注册后,创建两个源,然后查看您的AIO密钥
    创建两个源后,单击其中一个源的名称,然后单击右侧工具栏中的“源信息”。这会显示有关Feed的所有信息,包括我们稍后需要的API端点。确保还单击View AIO Key - 我们稍后也需要此密钥。
    如果您点击Feed Info,则可以看到为您生成的API URL
    这就是我们现在所需要的一切!稍后,您可以随意创建仪表板来查看数据。


  • 3


    安装库和面包板
    为了使这个项目能够成功构建和上传,我们需要在Arduino环境中添加更多库。启动Arduino,然后就像回到第1部分一样,按Ctrl-Shift-I打开库管理器。在搜索框中,键入DHT,然后向下滚动,直到看到简单DHT。单击安装。它应该如下所示:
    之后,在搜索框中输入OneWire,并安装OneWire库,如下所示:
    现在我们已经解决了这个问题,让我们来看看我们的电路以及我们将要使用的传感器。DHT22和DS18B20都非常广泛,而且相当便宜。他们可以从通常的嫌疑人,拍卖网站和中国进口商那里找到。DS18B20由达拉斯制造,他于2001年被Maxim收购。
    DHT22是一款低成本的湿度传感器,价格令人惊讶。它实际上有一个类似于DS18B20的内置传感器,用于湿度传感器的热补偿。我从单独的DS18B20收集温度数据的原因是因为我有一个更长的导线,封装在金属探头中。这允许我将探头远离DHT传感器,这意味着如果需要,我可以一次从两个地方采样温度。但是,如果您只有一个或另一个(或完全不同的传感器),该项目仍然可以进行一些修改。
    防水有线DS18B20
    拿一个面包板,几个1K电阻器,你的传感器和你的ESP8266让我们把它们放在一起!
    我们的电路采用Adafruit羽毛HUZZAH ESP8266
    上图使用了Adafruit Feather HUZZAH,但您可以使用任何ESP8266板。只需确保将传感器连接到相同的引脚,或编辑代码以匹配您选择的引脚。此外,确保从3.3V为传感器供电,因为ESP8266的引脚无法处理5V!


  • 4


    使用Adafruit HTTP API
    好吧 - 是时候先潜入水中了!我知道这可能看起来有很多东西可以吸收,但坚持下去,你就会走到尽头!在我们覆盖它时,花点时间了解每个部分。
    如前所述,几乎所有HTTP请求也都以标头的形式发送了额外的数据。这是基于HTTP的API的工作原理。标头只是数据对的列表,通常是值的名称和值本身。例如,当我们向Adafruit IO提出任何请求时,我们需要证明我们有身份验证来访问我们请求的数据。我们通过在名为X-AIO-Key的标题中添加一个键来完成此操作。这与我们之前复制的Adafruit IO密钥配对。
    我们将以JSON格式向Adafruit IO发送我们的数据,使用POST请求到我们之前从Feed Info页面获得的URL。我们不需要深入研究JSON; 我们需要知道的是,它是一种以漂亮,有条理的格式存储数据的方式。为了告诉Adafruit服务器我们正在使用哪种数据格式,我们需要发送另一个名为Content-Type的头,值为application / json
    示例JSON文件可能如下所示:
    {   “value”:“string”,   “created_at”:“string”,   “lat”:“string”,   “lon”:“string”,   “ele”:“string”,   “epoch”:0 }
    您可以看到它只是一个键:值对的列表。即使“value”是整数或浮点值,键和值都用引号括起来。唯一的例外是“纪元”价值,我们将不再使用它。上面的示例实际上来自Adafruit IO文档,显示了我们可以传递给服务器的日志数据的值。我们只会使用“值”字段,因此我们的请求将只是以下形式:
    { “value”:“ 22.4” }
    所有其他字段都是可选字段,我们不会使用它们。总而言之,我们需要三件事:

    • Adafruit IO密钥,位于X-AIO-Key标头中
    • 内容类型:应用/ JSON
    • JSON数据本身{“值”:“20.4”}
    当它被分解为其组成部分时非常简单!
    这是一个由Wireshark嗅探的数据包。不要担心屏幕上的所有其他内容,只需注意我们的标题和价值是我们唯一需要关注的事情 - Arduino库会处理其他所有事情!另外,忽略\ r \ n - 这只是Wireshark中的一个人工制品,而不是我们需要担心的事情。
    突出显示的部分显示了数据包的重要部分
    这种简单性的权衡是我们需要包含很多头文件,并包含一些复杂的代码来为我们设置一些东西。但是,只要我们了解它们的用途,我们就不需要完全理解这些位的作用。




  • 把它们放在一起
    我们安装的ESP8266库包括用于Wi-Fi控制的特定库,以及HTTP客户端控件。我们还将使用前面提到的OneWire和SimpleDHT库以及SSL库,以便我们与Adafruit IO服务器的通信不会被任何人窥探。
    我们需要包含以下所有头文件:
    #包括 <ESP8266WiFi.h> #包括 <ESP8266WiFiMulti.h> #包括 <ESP8266HTTPClient.h>#包括 <WiFiClientSecureBearSSL.h>#包括 <OneWire.h> #包括 <SimpleDHT.h>
    前三个是ESP8266库的一部分,它们控制电路板的Wi-Fi部分,以及生成和格式化我们的HTTP请求。第四个包括我们将用于加密发送数据的SSL库。最后两个是我们之前安装的库,用于与两个传感器通信。
    下一节只是初始化变量,以及启动OneWire和DHT总线:
    ESP8266WiFiMulti ESPWifi;OneWire dsBus (5) ; //针脚5上的DS18B20 SimpleDHT22 dht22 (4) ; //针脚4上的DHT22const char * ssid = “your_ssid” ;const char * ssidPass = “your_password” ;const char * url = https://io.adafruit.com ;const char * io_key = “your_io_key” ;const char * humid_url = “your_humidity_url” ;const char * temp_url = “your_temperature_url” ;常量 uint8_t指纹[ 20 ] = { 0x77为0x000x540x2D0xDA0xE70xD8×03×270X310×230x99将0xEB0×27位于0xDB0xCB0xA5的0x4C0×57为0x18 };
    当然,您需要将这些变量更改为您的SSID和密码,Adafruit IO keu以及我们之前创建的Feed的URL。请注意,URL是https://io.adafruit.com 之后 的所有内容  ,所以从斜杠开始都是如此。指纹变量是Adafruit的HTTPS证书的指纹。我们需要这个以确认我们使用正确的证书连接到正确的服务器。
    我们的setup()函数非常简单:
    无效 设置() {  WiFi.mode(WIFI_STA);  ESPWifi.addAP(ssid,ssidPass);  Serial.begin(115200);}
    我们只需在工作站模式下启用Wi-Fi,然后连接到之前指定的wi-fi网络。我们还以115200波特率启动串行终端,因此我们可以根据需要打印调试消息。现在我们进入稍微复杂的部分。记住 - 你不需要知道一切是  如何运作的,只要你明白  为什么它就在那里。
    loop()函数的开头再次非常简单:
    void  loop ()  {   uint8_t data [ 12 ];  uint8_t addr [ 8 ];  uint8_t i;  uint8_t presence = 0 ;  漂浮细胞,湿度;
    我们稍后创建一些变量来保存来自传感器的信息。现在我们需要从DS18B20获得温度。为此,我们需要阅读DS18B20数据表。重要的是要知道所有1-Wire通信都以复位脉冲开始。在此之后,我们可以发送我们想要与之通信的传感器的64位地址,或者,如果总线上只有一个传感器(就像我们的情况那样),我们可以发送SKIP ROM命令来与之交谈总线上的一个设备。这就是我们在这种情况下所做的事情。我们发送命令0x44,它告诉传感器开始温度转换。这需要大约750毫秒,所以我们等待800毫秒,以确保安全。
    然后我们发送另一个复位脉冲,另一个SKIP ROM,但是这次我们发送命令0xBE,告诉传感器我们想从内部存储器中读出值。我们只需要前两个值,但是如果我们想要查看此代码的未来版本中的值,我们会读出所有9个值。
    前两个值一起构成代表温度的16位值。高12位表示整数,最后4位表示小数部分。我们将它们连接在一起,将它转换为celcius的简单方法就是将我们得到的数据除以16.现在我们得到了温度!
      //从DS18B20获取温度  dsBus.reset();  dsBus.skip(); //跳过ROM   dsBus.write(0×44); //开始转换   延迟(800);  dsBus.reset();  dsBus.skip();  dsBus.write(0xBE);    for(i = 0 ; i < 9 ; i ++){    data = dsBus.read();  }  int16_t result =(data [ 1 ] << 8)| 数据[ 0 ];  celcius =(float)result / 16.0 ; //转换为celcius
    从DHT22获取湿度要容易得多。SimpleDHT库在构建时考虑了DHT22,因此我们需要做的就是调用单个函数dht22.read2()。这为我们做了所有艰苦的工作。我们传递了我们希望存储湿度的变量,其余功能完成。
    请注意,我们实际上传递了变量的地址; 这称为“解除引用”变量,是另一天的主题。这就是为什么我们将&符号放在变量名之前。如果您有兴趣,请阅读C中的指针和解除引用!
    现在我们得到一些手工波浪状的部分,你只需要相信我。试图解释接下来几行所做的事情超出了本教程的范围。简而言之,if语句检查我们是否连接到Wi-Fi。如果是,我们将创建一个新的Secure Wi-Fi对象,我们将在if语句的其余部分中用于所有HTTPS通信。我们为我们想要连接的服务器提供指纹,因此它可以确认我们已连接到正确的服务器。
      if((ESPWifi.run()== WL_CONNECTED)){        std :: unique_ptr <BearSSL :: WiFiClientSecure> client(new BearSSL :: WiFiClientSecure);        客户端 - > setFingerprint(指纹);
    好的,是时候将我们的数据发送到云端了!我们创建了一个新的HTTPS客户端,我们从最后一节传递了Secure Wi-FI对象,以及我们要连接的服务器的URL。然后,我们告诉它我们要添加哪些标题(在我们的例子中,在步骤4中讨论的标题 - X-AIO-Key和Content-Type)以及它们各自的值。最后,我们使用非常基本的JSON作为我们发送的数据来发出POST请求。POST请求中的反斜杠告诉编译器以下字符是  文字字符,并且它不是代码的一部分。否则,双引号将结束字符串,我们会得到错误。
    我们检查返回代码是否为200(表示成功),然后我们结束HTTPS会话。
        HTTPClient https;    https.begin(* client,String(url)+ String(humid_url));    https.addHeader(“X-AIO-Key”,io_key);    https.addHeader(“Content-Type”“application / json”);    int httpCode = https.POST(“{\”value \“:\”“ + String(humidity)+ ”\“}”);    if(httpCode == 200){        Serial.println(“湿度提交成功!”);    }    https.end();
    我们重复这个完全相同的过程,但这次我们发送温度而不是湿度。两个连接之间还有100毫秒的延迟,可以解决一些问题。
        https.begin(* client,String(url)+ String(temp_url));    https.addHeader(“X-AIO-Key”,io_key);    https.addHeader(“Content-Type”“application / json”);    httpCode = https.POST(“{\”value \“:\”“ + String(celcius)+ ”\“}”);    if(httpCode == 200){        Serial.println(“温度提交成功!”);    }    https.end();
    在那之后,我们等待10秒,然后我们再做一遍!
    您可以在GitLab上查看整个文件


  • 6


    检查你的结果!
    在ESP8266上运行代码后,请务必返回Adafruit IO并查看正在发送的数据!您应该会在两个Feed上看到数据点。如果需要,您可以创建仪表板,然后添加这些源以直观地显示它们。这可以使数据更容易理解和解释。
    我知道这似乎是第2部分中的一大难点,因此请务必花时间了解代码以及发生了什么。如果您需要提问,请查看项目详细信息中的“获得帮助”部分!我通常对询问非常敏感。请继续关注更多即将推出的教程 - 我们将采用我们学到的知识来创建一个全面的物联网项目!





点评

酷,很有创意,学习了  发表于 2021-2-1 14:32
回复

使用道具 举报

该用户从未签到

发表于 2020-3-24 21:54:13 | 显示全部楼层
第1部分和第2部分呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /5 下一条



手机版|小黑屋|与非网

GMT+8, 2024-12-24 02:11 , Processed in 0.166764 second(s), 19 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.