前言
- 之前已经完成了DS18B20温度传感器的基础使用,这次接入小爱同学,实现语音查询温度
- 用小爱同学接入可以免去买音箱的成本,手机下载小爱同学app就可以,百度和天猫没找到类似功能
- 这并不是“一顿操作猛如虎,淘宝只要5块5”的事,这是学习过程,掌握原理后才可以发挥想象,创作产品
- 注意:这个1块钱的传感器模块灵敏度低,实际使用时考虑DHT11或者更优质的模块
关键知识点
Blinker要先配置设备再导入头文件,不然抛异常
1 2 3 4 5 6 7 |
// 配置设备 #define BLINKER_WIFI #define BLINKER_MIOT_SENSOR // 导入头文件 #include <Blinker.h> |
Blinker.run不能等待,DS18B20.requestTemperatures()不能太频繁
- 在loop()函数中的Blinker.run()不能等待,不然小爱经常连不上
- 我试过delay(10)都不正常
- 为了解决Blinker.run不能等待,request温度不能太频繁的结使用了millis()获取开机时间来计算,10秒读一次温度数据
queryCode还是不太明白
- queryCode通过串口输出数字 0
- 用switch语句它符合 BLINKER_CMD_QUERY_ALL_NUMBER
- 暂时理解为向小爱查询传感器数值时,传入的参数就是 BLINKER_CMD_QUERY_ALL_NUMBER
- 可能不太准确,但这样理解使用也没发现不妥,官文没有具体描述,只能慢慢摸索
通过心跳包发送温度数据给app
1 2 3 |
Blinker.attachHeartbeat(heartbeat); // 绑定心跳包函数 void heartbeat(){TEMP.print(tempC);} // 发送数据给温度组件 |
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
<em>// DS18B20传感器库</em> #include <OneWire.h> #include <DallasTemperature.h> <em>// SSD1306 I1C显示屏库</em> #include <U8g2lib.h> #include <SPI.h> #include <Wire.h> <em>// 预加载Blinker小爱同学</em> #define BLINKER_WIFI #define BLINKER_MIOT_SENSOR <em>// 小爱同学传感器配置</em> <em>// 接入Blinker库</em> #include <Blinker.h> <em>// 注册温度组件</em> BlinkerNumber TEMP("temp"); <em>// TEMP是对象名,在Arduino中使用; temp是键名,app中调用</em> <em>// 预加载OLED引脚</em> #define ONE_WIRE_BUS 2 <em>// DS18B20 pin GPIO2 = D4</em> #define SCL D1 #define SDA D2 OneWire oneWire(ONE_WIRE_BUS); <em>// 定义OneWire对象</em> DallasTemperature DS18B20(&oneWire); <em>// 定义DallasTemperature对象</em> U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, <em>/* clock=*/</em> SCL, <em>/* data=*/</em> SDA, <em>/* reset=*/</em> U8X8_PIN_NONE); <em>// 初始化OLED构造器(IIC SSD1306 128X64)</em> <em>// WIFI信息</em> char auth[] = "*******"; char ssid[] = "*****"; char pswd[] = "**********"; float tempC; <em>// 存储温度数据</em> int timeCount = 0; <em>// 存储开机时间</em> int lastTime = 0; <em>// 上次请求数据的时间</em> void setup() { Serial.begin(115200); u8g2.begin(); u8g2.enableUTF8Print(); <em>// 开启UTF8编码输出</em> <em>// 关闭自带的led灯,这玩意儿闪得心烦</em> pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); BLINKER_DEBUG.stream(Serial); <em>// 串口输出Blinker调式信息</em> Blinker.begin(auth, ssid, pswd); <em>// 设备连接wifi上线</em> Blinker.attachData(dataRead); <em>// 报文没有对应回调函数时执行的函数</em> BlinkerMIOT.attachQuery(miotQuery); <em>// 小爱同学的应答函数</em> Blinker.attachHeartbeat(heartbeat); <em>// 绑定心跳包函数</em> } void loop() { Blinker.run(); <em>// 执行Blinker,保持设备上线</em> timeCount = millis(); Serial.println(timeCount); if ((timeCount - lastTime) >= 10000){ DS18B20.requestTemperatures(); <em>// 请求SD18B20的温度数据</em> tempC = DS18B20.getTempCByIndex(0); <em>// 读取索引0上的传感器温度</em> Serial.print("当前温度: "); Serial.println(tempC); u8g2.setFont(u8g2_font_wqy14_t_gb2312); <em>// 设置字体</em> u8g2.setFontDirection(0); <em>// 文字方向</em> u8g2.clearBuffer(); <em>// 清除缓存区</em> u8g2.setCursor(20, 20); <em>// 设置坐标</em> u8g2.print("当前温度"); u8g2.setCursor(40, 50); u8g2.print(tempC); u8g2.sendBuffer(); <em>// 发送数据给显示屏</em> lastTime = timeCount; } } <em>// 小爱应答函数</em> void miotQuery(int32_t queryCode) { BLINKER_LOG("MIOT Query codes: ", queryCode); switch (queryCode) { case BLINKER_CMD_QUERY_ALL_NUMBER : BLINKER_LOG("MIOT Query All"); BlinkerMIOT.temp(tempC); BlinkerMIOT.humi(20); BlinkerMIOT.pm25(20); BlinkerMIOT.co2(20); BlinkerMIOT.print(); break; default : BlinkerMIOT.temp(20); BlinkerMIOT.humi(20); BlinkerMIOT.pm25(20); BlinkerMIOT.co2(20); BlinkerMIOT.print(); break; } } <em>// 心跳包函数,发送数据给app</em> void heartbeat() { TEMP.print(tempC); <em>// 发送数据给温度组件</em> } <em>// 无回调函数时调用的函数</em> void dataRead(const String & data) { BLINKER_LOG("Blinker readString: ", data); <em>// 输出调式信息</em> Blinker.vibrate(); <em>// 发送手机震动指令给app</em> uint32_t BlinkerTime = millis(); <em>// 运行时间</em> Blinker.print("millis", BlinkerTime); } |
近期评论