风筝
发表于: 2022-11-5 11:06:08 | 显示全部楼层

您是否曾经想过将传感器散落在您的房屋周围和花园,将其温湿度值定期报告给中央服务器?该物联网项目可能是您的可靠起点!


该项目使用ESP8266 NODEMCU作为控制设备,可轻松连接到现有的WiFi网络并创建Web服务器。当任何连接的设备访问此Web服务器时,ESP8266将从多个DS18B20温度传感器中读取温度,并将其发送到该设备的Web浏览器。


单根总线的多个DS18B20

DS18B20的最大功能之一是,多个DS18B20可以在同一条总线共存。由于每个DS18B20在工厂烧录了独特的64位串行代码,因此将它们彼此区分开来更容易。


当您想控制许多在大面积上分布的DS18B20时,此功能可能是一个巨大的优势。


将多个DS18B20传感器连接至ESP8266 NodeMCU

将DS18B20传感器连接到ESP8266 NodeMCU非常简单。

DS18B20-Pinout.jpg


首先在并行连接所有DS18B20,即所有VDD引脚、GND引脚和信号引脚。然后将VDD连接到3.3V,GND接地,并将信号引脚连接到ESP8266 NodeMCU上的数字引脚D2。


接下来,您需要在信号和电源引脚之间的整个总线上添加一个4.7K的上拉电阻,以保持数据传输稳定。

Wiring-Multiple-DS18B20-Temperature-Sensors-to-ESP8266.jpg


安装DS18B20库

Dallas 1-Wire协议有些复杂,需要一堆代码来解析通信。为了隐藏这种不必要的复杂性,我们将安装DallasTemperature.h库,以便发布简单的命令就可以从传感器中获取温度读数。


要安装库导航到Arduino IDE > Sketch > Include Library > Manage Libraries… 等待Library Manager下载库索引并更新已安装的库列表。输入DS18B20筛选搜索结果。应该有几个条目。查找Miles Burton提供的DallasTemperature。单击该条目,然后选择Install。

Installing-OneWire-Library-In-Arduino-IDE.jpg


该Dallas Temperature库是一个特定于硬件的库,可处理较低级别的功能。 它需要与One Wire库配对,以与任何单线设备不仅仅是DS18B20进行通信。

Installing-OneWire-Library-In-Arduino-IDE.jpg


在公共总线上查找DS18B20的地址

我们知道,每个DS18B20都有一个独特的64位地址,可以将它们彼此区分。 首先,我们将找到相应标记每个传感器的地址。 然后,该地址可用于单独读取每个传感器。


以下草图检测到公共总线上存在的所有DS18B20,并在串口显示器上打印其单线地址。您可以一次仅连接一个传感器以找到其地址(或连续添加新的传感器),以便您可以通过其地址识别每个传感器。 然后,您可以标记每个传感器。

  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>

  3. // Data wire is plugged into port D2 on the ESP8266
  4. #define ONE_WIRE_BUS D2

  5. // Setup a oneWire instance to communicate with any OneWire devices
  6. OneWire oneWire(ONE_WIRE_BUS);

  7. // Pass our oneWire reference to Dallas Temperature.
  8. DallasTemperature sensors(&oneWire);

  9. // variable to hold device addresses
  10. DeviceAddress Thermometer;

  11. int deviceCount = 0;

  12. void setup(void)
  13. {
  14.   // start serial port
  15.   Serial.begin(115200);

  16.   // Start up the library
  17.   sensors.begin();

  18.   // locate devices on the bus
  19.   Serial.println("Locating devices...");
  20.   Serial.print("Found ");
  21.   deviceCount = sensors.getDeviceCount();
  22.   Serial.print(deviceCount, DEC);
  23.   Serial.println(" devices.");
  24.   Serial.println("");
  25.   
  26.   Serial.println("Printing addresses...");
  27.   for (int i = 0;  i < deviceCount;  i++)
  28.   {
  29.     Serial.print("Sensor ");
  30.     Serial.print(i+1);
  31.     Serial.print(" : ");
  32.     sensors.getAddress(Thermometer, i);
  33.     printAddress(Thermometer);
  34.   }
  35. }

  36. void loop(void)
  37. { }

  38. void printAddress(DeviceAddress deviceAddress)
  39. {
  40.   for (uint8_t i = 0; i < 8; i++)
  41.   {
  42.     Serial.print("0x");
  43.     if (deviceAddress[i] < 0x10) Serial.print("0");
  44.     Serial.print(deviceAddress[i], HEX);
  45.     if (i < 7) Serial.print(", ");
  46.   }
  47.   Serial.println("");
  48. }
复制代码

现在,打开串口显示器。您应该得到以下内容。

Finding-One-Wire-Address-Of-All-DS18B20-On-the-Bus.jpg


复制所有地址,我们将在下一个草图中使用。


创建ESP8266网页服务器(STA)模式

