获得蓝牙小米温湿度传感器的例子-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3824|回复: 12

获得蓝牙小米温湿度传感器的例子

[复制链接]
发表于 2021-7-25 19:05 | 显示全部楼层 |阅读模式
代码来自 https://www.instructables.com/ES ... et-Data-Wirelessly/

  1. #include "soc/soc.h"
  2. #include "soc/rtc_cntl_reg.h"
  3. #include "esp_system.h"
  4. #include <sstream>

  5. #include <BLEDevice.h>
  6. #include <BLEUtils.h>
  7. #include <BLEScan.h>
  8. #include <BLEAdvertisedDevice.h>

  9. #define SCAN_TIME  10 // seconds

  10. boolean METRIC = true; //Set true for metric system; false for imperial

  11. BLEScan *pBLEScan;

  12. void IRAM_ATTR resetModule(){
  13.     ets_printf("reboot\n");
  14.     esp_restart();
  15. }

  16. float  current_humidity = -100;
  17. float  previous_humidity = -100;
  18. float current_temperature = -100;
  19. float previous_temperature = -100;

  20. class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
  21.     void onResult(BLEAdvertisedDevice advertisedDevice)
  22.     {
  23.         if (advertisedDevice.haveName() && advertisedDevice.haveServiceData() && !advertisedDevice.getName().compare("MJ_HT_V1")) {

  24.             int serviceDataCount = advertisedDevice.getServiceDataCount();
  25.             std::string strServiceData = advertisedDevice.getServiceData(0);

  26.             uint8_t cServiceData[100];
  27.             char charServiceData[100];

  28.             strServiceData.copy((char *)cServiceData, strServiceData.length(), 0);

  29.             Serial.printf("\n\nAdvertised Device: %s\n", advertisedDevice.toString().c_str());

  30.             for (int i=0;i<strServiceData.length();i++) {
  31.                 sprintf(&charServiceData[i*2], "%02x", cServiceData[i]);
  32.             }

  33.             std::stringstream ss;
  34.             ss << "fe95" << charServiceData;
  35.             
  36.             Serial.print("Payload:");
  37.             Serial.println(ss.str().c_str());

  38.             char eventLog[256];
  39.             unsigned long value, value2;
  40.             char charValue[5] = {0,};
  41.             switch (cServiceData[11]) {
  42.                 case 0x04:
  43.                     sprintf(charValue, "%02X%02X", cServiceData[15], cServiceData[14]);
  44.                     value = strtol(charValue, 0, 16);
  45.                     if(METRIC)
  46.                     {
  47.                       current_temperature = (float)value/10;
  48.                     }else
  49.                     {
  50.                       current_temperature = CelciusToFahrenheit((float)value/10);
  51.                     }
  52.                     displayTemperature();  
  53.                     break;
  54.                 case 0x06:
  55.                     sprintf(charValue, "%02X%02X", cServiceData[15], cServiceData[14]);
  56.                     value = strtol(charValue, 0, 16);  
  57.                     current_humidity = (float)value/10;
  58.                     displayHumidity();                     
  59.                     Serial.printf("HUMIDITY_EVENT: %s, %d\n", charValue, value);
  60.                     break;
  61.                 case 0x0A:
  62.                     sprintf(charValue, "%02X", cServiceData[14]);
  63.                     value = strtol(charValue, 0, 16);                    
  64.                     Serial.printf("BATTERY_EVENT: %s, %d\n", charValue, value);
  65.                     break;
  66.                 case 0x0D:
  67.                     sprintf(charValue, "%02X%02X", cServiceData[15], cServiceData[14]);
  68.                     value = strtol(charValue, 0, 16);      
  69.                     if(METRIC)
  70.                     {
  71.                       current_temperature = (float)value/10;
  72.                     }else
  73.                     {
  74.                       current_temperature = CelciusToFahrenheit((float)value/10);
  75.                     }
  76.                     displayTemperature();               
  77.                     Serial.printf("TEMPERATURE_EVENT: %s, %d\n", charValue, value);                    
  78.                     sprintf(charValue, "%02X%02X", cServiceData[17], cServiceData[16]);
  79.                     value2 = strtol(charValue, 0, 16);
  80.                     current_humidity = (float)value2/10;
  81.                     displayHumidity();                                       
  82.                     Serial.printf("HUMIDITY_EVENT: %s, %d\n", charValue, value2);
  83.                     break;
  84.             }
  85.         }
  86.     }
  87. };

  88. void setup() {

  89.   Serial.begin(115200);
  90.   Serial.println("ESP32 XIAOMI Humity");

  91.   initBluetooth();
  92. }

  93. void loop() {
  94.   
  95.     char printLog[256];
  96.     Serial.printf("Start BLE scan for %d seconds...\n", SCAN_TIME);
  97.     BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
  98.     pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  99.     pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  100.     BLEScanResults foundDevices = pBLEScan->start(SCAN_TIME);
  101.     int count = foundDevices.getCount();
  102.     printf("Found device count : %d\n", count);

  103.     delay(100);
  104. }

  105. void initBluetooth()
  106. {
  107.     BLEDevice::init("");
  108.     pBLEScan = BLEDevice::getScan(); //create new scan
  109.     pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  110.     pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  111.     pBLEScan->setInterval(0x50);
  112.     pBLEScan->setWindow(0x30);
  113. }

  114. void displayTemperature()
  115. {
  116.    if(current_temperature != previous_temperature)
  117.    {
  118.       
  119.       previous_temperature = current_temperature;
  120.    }
  121. }

  122. void displayHumidity()
  123. {
  124.    if(current_humidity != previous_humidity)
  125.    {
  126.       previous_humidity = current_humidity;
  127.    }
  128. }

  129. String convertFloatToString(float f)
  130. {
  131.   String s = String(f,1);
  132.   return s;
  133. }

  134. float CelciusToFahrenheit(float Celsius)
  135. {
  136. float Fahrenheit=0;
  137. Fahrenheit = Celsius * 9/5 + 32;
  138. return Fahrenheit;
  139. }
