获得蓝牙小米温湿度传感器的例子-Arduino中文社区 - Powered by Discuz!
查看: 740|回复: 5

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

[复制链接]

该用户从未签到

发表于 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
正在找,谢谢了。只限上图的温湿度计吗,米家其他的蓝牙温湿度计都支持吗? ...

不知道唉

我用的是图上这一款

签到天数: 41 天

[LV.5]常住居民I

发表于 2021-7-28 23:20 来自手机 | 显示全部楼层
不知道他用的什么方案

该用户从未签到

 楼主| 发表于 2021-7-29 08:47 | 显示全部楼层
oanger 发表于 2021-7-28 23:20
不知道他用的什么方案

https://post.smzdm.com/p/alpzodd8/
可以参考一下

签到天数: 41 天

[LV.5]常住居民I

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

谢谢,新手,没看太懂。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

继电器断开瞬间esp32重启或者网络断开
继电器断开瞬间esp32重启
主要模块: 芯片ESP32-WROOM-32D 供电用的220V转5V模块,700mA 网络LAN8720A模块 继电
【Arduino】168种传感器系列实验(171)---HLK-V20离线语音模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】168种传感器系列实验(181)---1.3寸OLED液晶屏模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
大佬们,帮帮忙
大佬们,帮帮忙
为什么我写的子程序,单独使用运行没问题,两个程序合起来就只会运行一个程序
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表