您是否曾经想过将传感器散落在您的房屋周围和花园,将其温湿度值定期报告给中央服务器?该物联网项目可能是您的可靠起点!
该项目使用ESP8266 NODEMCU作为控制设备,可轻松连接到现有的WiFi网络并创建Web服务器。当任何连接的设备访问此Web服务器时,ESP8266将从多个DS18B20温度传感器中读取温度,并将其发送到该设备的Web浏览器。
单根总线的多个DS18B20 DS18B20的最大功能之一是,多个DS18B20可以在同一条总线共存。由于每个DS18B20在工厂烧录了独特的64位串行代码,因此将它们彼此区分开来更容易。
当您想控制许多在大面积上分布的DS18B20时,此功能可能是一个巨大的优势。
将多个DS18B20传感器连接至ESP8266 NodeMCU 将DS18B20传感器连接到ESP8266 NodeMCU非常简单。
首先在并行连接所有DS18B20,即所有VDD引脚、GND引脚和信号引脚。然后将VDD连接到3.3V,GND接地,并将信号引脚连接到ESP8266 NodeMCU上的数字引脚D2。
接下来,您需要在信号和电源引脚之间的整个总线上添加一个4.7K的上拉电阻,以保持数据传输稳定。
安装DS18B20库 Dallas 1-Wire协议有些复杂,需要一堆代码来解析通信。为了隐藏这种不必要的复杂性,我们将安装DallasTemperature.h库,以便发布简单的命令就可以从传感器中获取温度读数。
要安装库导航到Arduino IDE > Sketch > Include Library > Manage Libraries… 等待Library Manager下载库索引并更新已安装的库列表。输入DS18B20筛选搜索结果。应该有几个条目。查找Miles Burton提供的DallasTemperature。单击该条目,然后选择Install。
该Dallas Temperature库是一个特定于硬件的库,可处理较低级别的功能。 它需要与One Wire库配对,以与任何单线设备不仅仅是DS18B20进行通信。
在公共总线上查找DS18B20的地址 我们知道,每个DS18B20都有一个独特的64位地址,可以将它们彼此区分。 首先,我们将找到相应标记每个传感器的地址。 然后,该地址可用于单独读取每个传感器。
以下草图检测到公共总线上存在的所有DS18B20,并在串口显示器上打印其单线地址。您可以一次仅连接一个传感器以找到其地址(或连续添加新的传感器),以便您可以通过其地址识别每个传感器。 然后,您可以标记每个传感器。 - #include <OneWire.h>
- #include <DallasTemperature.h>
- // Data wire is plugged into port D2 on the ESP8266
- #define ONE_WIRE_BUS D2
- // Setup a oneWire instance to communicate with any OneWire devices
- OneWire oneWire(ONE_WIRE_BUS);
- // Pass our oneWire reference to Dallas Temperature.
- DallasTemperature sensors(&oneWire);
- // variable to hold device addresses
- DeviceAddress Thermometer;
- int deviceCount = 0;
- void setup(void)
- {
- // start serial port
- Serial.begin(115200);
- // Start up the library
- sensors.begin();
- // locate devices on the bus
- Serial.println("Locating devices...");
- Serial.print("Found ");
- deviceCount = sensors.getDeviceCount();
- Serial.print(deviceCount, DEC);
- Serial.println(" devices.");
- Serial.println("");
-
- Serial.println("Printing addresses...");
- for (int i = 0; i < deviceCount; i++)
- {
- Serial.print("Sensor ");
- Serial.print(i+1);
- Serial.print(" : ");
- sensors.getAddress(Thermometer, i);
- printAddress(Thermometer);
- }
- }
- void loop(void)
- { }
- void printAddress(DeviceAddress deviceAddress)
- {
- for (uint8_t i = 0; i < 8; i++)
- {
- Serial.print("0x");
- if (deviceAddress[i] < 0x10) Serial.print("0");
- Serial.print(deviceAddress[i], HEX);
- if (i < 7) Serial.print(", ");
- }
- Serial.println("");
- }
复制代码
现在,打开串口显示器。您应该得到以下内容。
复制所有地址,我们将在下一个草图中使用。
创建ESP8266网页服务器(STA)模式 现在,我们将将我们的ESP8266配置为站点STA模式,并创建网页务器以将网页提供给现有网络下的任何连接客户端。 在上传草图之前,您需要进行一些更改以使其适合您。您需要使用网络凭据修改以下两个变量,以便ESP8266可以与现有网络建立连接。 - const char* ssid = "YourNetworkName"; // Enter SSID here
- const char* password = "YourPassword"; //Enter Password here
复制代码在提供网页之前,ESP8266通过其地址读取每个DS18B20的温度,因此,您需要使用先前草图中找到的DS18B20的地址更改DS18B20的地址。 - uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
- uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
- uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };
复制代码完成后,上传该草图代码。 - #include <ESP8266WebServer.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- // Data wire is plugged into port D2 on the ESP8266
- #define ONE_WIRE_BUS D2
- // Setup a oneWire instance to communicate with any OneWire devices
- OneWire oneWire(ONE_WIRE_BUS);
- // Pass our oneWire reference to Dallas Temperature.
- DallasTemperature sensors(&oneWire);
- float tempSensor1, tempSensor2, tempSensor3;
- uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
- uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
- uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };
- /*Put your SSID & Password*/
- const char* ssid = "YourNetworkName"; // Enter SSID here
- const char* password = "YourPassword"; //Enter Password here
- ESP8266WebServer server(80);
-
- void setup() {
- Serial.begin(115200);
- delay(100);
-
- sensors.begin();
- Serial.println("Connecting to ");
- Serial.println(ssid);
- //connect to your local wi-fi network
- WiFi.begin(ssid, password);
- //check wi-fi is connected to wi-fi network
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("WiFi connected..!");
- Serial.print("Got IP: "); Serial.println(WiFi.localIP());
- server.on("/", handle_OnConnect);
- server.onNotFound(handle_NotFound);
- server.begin();
- Serial.println("HTTP server started");
- }
- void loop() {
- server.handleClient();
- }
- void handle_OnConnect() {
- sensors.requestTemperatures();
- tempSensor1 = sensors.getTempC(sensor1); // Gets the values of the temperature
- tempSensor2 = sensors.getTempC(sensor2); // Gets the values of the temperature
- tempSensor3 = sensors.getTempC(sensor3); // Gets the values of the temperature
- server.send(200, "text/html", SendHTML(tempSensor1,tempSensor2,tempSensor3));
- }
- void handle_NotFound(){
- server.send(404, "text/plain", "Not found");
- }
- String SendHTML(float tempSensor1,float tempSensor2,float tempSensor3){
- String ptr = "<!DOCTYPE html> <html>\n";
- ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
- ptr +="<title>ESP8266 Temperature Monitor</title>\n";
- ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
- ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
- ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
- ptr +="</style>\n";
- ptr +="</head>\n";
- ptr +="<body>\n";
- ptr +="<div id="webpage">\n";
- ptr +="<h1>ESP8266 Temperature Monitor</h1>\n";
- ptr +="<p>Living Room: ";
- ptr +=tempSensor1;
- ptr +="°C</p>";
- ptr +="<p>Bedroom: ";
- ptr +=tempSensor2;
- ptr +="°C</p>";
- ptr +="<p>Kitchen: ";
- ptr +=tempSensor3;
- ptr +="°C</p>";
- ptr +="</div>\n";
- ptr +="</body>\n";
- ptr +="</html>\n";
- return ptr;
- }
复制代码
访问网页服务器 上载草图后,打开串口显示器。然后按NodeMCU上的复位按钮。 如果一切正常,它将输出从路由器获得的动态IP地址,并显示HTTP服务器启动消息。
接下来,加载一个浏览器,并将其指向串口显示器上显示的IP地址。 ESP8266应提供一个网页,显示所有DS18B20的温度。
|