复制代码


我使用 DFRobot FireBeetle 测试接收

Mi.png
结果如下(测试有2个上面这样的传感器)

hum.PNG




发表于 2021-7-25 22:22 | 显示全部楼层
正在找,谢谢了。只限上图的温湿度计吗,米家其他的蓝牙温湿度计都支持吗?
 楼主| 发表于 2021-7-26 08:35 | 显示全部楼层
anqiw 发表于 2021-7-25 22:22
正在找,谢谢了。只限上图的温湿度计吗,米家其他的蓝牙温湿度计都支持吗? ...

不知道唉

我用的是图上这一款
发表于 2021-7-28 23:20 来自手机 | 显示全部楼层
不知道他用的什么方案
 楼主| 发表于 2021-7-29 08:47 | 显示全部楼层
oanger 发表于 2021-7-28 23:20
不知道他用的什么方案

https://post.smzdm.com/p/alpzodd8/
可以参考一下
发表于 2021-7-29 22:51 | 显示全部楼层
Zoologist 发表于 2021-7-29 08:47
https://post.smzdm.com/p/alpzodd8/
可以参考一下

谢谢,新手,没看太懂。
发表于 2021-10-20 00:47 | 显示全部楼层
那个soc.h是从哪里 获取的?
 楼主| 发表于 2021-10-20 08:42 | 显示全部楼层
leonclz 发表于 2021-10-20 00:47
那个soc.h是从哪里 获取的?

编译环境自带的。
发表于 2021-10-20 14:15 | 显示全部楼层
本帖最后由 leonclz 于 2021-10-20 14:52 编辑
Zoologist 发表于 2021-10-20 08:42
编译环境自带的。

也就 是说,需要esp32的板子才有这个头文件?我用的d1 mini ,编译的时候提示 没有这个文件
 楼主| 发表于 2021-10-20 15:48 | 显示全部楼层
leonclz 发表于 2021-10-20 14:15
也就 是说,需要esp32的板子才有这个头文件?我用的d1 mini ,编译的时候提示 没有这个文件 ...

你可以试试 DFRobot 的 FireBeetle 环境,前几天做了一个项目,里面是有的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:21 , Processed in 0.088659 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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