『瀚思彼岸』» 智能家居技术论坛

标题: ESP32+SIM7600,使用GRPS接入MQTT,通过HomeAssistan控制车辆锁 GPS等 [打印本页]

作者: shenbo    时间: 2024-1-9 12:56
标题: ESP32+SIM7600,使用GRPS接入MQTT,通过HomeAssistan控制车辆锁 GPS等
本帖最后由 shenbo 于 2024-1-9 13:00 编辑

背景:家里买了Tesla后就很羡慕老婆可以通过手机控制车辆解锁的便捷,特别是用Tesla Custom Integration集成,将车辆接入了HA,便开始一直琢磨如何将自己的车也接入HA,最后通过使用ESPHOME的MQTT模式+车载WIFI实现了通过HA远程控制车锁、GPS等功能,但在这个方式下WIFI路由器加上ESP32模块耗电量惊人,达到4-5w的功率,哪怕我是混动车,每天晚上停车的时候还是要插上充电桩才安心(曾经某个假期出去玩忘记充电,5天回来,车电瓶就挂了),此外,车载Wifi的稳定性也一般,所以一直在琢磨如何优化,可最无奈的是ESPHOME没有GPRS的组件提供使用,所以用ESPHOME无法实现ESP32+GPRS模块的方式接入HA。经过查阅资料后发现,其实ESP32+GPRS+MQTT是非常常见的iot方案,还有很多成熟的开发板,只是需要用C语言和Arduino IDE来开发,我抱着试一试的心态买了Lilygo-Tsim7600G-h这个开发板,于是有了这个帖子。
先来简单介绍一下Lilygo-Tsim7600G-h这个产品,其实他就是将ESP32模块和SIM7600模块连接在了一起,并加入了18650供电和太阳能充电功能,我经过整个折腾的过程后发现,其实完全没有必要买SIM7600这个4G模块,2G模块的速度对于MQTT来说足以,如果买SIM800自己焊不超过100元全部搞定,计算买lilygo的2G成品SIM开发板也就100多够了,我这个买贵了花了300大洋,不过这里要注意一个问题不是所有的Modem模块都有GPS芯片,我这款是包涵的如果买SIM800,请单独再额外买一个GPS模块。

[attach]55040[/attach]

先上一下最终完成后的硬件图片和HA控制面板--------
Mushcard美化后的控制面板
[attach]55046[/attach]

