电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
ESP8266读取DS18b20再上载传感云
分 享
扫描二维码分享
ESP8266读取DS18b20再上载传感云
ESP8266,
DS18b20
传感云
xdsnet
关注
发布时间: 2019-12-09
丨
阅读: 9577
我认为ESP8266是一款不可多得的多功能单片机开发板,可以以很小的成本就体验很多单片机开发功能,性能不错,还可以联网。 虽然最小化的ESP8266模块只开放了很少的几个GPIO,但就是这些GPIO也可以玩出花样来,今天就用1个GPIO来读取DS18b20温度数据,还上传到一个IoT云平台,传感云上。 ### 传感云注册配置 首先,是在传感云上玩出相应准备,这个就很简单啦,就下面几步(如果已经注册,可以跳过前面2步) 1. 注册,在[http://www.wsncloud.com/account/register](http://www.wsncloud.com/account/register) 2. 激活用户(邮箱验证激活) 3. 在[http://www.wsncloud.com/account/gologin](http://www.wsncloud.com/account/gologin) 登录传感云进行配置,主要是: 3.1. 在个人中心创建设备,如下图:  3.2 在已有设备下添加传感器(用来接收数据),因为温度是一个数值,所以创建一个数值传感器,如下图   4. 完成上述步骤后可以获取2个关键信息 4.1. 用户秘钥,在用户信息下可以看到,如下图:  4.2. 传感器id,在我的设备下相应传感器部分可以看到,如下图:  5. 还可以为传感器配置报警(这里就不做介绍啦,详情参考官方文档) ### Arduino IDE的配置 为了简便起见,这次的例子选用Arduino IDE来开发,相应的资源随后会传到本站,这里提一下Arduino IDE的配置。 1. 让Arduino IDE可以开发ESP8266,需要在管理开发板中添加相应内容,我这里是以Arduino IDE1.8.10为例,在配置的 附加开发板管理器网址中添加`https://arduino.esp8266.com/stable/package_esp8266com_index.json`,如下图  然后就可以在开发板管理中安装esp8266相应支持啦,如下图  2. 选取esp8266开发板环境(选择`Generic ESP8266 Module `或者`ESPDuino(ESP-13 Module)`都可以的,因为没有用到更多管脚,效果一样啦),如下图  **注**如果是其他兼容ESP,也可以选择对应的开发板环境。 3. 因为要读取DS18b20,所以还要额外安装2个库支持,其实就在库管理器中搜索对应名字`OneWire`和`DallasTemperature`即可安装好 3.1. 添加 OneWire 库,相关连接 [https://www.pjrc.com/teensy/td_libs_OneWire.html](https://www.pjrc.com/teensy/td_libs_OneWire.html)  3.2. 添加 DallasTemperature库,相关链接[https://github.com/milesburton/Arduino-Temperature-Control-Library](https://github.com/milesburton/Arduino-Temperature-Control-Library)  ### 连线原理图 ESP8266和DS18b20连接的原理图如下:  ### 程序 这里就直接贴代码啦,整个代码量不是太多 ```cpp /@@** 利用ESP8266 和 DS18b20 检测温度并实时报告到传感云平台(http://www.wsncloud.com/) By:xdsnet Date:2019.12.8 */ #include
// 下面需要安装ESP8266开发板支持才有对应的库 #include
#include
#include
#include
// 需要额外安装 OneWire库 #include
// 需要额外安装DallasTemperature库 #include
ESP8266WiFiMulti WiFiMulti; // 定义Ds18b20 数据连接口为GPIO2 #define ONE_WIRE_BUS 2 // 定义一个oneWire数据口,用于读取数据 OneWire oneWire(ONE_WIRE_BUS); // 注册一个Ds18b20传感器 DallasTemperature sensors(&oneWire); // 定义传感器地数组,用于存储传感器 DeviceAddress insideThermometer; // 定义联网标志变量,如果已经联网则为1,否则为0,会影响循环速度 int WiFiCFlag=0; const String host = "http://www.wsncloud.com/"; // wsncloud站点链接地址,不用改 const String mapi = "api/data/v1/numerical/insert?"; // 数值更新api路径,用于拼接GET请求字符串,不用改 // 需修改的配置参数---开始 const String ssid = "Your_Wifi_SSID"; // 1.请填自己wifi的SSID const String wifiPasswd = "PASSWORD"; //2. 请填自己的wifi密码 const String ak = "akakakakakakakakakakakakakakakak"; // 3.请填自己的用户请求号 const String id = "idididididididididididid"; // 4.请填自己需要更新设备传感器id号 // 需修改的配置参数---结束 void setup() { Serial.begin(115200); // 调试用,方便输出 Serial.println(); Serial.println(); Serial.println(); // 搜索本地DS18b20设备 Serial.print("本地设备..."); sensors.begin(); Serial.print("找到 "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" 设备."); // 报告DS18b20设备电源状态 Serial.print("电源状态: "); if (sensors.isParasitePowerMode()) Serial.println("打开"); else Serial.println("关闭"); if (!sensors.getAddress(insideThermometer, 0)) Serial.println("不能找到设备0地址"); // 显示总线上设备0的地址 Serial.print("设备0 地址: "); printAddress(insideThermometer); Serial.println(); // 设置数据格式为9bit sensors.setResolution(insideThermometer, 9); Serial.print("设备0分辨率: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); for (uint8_t t = 4; t > 0; t--) { Serial.printf("[启动] 等待阶段 %d...\n", t); Serial.flush(); delay(1000); } Serial.print("请求温度数据..."); sensors.requestTemperatures(); // 必须要先发送请求才能获取新值,否则只有一个值。 Serial.println("DONE"); // 测试性获取一个温度数据 float tempC = sensors.getTempC(insideThermometer); Serial.print("Temp C: "); Serial.print(tempC); Serial.println(); Serial.flush(); WiFi.mode(WIFI_STA); WiFiMulti.addAP( ssid.c_str(),wifiPasswd.c_str() ); } // 打印OneWire设备地址,这里就是DS18b20设备的地址 void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } void loop() { // 等wifi链接上 if ((WiFiMulti.run() == WL_CONNECTED)) { WiFiCFlag=1; WiFiClient client; Serial.print("当前主机IP:"); Serial.println(WiFi.localIP()); HTTPClient http; Serial.print("请求温度数据..."); sensors.requestTemperatures(); // 请求新的温度值 Serial.println("DONE"); float tempC = sensors.getTempC(insideThermometer); Serial.print("Temp C: "); Serial.print(tempC); Serial.println(); Serial.print("[HTTP] begin...\n"); String getStr = host + mapi + "ak="+ak+ "&id="+id+ "&value="+tempC+ "×tamp="; if( http.begin(client,getStr)) { // HTTP Serial.print("[HTTP] GET...\n"); // 开始正式连接 int httpCode = http.GET(); // httpCode 如果有错误,则不大于0 if (httpCode > 0) { // HTTP 头返回一个状态码 Serial.printf("[HTTP] GET... code: %d\n", httpCode); // 获取到的信息 if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { String payload = http.getString(); Serial.println(payload); } } else { Serial.printf("[HTTP] GET... 失败,错误: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } else { Serial.printf("[HTTP] 不能连接\n"); } }else{ WiFiCFlag=0; // Wifi 断了重置Wifi标志状态 } if( WiFiCFlag == 1){ delay(30000); // 延迟30秒刷新一次 }else{ delay(3000); // 还没有联网成功就延迟3秒刷新一次,加快开始刷新速度 } } ``` 代码中有足够的注释 ### 执行效果 这里就不延时串口信息啦,截一个传感云上对应数据图  数据已经正确传递到云平台啦。 至此实例演示完成 ### 拓展应用说明 该实例有完整的相关处理过程,完全可用迁移到类似平台上,比如ESP32,其实也可以迁移到真正的Arduino平台上(起码 对于DS18b20的读取是通用的),而且这已经具有初步的应用原型效果,完全可用把这些集成起来,作为家用温度监控(也可以拓展为其他监控)的原型啦。 所以ESP8266真乃神器,只有想不到啊,更多神奇的功能等待你去开拓!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
xdsnet
擅长:科研教育
关注
评论
(2)
登录后可评论,请
登录
或
注册
d2c566f9172a6aa3
289
天前...
好像有个模块叫做EWM3080阿里云出的,同等价位,性能是8266三倍,看你能不能评测下
0
回复
发布
xdsnet
回复
d2c566f9172a6aa3
289
天前...
没有这个模块
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交