五
把它们放在一起
我们安装的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,为0x00,0x54,0x2D,0xDA,0xE7,0xD8,×03,×27,0X31,0×23,0x99,将0xEB,0×27,位于0xDB,0xCB,0xA5的,0x4C,0×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上查看整个文件!