硬件设备(不会做PCB板,请忽略杂乱的连线
[attach]55047[/attach]

MQTT接入的原始HA控制界面
[attach]55048[/attach][attach]55049[/attach]

开发过程-------------

【硬件清单】

1、Lilygo TSIM7600g-h
2、PN532读卡模块(后来考虑功耗被我去除了,改用ESP32的BLE服务来解决如果没有GRPS信号无法通过HA控制解锁的问题)
3、6路5V继电器(其实感觉用光耦能更小巧,我这个继电器是之前用在ESPHOME控制车锁的设备里,由于和车钥匙连接好了,懒得换)
4、车钥匙(这个是项目最核心,也是最土的地方,是没办法的办法,由于车没有远程控制的设计,所以只能控制车辆自身的钥匙来实现,当然这个方式自然也成了万能方式)
-------欢迎对这个问题拍砖,有什么更好的方法改进
5、INA219模块(测量车辆电瓶电压及整个设备的功耗)
6、12V转5V变压模块(给5v设备供电)
7、5V转3.3V I2C中继芯片(连接PN532使用)
9、震动传感器(唤醒ESP32使用)
[attach]55051[/attach]
10、BLE开关(唤醒ESP32使用,解决脱离ESP32解锁,解决iPhone BLE连接等问题,后续详解)
[attach]55050[/attach]
11、尺寸合适的洞洞板、连接线、接头若干、2032电池盒一个


【功能清单】通过直接调用GRPS模块,设备工作的能耗大概1.5w左右,对比之前的4-5w大幅度下降,睡眠后基本0能耗(电流消耗小于10ma)
1、MQTT连入HA远程控制原有车钥匙的所有功能
2、通过连接车辆关闭后备箱按钮实现MQTT连入HA远程关闭后备箱
3、远程关闭车钥匙电源(只是简单的关闭车钥匙的电池连接)
4、MQTT连入HA,实现车辆GPS轨迹记录
5、硬件设备在车辆停止或手机离开车辆一定时间后进入睡眠状态(该状态下电流消耗小于10ma),车辆轻微震动(轻拍车身)或者重新连接手机BLE后,立刻5s内唤醒,该功能通过HA控制关闭、开启
6、没有GPRS信号时可以通过手机BLE,解/锁车辆,并支持调整解/锁车辆的BLE RSSI信号强度,该功能通过HA控制关闭、开启
7、没有GPRS信号时可以通过NFC,解/锁车辆(需要PN532,我个人考虑能耗,只用了BLE,PN532需要20ma的电流),该功能通过HA控制关闭、开启
8、洗车或代客泊车时,使用Beacon蓝牙信标或NFC(需要PN532)解/锁车辆
9、MQTT连入HA监测车辆电瓶电压及设备能耗
10、向指定手机发SMS报告状态或通过MQTT读取设备SIM卡收取的短信
11、所有实体配置MQTT Discovery,HA自动创建设备及实体
12、HA给出的所有指令,存入ESP32的NVS,ESP32重启的时候自动重载
13、Wifi OTA 升级
14、ESP32 Watch DOG 死机重启

【硬件连接简单展示】


车钥匙
[attach]55052[/attach]

INA219及I2C中继
[attach]55053[/attach]

装车后效果(请再次忽略乱七八糟的线路)

[attach]55054[/attach]


【Arduino IDE中对于我比较坑的代码】首先申明我是编程小白,这是我第一个编程,更是第一个C编程,拍砖请轻一点

需要用的库#include <esp_task_wdt.h>
#include <TinyGsmClient.h>
#include <ubSubClient.h>
#include <TinyGPS++.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <references.h>
#include <INA219.h>
#include <WiFi.h>
#include <ArduinoOTA.h>
#include <NimBLEDevice.h>
#include <NimBLEAdvertisedDevice.h>
#include "utilities.h"





MQTT Discovey的配置模版
jsonString是真好用,否则代码看花眼)
void publishBeaconrssiDiscovery() {
  DynamicJsonDocument doc(1024);
  // Add data to the JSON document
  doc["dev_cla"] = "signal_strength";
  doc["unit_of_meas"] = "dB";
  doc["stat_cla"] = "measurement";
  doc["stat_t"] = "LilygoTSIM1/beacon_rssi";
  doc["name"] = "Beacon Key RSSI";
  doc["avty_t"] = "LilygoTSIM1/status";
  doc["uniq_id"] = "beacon_key_rssi";
  JsonObject dev = doc.createNestedObject("dev");
  dev["ids"] = "08b61f3b931a";
  dev["name"] = "lilygo_tsim1";
  dev["sw"] = "benson v2023.12.11";
  dev["mdl"] = "lilygo_tsim7600";
  dev["mf"] = "lilygo";
  dev["sa"] = "";
  // Serialize JSON document to a string
  String jsonString;
  jsonString = "";
  serializeJson(doc, jsonString);
  // Publish the JSON string to the MQTT topic
  client.publish("homeassistant/sensor/LiygoTSIM1/beaconrssi/config", jsonString.c_str(), true);
}




MQTT订阅主题处理
  // 处理LOCK状态的主题
  if (strcmp(topic, topicLockcommand) == 0) {
    if (payload[0] == 'L') {
      digitalWrite(S2_PIN, HIGH);
      client.publish(topicLockstate, "LOCKED", true);
      delay(500);
      digitalWrite(S2_PIN, LOW);
      carlocked = true;
    } else if (payload[0] == 'U') {
      digitalWrite(S1_PIN, HIGH);
      client.publish(topicLockstate, "UNLOCKED", true);
      delay(500);
      digitalWrite(S1_PIN, LOW);
      carlocked = false;
    }
  }




GPS处理(这是我编写的第一个难点,搞了好久,不过经历这个后,弄懂了GPS NVME的好多规则)


void handleGPS() {
  delay(100);
  //static String currentLine = "";
  while (SerialAT.available() > 0) {
    gps.encode(SerialAT.read());
  }
  if (millis() - gpslastUploadTime >= 5000) {
    gpslastUploadTime = millis();
    if (gps.location.isValid()) {
      DynamicJsonDocument doc(1024);
      // Add data to the JSON document
      doc["satellites"] = gps.satellites.value();
      doc["gps_accuracy"] = gps.hdop.hdop();
      doc["latitude"] = formatFloat(gps.location.lat(), 6);
      doc["longitude"] = formatFloat(gps.location.lng(), 6);
      doc["altitude"] = formatFloat(gps.altitude.meters(), 0);
      doc["course"] = formatFloat(gps.course.deg(), 0);
      doc["speed"] = formatFloat(gps.speed.kmph(), 0);
      // Serialize JSON document to a string
      String jsonString;
      jsonString = "";
      serializeJson(doc, jsonString);
      // Publish the JSON string to the MQTT topic
      client.publish(topicGPS, jsonString.c_str(), true);
    } else {
      Serial.println("GPS未准备好");
      client.publish("LilygoTSIM1/gps_location/staus", "GPS Not Ready");
    }
  }
}