现在,我们将将我们的ESP8266配置为站点STA模式,并创建网页务器以将网页提供给现有网络下的任何连接客户端。

在上传草图之前,您需要进行一些更改以使其适合您。您需要使用网络凭据修改以下两个变量,以便ESP8266可以与现有网络建立连接。

  1. const char* ssid = "YourNetworkName";  // Enter SSID here
  2. const char* password = "YourPassword";  //Enter Password here
复制代码

在提供网页之前,ESP8266通过其地址读取每个DS18B20的温度,因此,您需要使用先前草图中找到的DS18B20的地址更改DS18B20的地址。

  1. uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC };
  2. uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 };
  3. uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 };
复制代码

完成后,上传该草图代码。

  1. #include <ESP8266WebServer.h>
  2. #include <OneWire.h>
  3. #include <DallasTemperature.h>

  4. // Data wire is plugged into port D2 on the ESP8266
  5. #define ONE_WIRE_BUS D2

  6. // Setup a oneWire instance to communicate with any OneWire devices
  7. OneWire oneWire(ONE_WIRE_BUS);

  8. // Pass our oneWire reference to Dallas Temperature.
  9. DallasTemperature sensors(&oneWire);

  10. float tempSensor1, tempSensor2, tempSensor3;

  11. uint8_t sensor1[8] = { 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC  };
  12. uint8_t sensor2[8] = { 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27  };
  13. uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6  };

  14. /*Put your SSID & Password*/
  15. const char* ssid = "YourNetworkName";  // Enter SSID here
  16. const char* password = "YourPassword";  //Enter Password here

  17. ESP8266WebServer server(80);            

  18. void setup() {
  19.   Serial.begin(115200);
  20.   delay(100);
  21.   
  22.   sensors.begin();              

  23.   Serial.println("Connecting to ");
  24.   Serial.println(ssid);

  25.   //connect to your local wi-fi network
  26.   WiFi.begin(ssid, password);

  27.   //check wi-fi is connected to wi-fi network
  28.   while (WiFi.status() != WL_CONNECTED) {
  29.   delay(1000);
  30.   Serial.print(".");
  31.   }
  32.   Serial.println("");
  33.   Serial.println("WiFi connected..!");
  34.   Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  35.   server.on("/", handle_OnConnect);
  36.   server.onNotFound(handle_NotFound);

  37.   server.begin();
  38.   Serial.println("HTTP server started");
  39. }
  40. void loop() {
  41.   server.handleClient();
  42. }

  43. void handle_OnConnect() {
  44.   sensors.requestTemperatures();
  45.   tempSensor1 = sensors.getTempC(sensor1); // Gets the values of the temperature
  46.   tempSensor2 = sensors.getTempC(sensor2); // Gets the values of the temperature
  47.   tempSensor3 = sensors.getTempC(sensor3); // Gets the values of the temperature
  48.   server.send(200, "text/html", SendHTML(tempSensor1,tempSensor2,tempSensor3));
  49. }

  50. void handle_NotFound(){
  51.   server.send(404, "text/plain", "Not found");
  52. }

  53. String SendHTML(float tempSensor1,float tempSensor2,float tempSensor3){
  54.   String ptr = "<!DOCTYPE html> <html>\n";
  55.   ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
  56.   ptr +="<title>ESP8266 Temperature Monitor</title>\n";
  57.   ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  58.   ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  59.   ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  60.   ptr +="</style>\n";
  61.   ptr +="</head>\n";
  62.   ptr +="<body>\n";
  63.   ptr +="<div id="webpage">\n";
  64.   ptr +="<h1>ESP8266 Temperature Monitor</h1>\n";
  65.   ptr +="<p>Living Room: ";
  66.   ptr +=tempSensor1;
  67.   ptr +="°C</p>";
  68.   ptr +="<p>Bedroom: ";
  69.   ptr +=tempSensor2;
  70.   ptr +="°C</p>";
  71.   ptr +="<p>Kitchen: ";
  72.   ptr +=tempSensor3;
  73.   ptr +="°C</p>";
  74.   ptr +="</div>\n";
  75.   ptr +="</body>\n";
  76.   ptr +="</html>\n";
  77.   return ptr;
  78. }
复制代码

访问网页服务器

上载草图后,打开串口显示器。然后按NodeMCU上的复位按钮。 如果一切正常,它将输出从路由器获得的动态IP地址,并显示HTTP服务器启动消息。

ESP8266-Station-Mode-Web-Server-IP-Address-On-Serial-Monitor.jpg


接下来,加载一个浏览器,并将其指向串口显示器上显示的IP地址。 ESP8266应提供一个网页,显示所有DS18B20的温度。

Multiple-DS18B20-Readings-on-ESP8266-Web-Server-Without-CSS.jpg

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 56 | 回复: 109



手机版|

GMT+8, 2024-12-21 20:40 , Processed in 0.076741 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表