BLE代码,也是难点

  //BLE设置及服务
  NimBLEDevice::setPower(ESP_PWR_LVL_P9);
  NimBLEDevice::init("Lilygo_BLE");  // 初始化 BLE 设备
  NimBLEDevice::setSecurityAuth(true, true, true);
  NimBLEDevice::setSecurityPasskey(xxxxx); //BLE连接配对密码
  NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY);
  NimBLEServer* pServer = NimBLEDevice::createServer();
  NimBLEService* pService = pServer->createService(SERVICE_UUID);
  NimBLECharacteristic *pCharacteristic = pService->createCharacteristic(
    CHARACTERISTIC_UUID,
    NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN);
  pCharacteristic->setCallbacks(new MyCharacteristicCallbacks());
  pService->start();
  NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(pService->getUUID());
  pAdvertising->start();
  //BeaconScan设置
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(150);
  pBLEScan->setWindow(80); // less or equal setInterval value





-----------------

好了,先写到这吧,欢迎有兴趣的朋友多多交流








作者: Ari    时间: 2024-1-9 13:16
先顶再看,非常有兴趣
作者: 嘻嘻    时间: 2024-1-9 13:47
先顶后看 感觉以后会用得到
作者: xuyang    时间: 2024-1-9 16:33
esphome能支持SIM7600,就好了。
作者: bugensui    时间: 2024-1-9 17:46
太硬核 了。玩不了
作者: shenbo    时间: 2024-1-9 19:54
xuyang 发表于 2024-1-9 16:33
esphome能支持SIM7600,就好了。

我也很纳闷为什么ESPHOME不支持Modem通过GRPS连接MQTT,通过这次开发,我感觉按理说不难呀。其实C的编写逻辑也还好,可是试试。
作者: godzqh    时间: 2024-1-9 21:24
要是有人能画个板子做小巧一点就好了
作者: nbxzl    时间: 2024-1-9 22:14
本帖最后由 nbxzl 于 2024-1-9 22:18 编辑

A9G开发板具备基础的 电话/短信,GPRS联网通信,GPS/BDS双模定位功能。

•A9G开发板板载了锂电池充电管理、麦克风、扬声器接口、USB通信接口、多个用户按键/led、TF卡槽、SPI接口、I2C2接口、ADC接口。

•A9G开发板投币机扩展板,可外接传统投币机。

•使用GSM以及麦克风/扬声器的远程监听对讲器

•使用GPRS/GSM+GPS,1.54寸电容式触摸屏的智能手表

•使用GPRS/GSM+GPS,心率血氧传感器,1.54寸电容式触摸屏的老年人监护手表

•使用GPRS+TF+摄像头扩展板的远程监控摄像头

•使用投币机扩展板的微信支付投币机方案


https://item.taobao.com/item.htm ... 33197&_u=9m5db6a8b9
ő














GSM/GPRS+GPS/BDS模块A9G开发板 无线数据传输+定位 仅支持移动卡
举报





配送河南洛阳 至 浙江宁波鄞州区
快递 ¥6.00

现货,付款后48小时内发货




颜色分类数量
[url=]ƛ[/url]
[url=]ƚ[/url]
[url=]立即购买[/url]

[url=]ŭ加入购物车[/url]




承诺






作者: wangmucha    时间: 2024-1-10 01:42
想特别请教下你ina219是具体怎么接线的,特别是电瓶那端,和电瓶需要串入啥那,直接接两极会烧了吧
作者: zkxa    时间: 2024-1-10 10:36
可以做成ESPHOME插件吧。
作者: shenbo    时间: 2024-1-10 11:33
wangmucha 发表于 2024-1-10 01:42
想特别请教下你ina219是具体怎么接线的,特别是电瓶那端,和电瓶需要串入啥那,直接接两极会烧了吧 ...

INA219需要同时链接工作电路和测量电路,INA219需要串联到整个测量电路里,你把电瓶正极接入INA219的IN+,INA219的IN-出线,接到你的设备V+(注意汽车电瓶是12v的,如果是要接5v设备,要变压)测量电路的负极正常链接。INA219的工作电路和普通模块没差,正常链接就行。
作者: syhzjnbxs    时间: 2024-1-10 15:16
蓝牙ble具体代码能分享一下么?最近也想入手xy-mbf12这个模块

作者: shenbo    时间: 2024-1-10 18:18
本帖最后由 shenbo 于 2024-1-10 18:21 编辑
syhzjnbxs 发表于 2024-1-10 15:16
蓝牙ble具体代码能分享一下么?最近也想入手xy-mbf12这个模块
我关于BLE的部分实际上是两个设备,一个是ESP32本身,另一个是前面帖子里提到额外买的一个BLE控制器,下面的代码都是针对ESP32本身的BLE服务,实际上就是建立一个BLE Server,一个Scan,Server为了没有GRPS的时候,自己手机连接后解锁,Scan为了建立一把Beacon钥匙,洗车的时候用。

代码小白,所以代码可能比较累赘。欢迎提意见。

  1. //BLE相关库
  2. #include <NimBLEDevice.h>
  3. #include <NimBLEAdvertisedDevice.h>



  4. // 定义BLE服务UUID和特征UUID
  5. #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
  6. #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"


  7. //库函数定义
  8. BLEServer *pServer;
  9. BLEService *pService;
  10. BLECharacteristic *pCharacteristic;
  11. BLEScan *pBLEScan;




  12. //BLE输入指令回调函数,处理BLE指令
  13. class MyCharacteristicCallbacks : public NimBLECharacteristicCallbacks {
  14.   void onWrite(NimBLECharacteristic *pCharacteristic) {
  15.     std::string value = pCharacteristic->getValue();
  16.     // 在这里处理收到的数据,根据需要调整引脚电平
  17.     if (value == "LOCK") {
  18.       digitalWrite(S2_PIN, HIGH);
  19.       client.publish(topicLockstate, "XXXXX", true);
  20.       client.publish(topicSwitch2state, "ON", true);
  21.       delay(500);
  22.       digitalWrite(S2_PIN, LOW);
  23.       client.publish(topicSwitch2state, "OFF", true);
  24.     }
  25.     else if (value == "UNLOCK") {
  26.       digitalWrite(S1_PIN, HIGH);
  27.       client.publish(topicLockstate, "XXXXX", true);
  28.       client.publish(topicSwitch1state, "ON", true);
  29.       delay(500);
  30.       digitalWrite(S1_PIN, LOW);
  31.       client.publish(topicSwitch1state, "OFF", true);
  32.     }
  33.     else if (value == "XXXXX") {
  34.       digitalWrite(S4_PIN, LOW);
  35.       client.publish(topicSwitch4state, "OFF", true);
  36.     }
  37.   }
  38. };

  39. //BeaconScan回调函数,处理BeaconScan结果
  40. class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
  41.   void onResult(BLEAdvertisedDevice *advertisedDevice) {
  42.     // 获取设备的UUID
  43.     std::string deviceMAC = advertisedDevice->getAddress().toString();
  44.     if (deviceMAC == "XXXXXXXXXXXX") {
  45.       foundbeacon = true;
  46.       // 获取设备的RSSI值
  47.       beaconrssi = advertisedDevice->getRSSI();
  48.     }
  49.   }
  50. };



  51. void setup() {

  52.   //BLE设置及服务
  53.   NimBLEDevice::setPower(ESP_PWR_LVL_P9);
  54.   NimBLEDevice::init("Lilygo_BLE");  // 初始化 BLE 设备
  55.   NimBLEDevice::setSecurityAuth(true, true, true);
  56.   NimBLEDevice::setSecurityPasskey(104707); //BLE连接配对密码
  57.   NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY);
  58.   NimBLEServer* pServer = NimBLEDevice::createServer();
  59.   NimBLEService* pService = pServer->createService(SERVICE_UUID);
  60.   NimBLECharacteristic *pCharacteristic = pService->createCharacteristic(
  61.     CHARACTERISTIC_UUID,
  62.     NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN);
  63.   pCharacteristic->setCallbacks(new MyCharacteristicCallbacks());
  64.   pService->start();
  65.   NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
  66.   pAdvertising->addServiceUUID(pService->getUUID());
  67.   pAdvertising->start();
  68.   //BeaconScan设置
  69.   pBLEScan = BLEDevice::getScan(); //create new scan
  70.   pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  71.   pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  72.   pBLEScan->setInterval(150);
  73.   pBLEScan->setWindow(80); // less or equal setInterval value

  74. void loop() {

  75.   //Beacon Key
  76.   if (beaconkey == true){
  77.   handlebeaconkey();
  78.   }

  79. }

  80. //功能函数定义-------------------------------------------------------------


  81. //Beaconkey解锁车
  82. void handlebeaconkey() {
  83.   BLEDevice::getScan()->start(2, false);
  84.   client.publish("LilygoTSIM1/beacon_rssi", String(beaconrssi).c_str(), true);
  85.   if (carlocked == false) {
  86.     if (foundbeacon & beaconrssi <= -90) {
  87.       digitalWrite(S2_PIN, HIGH);
  88.       client.publish(topicLockstate, "LOCKED", true);
  89.       client.publish(topicSwitch2state, "ON", true);
  90.       delay(500);
  91.       digitalWrite(S2_PIN, LOW);
  92.       client.publish(topicSwitch2state, "OFF", true);
  93.       delay(100);
  94.       carlocked = true;
  95.     }
  96.   } else {
  97.     if (foundbeacon & beaconrssi >= -75) {
  98.       digitalWrite(S1_PIN, HIGH);
  99.       client.publish(topicLockstate, "UNLOCKED", true);
  100.       client.publish(topicSwitch1state, "ON", true);
  101.       delay(500);
  102.       digitalWrite(S1_PIN, LOW);
  103.       client.publish(topicSwitch1state, "OFF", true);
  104.       delay(100);
  105.       carlocked = false;
  106.     }
  107.   }
复制代码



作者: shenbo    时间: 2024-1-10 18:32
syhzjnbxs 发表于 2024-1-10 15:16
蓝牙ble具体代码能分享一下么?最近也想入手xy-mbf12这个模块

不好意思,错了,你要的是额外的那个模块,那个模块其实自己的独立性很高,实际上可以完全独立开关车辆,不需要ESP32,也不需要GRPS,只是不能反抗到HA中。我用xy-mbf12主要是解决蓝牙唤醒ESP32和配对iphone后通过RSSI解锁车辆的问题,ESP32自己的BLE服务器,配对iPhone比较困难,iphone的BLE广播有自己的特征,我之前有个帖子,你可以看一下。xy-mbf12配对iPhone的系统蓝牙很方便。

代码给你参考,有点绕,逻辑上是通过ESP32读取xy-mbf12的串口数据和引脚信息。
欢迎交流

  1. //定义连接xy-mbf12的串口

  2. #define SerialBT Serial2

  3. void setup() {
  4.   SerialBT.begin(9600, SERIAL_8N1, 13, 15);
  5. }




  6. void loop() {

  7.   // 如果没有开Nosleep开关,检查震动&BLE传感器计时器是否超时,超时进入深度睡眠
  8.   int sensorState = digitalRead(sensorPin);
  9.   if (nosleep == false) {
  10.     if (sensorState == HIGH) {
  11.       // 传感器为HIGH状态,不进行计时
  12.       startTime = 0;
  13.     } else {
  14.       // 传感器为LOW状态
  15.       if (startTime == 0) {
  16.         // 计时开始
  17.         startTime = millis();
  18.       } else {
  19.         // 检查是否超过1小时
  20.         unsigned long elapsedTime = millis() - startTime;
  21.         if (elapsedTime >= timeout) {
  22.           // 触发动作
  23.           modem.sendSMS(SMS_TARGET, "No vibration over 30mins, Lilygo Will Sleep");
  24.           Serial.println("Entering Deep Sleep");
  25.           Serial.println("STOP WatchDOG");
  26.           esp_task_wdt_delete(NULL);
  27.           delay(1000);
  28.           client.publish("LilygoTSIM1/deepsleep/notice", "No vibration over 60mins, Lilygo Will Sleep", true);
  29.           delay(500);
  30.           client.publish(topicInit, "offline", true);
  31.           modem.sendAT("+CGPSINFOCFG=0,31");
  32.           modem.waitResponse(30000);
  33.           modem.sendAT("+CGPS=0");
  34.           modem.waitResponse(30000);
  35.           delay(3000);
  36.           modem.sleepEnable();
  37.           delay(10000);
  38.           esp_sleep_enable_ext0_wakeup((gpio_num_t)sensorPin, HIGH);  // DeepSleep后,sensorPin 高电平唤醒
  39.           delay(1000);
  40.           esp_deep_sleep_start();
  41.         }
  42.       }
  43.     }
  44.   }


  45.   //震动&BLE传感器数据上报
  46.   if (sensorState != previoussensorState) {
  47.     previoussensorState = sensorState;
  48.     if (sensorState == HIGH) {
  49.     client.publish("LilygoTSIM1/shocksensor", "ON");
  50.     } else {
  51.     client.publish("LilygoTSIM1/shocksensor", "OFF");
  52.     }
  53.   }
  54.   //读取BLE设备RSSI
  55.   BLErssi();
  56.   //BLE Key
  57.   if (blekey == true){
  58.   handleblekey();
  59.   }
  60. }



  61. void handleblekey() {
  62.   //将字符串值转为INT,否则无法负数比大小
  63.   int rssiValue_int = rssiValue.toInt();
  64.   int lockrssi_int = lockrssi.toInt();
  65.   int unlockrssi_int = unlockrssi.toInt();
  66.   if (carlocked == false) {
  67.     if (rssiValue_int <= lockrssi_int) {
  68.       digitalWrite(S2_PIN, HIGH);
  69.       client.publish(topicLockstate, "LOCKED", true);
  70.       client.publish(topicSwitch2state, "ON", true);
  71.       delay(500);
  72.       digitalWrite(S2_PIN, LOW);
  73.       client.publish(topicSwitch2state, "OFF", true);
  74.       delay(100);
  75.       carlocked = true;
  76.     }
  77.   } else {
  78.     if (rssiValue_int >= unlockrssi_int) {
  79.       digitalWrite(S1_PIN, HIGH);
  80.       client.publish(topicLockstate, "UNLOCKED", true);
  81.       client.publish(topicSwitch1state, "ON", true);
  82.       delay(500);
  83.       digitalWrite(S1_PIN, LOW);
  84.       client.publish(topicSwitch1state, "OFF", true);
  85.       delay(100);
  86.       carlocked = false;
  87.     }
  88.   }
  89. }


  90. //读取BLE连接设备的RSSI
  91. void BLErssi() {
  92.   int sensorState = digitalRead(sensorPin);
  93.   if (sensorState == HIGH) {
  94.     SerialBT.println("AT+RSSI?");
  95.     while (SerialBT.available()) {
  96.       // 读取串口缓冲区中的数据
  97.       String receivedData = SerialBT.readStringUntil('\n');
  98.       int rssiIndex = receivedData.indexOf("+RSSI:");
  99.       if (rssiIndex != -1) {
  100.         rssiValue = receivedData.substring(rssiIndex + 6);
  101.         //rssiValue.trim();  // 去除可能的空格或换行符
  102.         //int extractedRSSI = rssiValue.toInt();
  103.         if (millis() - blerssilastUploadTime >= 500) {
  104.           blerssilastUploadTime = millis();
  105.           client.publish("LilygoTSIM1/ble_rssi", rssiValue.c_str());
  106.         }
  107.       } else {
  108.         if (millis() - blerssilastUploadTime >= 5000) {
  109.           blerssilastUploadTime = millis();
  110.           client.publish("LilygoTSIM1/ble_rssi", "-99");
  111.         }
  112.       }
  113.     }
  114.   } else {
  115.     if (millis() - blerssilastUploadTime >= 5000) {
  116.       blerssilastUploadTime = millis();
  117.       client.publish("LilygoTSIM1/ble_rssi", "-99");
  118.     }
  119.   }
  120. }
复制代码

作者: wangmucha    时间: 2024-1-10 22:18
shenbo 发表于 2024-1-10 11:33
INA219需要同时链接工作电路和测量电路,INA219需要串联到整个测量电路里,你把电瓶正极接入INA219的IN+, ...

请求指导了,我就是把ina219串到电路中,可是就是无法识别,无论刷esphome或者tasmota都读不到数据,能否私信个qq讨教下,怕我买的模块坏的,我重装买了个居然还是不行,目前卡这边了,不知道哪个地方错了
作者: shenbo    时间: 2024-1-10 22:33
本帖最后由 shenbo 于 2024-1-10 22:38 编辑
wangmucha 发表于 2024-1-10 22:18
请求指导了,我就是把ina219串到电路中,可是就是无法识别,无论刷esphome或者tasmota都读不到数据,能否 ...

qq:1189821. 之前用的ESPHOME配置

  1. i2c:
  2.   - id: bus_a         
  3.     sda: GPIO21
  4.     scl: GPIO22
  5.     frequency: 800kHz
  6.     scan: true


  7. sensor:
  8.   - platform: ina219
  9.     address: 0x40
  10.     shunt_resistance: 0.1 ohm
  11.     current:
  12.       name: "INA219 Current"
  13.     power:
  14.       name: "INA219 Power"
  15.     bus_voltage:
  16.       name: "INA219 Bus Voltage"
  17.     shunt_voltage:
  18.       name: "INA219 Shunt Voltage"
  19.     max_voltage: 32.0V
  20.     max_current: 3.2A
  21.     update_interval: 60s
复制代码


作者: loog    时间: 2024-1-15 08:16
本帖最后由 loog 于 2024-1-15 08:23 编辑

一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面还耗电4G模块MQTT直接推送GPS不用买什么GPS模块

[attach]55235[/attach]

[attach]55233[/attach]
[attach]55234[/attach]




作者: shenbo    时间: 2024-1-15 10:43
loog 发表于 2024-1-15 08:16
一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面 ...

学习了,我用ESP32主要是为了接入HA还有做一些本地控制
作者: zkxa    时间: 2024-1-16 10:51
loog 发表于 2024-1-15 08:16
一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面 ...

这个是啥APP呢。
作者: syhzjnbxs    时间: 2024-1-18 13:16
shenbo 发表于 2024-1-10 18:18
我关于BLE的部分实际上是两个设备,一个是ESP32本身,另一个是前面帖子里提到额外买的一个BLE控制器,下面 ...

感谢楼主的分享,代码对我的帮助很大,最近刚上手学习ardunio。

有个问题再请教一下,安卓手机连接您分享代码中建立的BLE服务端,安卓手机配对连接后,在esp32中有办法得到安卓手机的蓝牙rssi值么?

作者: kittyme    时间: 2024-1-18 14:22
感谢楼主分享,刚好我也碰到一个相似的难题,就是想接入hass远程监控车辆电瓶的电压(经常不挪车防止电瓶亏电),也是用的ina219模块,就是车子停在小区停车位,通过传统的WiFi连接,距离太远,所以入手了lora透传模块,走的433mhz信道。目前硬件采购回来了,就是不知道如何下手。
作者: shenbo    时间: 2024-1-20 09:21
本帖最后由 shenbo 于 2024-1-20 09:22 编辑
syhzjnbxs 发表于 2024-1-18 13:16
感谢楼主的分享,代码对我的帮助很大,最近刚上手学习ardunio。

有个问题再请教一下,安卓手机连接您分 ...

ESP32连接的BLE直接用nimble库函数获取就行,直接的多,广播数据里就有,我这个通过mac地址过滤一下
  1. //BeaconScan回调函数,处理BeaconScan结果
  2. class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
  3.   void onResult(BLEAdvertisedDevice *advertisedDevice) {
  4.     // 获取设备的UUID
  5.     std::string deviceMAC = advertisedDevice->getAddress().toString();
  6.     if (deviceMAC == "XX:xx:xx:xx:xx:xx") {
  7.       foundbeacon = true;
  8.       // 获取设备的RSSI值
  9.       beaconrssi = advertisedDevice->getRSSI();
  10.     }
  11.   }
  12. };
复制代码

作者: shenbo    时间: 2024-1-20 09:26
kittyme 发表于 2024-1-18 14:22
感谢楼主分享,刚好我也碰到一个相似的难题,就是想接入hass远程监控车辆电瓶的电压(经常不挪车防止电瓶亏 ...

lora没接触过,但是逻辑上应该是lora客户端连接esp32的串口,服务端连接你的上位机或着pc什么的。工作流程应该是上位机----lora服务端----lora客户端----ESP32,通过之间建立的透传通道,用串口获取客户端ESP32的数据。等我我也研究一下这个东西,感觉可以做点啥。哈哈
作者: kittyme    时间: 2024-1-20 13:47
本帖最后由 kittyme 于 2024-1-20 13:55 编辑
shenbo 发表于 2024-1-20 09:26
lora没接触过,但是逻辑上应该是lora客户端连接esp32的串口,服务端连接你的上位机或着pc什么的。工作流 ...



楼主可以试试TB上买9.9包邮的初学者套餐(lora模块两个+ch340模块一套),我用两个账号买了两套回来。店铺名称叫深联智达,(有的时候会缺货,可以提交申请叫卖家补货。)

                               
登录/注册后可看大图



作者: syhzjnbxs    时间: 2024-1-20 16:45
shenbo 发表于 2024-1-20 09:21
ESP32连接的BLE直接用nimble库函数获取就行,直接的多,广播数据里就有,我这个通过mac地址过滤一下
...

这个需要定义blescan,扫描获得吧?而且手机上面不用app开启ble广播的话,blescan是扫描不到手机的蓝牙信号的吧?
作者: 积积阳阳德    时间: 2024-1-20 22:44
插眼标记

作者: yihaotong    时间: 2024-1-21 11:24
真厉害,学习了
作者: shenbo    时间: 2024-1-21 13:43
本帖最后由 shenbo 于 2024-1-21 13:45 编辑
syhzjnbxs 发表于 2024-1-20 16:45
这个需要定义blescan,扫描获得吧?而且手机上面不用app开启ble广播的话,blescan是扫描不到手机的蓝牙信 ...

我也是小白来的。我的经验是ble的service有scan、server之分,你可以通过scan获得其他ble设备的信息(UUID、MAC、RSSI)等来控制ESP32作出动作,也可以用其他BLE设备连接esp32的BLE Server,让后给出指令控制ESP32的动作,你要用手机的RSSI来控制ESP32,应该是前者,我是用一个Beacon小设备来模拟BLE钥匙,给洗车或代客用。我同意你的观点,当然理论上我觉得ESP32作为BLE Server的时候,获取客户端的RSSI也应该不是难事,应该有函数能获取,你可以查一下NimBLE的文档
作者: syhzjnbxs    时间: 2024-1-21 21:11
shenbo 发表于 2024-1-21 13:43
我也是小白来的。我的经验是ble的service有scan、server之分,你可以通过scan获得其他ble设备的信息(UUID ...

谢谢您的回复,本来想直接买个xy-mbf12模块来用的,这几天学习了一下arduino的esp32开发,觉得可以直接用esp32来完成xy-mbf12这个蓝牙接近开关的功能,这两天有了近一步的进展,接下来就是wifi和mqtt的代码了,到时有需要的话还需要您的帮助,谢谢
作者: zkxa    时间: 2024-7-18 11:03
只想弄个车内温度,通过4G到HA。有啥好方法么。
作者: jjcs    时间: 2024-7-18 11:49
zkxa 发表于 2024-7-18 11:03
只想弄个车内温度,通过4G到HA。有啥好方法么。

必须是合宙的模块最方便
作者: zkxa    时间: 2024-7-18 14:01
jjcs 发表于 2024-7-18 11:49
必须是合宙的模块最方便

这个不支持ESPHOME吧。
作者: jjcs    时间: 2024-7-18 17:40
zkxa 发表于 2024-7-18 14:01
这个不支持ESPHOME吧。

为啥一定要支持esphome,mqtt是物联网最广泛的协议,那不成你这个也要所谓的本地化?
作者: zeze247    时间: 2024-7-21 01:37
ESPHOME 能不能通过合宇的AIR724UG,4G传输 传感器数据到HA?
作者: shenbo    时间: 2024-7-30 11:28
zeze247 发表于 2024-7-21 01:37
ESPHOME 能不能通过合宇的AIR724UG,4G传输 传感器数据到HA?

ESPHOME目前只能调用通讯模块收发短信或者接拨电话,不支持用GPRS连接方式替代Wifi,如果要让EPS32通过GPRS通讯,只能学c,通过Aruiono IDE之类的工具开发
作者: jjcs    时间: 2024-7-30 12:44
zeze247 发表于 2024-7-21 01:37
ESPHOME 能不能通过合宇的AIR724UG,4G传输 传感器数据到HA?

合宙的本来就是4g模块,要什么esphome
作者: he674963336    时间: 2024-8-3 17:11
厉害            
作者: kaka0992    时间: 2024-8-3 21:26
loog 发表于 2024-1-15 08:16
一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面 ...

大佬这种咋搞 有没有教程学习
作者: zongyuxian    时间: 2024-11-14 00:03
坐等大佬开发银尔达的DTU固件4g模块air780E的esp32代码上传AHT10温湿度模块数据到mqtt服务器?




欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.5