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

 找回密码
 立即注册
楼主: shenbo

[技术探讨] ESP32+SIM7600,使用GRPS接入MQTT,通过HomeAssistan控制车辆锁 GPS等

  [复制链接]

6

主题

75

帖子

673

积分

高级会员

Rank: 4

积分
673
金钱
598
HASS币
10
 楼主| 发表于 2024-1-10 11:33:47 | 显示全部楼层
wangmucha 发表于 2024-1-10 01:42
想特别请教下你ina219是具体怎么接线的,特别是电瓶那端,和电瓶需要串入啥那,直接接两极会烧了吧 ...

INA219需要同时链接工作电路和测量电路,INA219需要串联到整个测量电路里,你把电瓶正极接入INA219的IN+,INA219的IN-出线,接到你的设备V+(注意汽车电瓶是12v的,如果是要接5v设备,要变压)测量电路的负极正常链接。INA219的工作电路和普通模块没差,正常链接就行。
回复

使用道具 举报

8

主题

78

帖子

706

积分

高级会员

Rank: 4

积分
706
金钱
628
HASS币
0
发表于 2024-1-10 15:16:00 | 显示全部楼层
蓝牙ble具体代码能分享一下么?最近也想入手xy-mbf12这个模块
回复

使用道具 举报

6

主题

75

帖子

673

积分

高级会员

Rank: 4

积分
673
金钱
598
HASS币
10
 楼主| 发表于 2024-1-10 18:18:47 | 显示全部楼层
本帖最后由 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钥匙,洗车的时候用。

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

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



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


//库函数定义
BLEServer *pServer;
BLEService *pService;
BLECharacteristic *pCharacteristic;
BLEScan *pBLEScan;




//BLE输入指令回调函数,处理BLE指令
class MyCharacteristicCallbacks : public NimBLECharacteristicCallbacks {
  void onWrite(NimBLECharacteristic *pCharacteristic) {
    std::string value = pCharacteristic->getValue();
    // 在这里处理收到的数据,根据需要调整引脚电平
    if (value == "LOCK") {
      digitalWrite(S2_PIN, HIGH);
      client.publish(topicLockstate, "XXXXX", true);
      client.publish(topicSwitch2state, "ON", true);
      delay(500);
      digitalWrite(S2_PIN, LOW);
      client.publish(topicSwitch2state, "OFF", true);
    }
    else if (value == "UNLOCK") {
      digitalWrite(S1_PIN, HIGH);
      client.publish(topicLockstate, "XXXXX", true);
      client.publish(topicSwitch1state, "ON", true);
      delay(500);
      digitalWrite(S1_PIN, LOW);
      client.publish(topicSwitch1state, "OFF", true);
    }
    else if (value == "XXXXX") {
      digitalWrite(S4_PIN, LOW);
      client.publish(topicSwitch4state, "OFF", true);
    }
  }
};

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



void setup() {

  //BLE设置及服务
  NimBLEDevice::setPower(ESP_PWR_LVL_P9); 
  NimBLEDevice::init("Lilygo_BLE");  // 初始化 BLE 设备
  NimBLEDevice::setSecurityAuth(true, true, true); 
  NimBLEDevice::setSecurityPasskey(104707); //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

void loop() {

  //Beacon Key
  if (beaconkey == true){
  handlebeaconkey();
  }

}

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


//Beaconkey解锁车
void handlebeaconkey() {
  BLEDevice::getScan()->start(2, false);
  client.publish("LilygoTSIM1/beacon_rssi", String(beaconrssi).c_str(), true);
  if (carlocked == false) {
    if (foundbeacon & beaconrssi <= -90) {
      digitalWrite(S2_PIN, HIGH);
      client.publish(topicLockstate, "LOCKED", true);
      client.publish(topicSwitch2state, "ON", true);
      delay(500);
      digitalWrite(S2_PIN, LOW);
      client.publish(topicSwitch2state, "OFF", true);
      delay(100);
      carlocked = true;
    }
  } else {
    if (foundbeacon & beaconrssi >= -75) {
      digitalWrite(S1_PIN, HIGH);
      client.publish(topicLockstate, "UNLOCKED", true);
      client.publish(topicSwitch1state, "ON", true);
      delay(500);
      digitalWrite(S1_PIN, LOW);
      client.publish(topicSwitch1state, "OFF", true);
      delay(100);
      carlocked = false;
    }
  }


回复

使用道具 举报

6

主题

75

帖子

673

积分

高级会员

Rank: 4

积分
673
金钱
598
HASS币
10
 楼主| 发表于 2024-1-10 18:32:54 | 显示全部楼层
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的串口数据和引脚信息。
欢迎交流

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

#define SerialBT Serial2

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




void loop() {

  // 如果没有开Nosleep开关,检查震动&BLE传感器计时器是否超时,超时进入深度睡眠
  int sensorState = digitalRead(sensorPin);
  if (nosleep == false) {
    if (sensorState == HIGH) {
      // 传感器为HIGH状态,不进行计时
      startTime = 0;
    } else {
      // 传感器为LOW状态
      if (startTime == 0) {
        // 计时开始
        startTime = millis();
      } else {
        // 检查是否超过1小时
        unsigned long elapsedTime = millis() - startTime;
        if (elapsedTime >= timeout) {
          // 触发动作
          modem.sendSMS(SMS_TARGET, "No vibration over 30mins, Lilygo Will Sleep");
          Serial.println("Entering Deep Sleep");
          Serial.println("STOP WatchDOG");
          esp_task_wdt_delete(NULL);
          delay(1000);
          client.publish("LilygoTSIM1/deepsleep/notice", "No vibration over 60mins, Lilygo Will Sleep", true);
          delay(500);
          client.publish(topicInit, "offline", true);
          modem.sendAT("+CGPSINFOCFG=0,31");
          modem.waitResponse(30000);
          modem.sendAT("+CGPS=0");
          modem.waitResponse(30000);
          delay(3000);
          modem.sleepEnable();
          delay(10000);
          esp_sleep_enable_ext0_wakeup((gpio_num_t)sensorPin, HIGH);  // DeepSleep后,sensorPin 高电平唤醒
          delay(1000);
          esp_deep_sleep_start();
        }
      }
    }
  }


  //震动&BLE传感器数据上报
  if (sensorState != previoussensorState) {
    previoussensorState = sensorState;
    if (sensorState == HIGH) {
    client.publish("LilygoTSIM1/shocksensor", "ON");
    } else {
    client.publish("LilygoTSIM1/shocksensor", "OFF");
    }
  }
  //读取BLE设备RSSI
  BLErssi();
  //BLE Key
  if (blekey == true){
  handleblekey();
  }
}



void handleblekey() {
  //将字符串值转为INT,否则无法负数比大小
  int rssiValue_int = rssiValue.toInt();
  int lockrssi_int = lockrssi.toInt();
  int unlockrssi_int = unlockrssi.toInt();
  if (carlocked == false) {
    if (rssiValue_int <= lockrssi_int) {
      digitalWrite(S2_PIN, HIGH);
      client.publish(topicLockstate, "LOCKED", true);
      client.publish(topicSwitch2state, "ON", true);
      delay(500);
      digitalWrite(S2_PIN, LOW);
      client.publish(topicSwitch2state, "OFF", true);
      delay(100);
      carlocked = true;
    }
  } else {
    if (rssiValue_int >= unlockrssi_int) {
      digitalWrite(S1_PIN, HIGH);
      client.publish(topicLockstate, "UNLOCKED", true);
      client.publish(topicSwitch1state, "ON", true);
      delay(500);
      digitalWrite(S1_PIN, LOW);
      client.publish(topicSwitch1state, "OFF", true);
      delay(100);
      carlocked = false;
    }
  }
}


//读取BLE连接设备的RSSI
void BLErssi() {
  int sensorState = digitalRead(sensorPin);
  if (sensorState == HIGH) {
    SerialBT.println("AT+RSSI?");
    while (SerialBT.available()) {
      // 读取串口缓冲区中的数据
      String receivedData = SerialBT.readStringUntil('\n');
      int rssiIndex = receivedData.indexOf("+RSSI:");
      if (rssiIndex != -1) {
        rssiValue = receivedData.substring(rssiIndex + 6);
        //rssiValue.trim();  // 去除可能的空格或换行符
        //int extractedRSSI = rssiValue.toInt();
        if (millis() - blerssilastUploadTime >= 500) {
          blerssilastUploadTime = millis();
          client.publish("LilygoTSIM1/ble_rssi", rssiValue.c_str());
        }
      } else {
        if (millis() - blerssilastUploadTime >= 5000) {
          blerssilastUploadTime = millis();
          client.publish("LilygoTSIM1/ble_rssi", "-99");
        }
      }
    }
  } else {
    if (millis() - blerssilastUploadTime >= 5000) {
      blerssilastUploadTime = millis();
      client.publish("LilygoTSIM1/ble_rssi", "-99");
    }
  }
}
回复

使用道具 举报

45

主题

638

帖子

3813

积分

论坛元老

Rank: 8Rank: 8

积分
3813
金钱
3175
HASS币
0
发表于 2024-1-10 22:18:37 | 显示全部楼层
shenbo 发表于 2024-1-10 11:33
INA219需要同时链接工作电路和测量电路,INA219需要串联到整个测量电路里,你把电瓶正极接入INA219的IN+, ...

请求指导了,我就是把ina219串到电路中,可是就是无法识别,无论刷esphome或者tasmota都读不到数据,能否私信个qq讨教下,怕我买的模块坏的,我重装买了个居然还是不行,目前卡这边了,不知道哪个地方错了
回复

使用道具 举报

6

主题

75

帖子

673

积分

高级会员

Rank: 4

积分
673
金钱
598
HASS币
10
 楼主| 发表于 2024-1-10 22:33:33 | 显示全部楼层
本帖最后由 shenbo 于 2024-1-10 22:38 编辑
wangmucha 发表于 2024-1-10 22:18
请求指导了,我就是把ina219串到电路中,可是就是无法识别,无论刷esphome或者tasmota都读不到数据,能否 ...

qq:1189821. 之前用的ESPHOME配置

i2c:
  - id: bus_a         
    sda: GPIO21
    scl: GPIO22
    frequency: 800kHz
    scan: true


sensor:
  - platform: ina219
    address: 0x40
    shunt_resistance: 0.1 ohm
    current:
      name: "INA219 Current"
    power:
      name: "INA219 Power"
    bus_voltage:
      name: "INA219 Bus Voltage"
    shunt_voltage:
      name: "INA219 Shunt Voltage"
    max_voltage: 32.0V
    max_current: 3.2A
    update_interval: 60s

回复

使用道具 举报

26

主题

170

帖子

1026

积分

论坛技术达人

积分
1026
金钱
856
HASS币
20
发表于 2024-1-15 08:16:23 | 显示全部楼层
本帖最后由 loog 于 2024-1-15 08:23 编辑

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

QQ截图20240115082258.png

IMG_1744.jpg
QQ截图20240115082056.png



评分

参与人数 1金钱 +12 收起 理由
jjcs + 12 这才是正确的方法

查看全部评分

回复

使用道具 举报

6

主题

75

帖子

673

积分

高级会员

Rank: 4

积分
673
金钱
598
HASS币
10
 楼主| 发表于 2024-1-15 10:43:24 | 显示全部楼层
loog 发表于 2024-1-15 08:16
一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面 ...

学习了,我用ESP32主要是为了接入HA还有做一些本地控制
回复

使用道具 举报

5

主题

272

帖子

2017

积分

金牌会员

Rank: 6Rank: 6

积分
2017
金钱
1745
HASS币
0
发表于 2024-1-16 10:51:34 | 显示全部楼层
loog 发表于 2024-1-15 08:16
一个合宙4G模块28块钱搞定+个蓝牙模块13你搞这么复杂,ESP32还耗电,4G模块可以直接MQTT通讯,ESP放在里面 ...

这个是啥APP呢。
回复

使用道具 举报

8

主题

78

帖子

706

积分

高级会员

Rank: 4

积分
706
金钱
628
HASS币
0
发表于 2024-1-18 13:16:39 | 显示全部楼层
shenbo 发表于 2024-1-10 18:18
我关于BLE的部分实际上是两个设备,一个是ESP32本身,另一个是前面帖子里提到额外买的一个BLE控制器,下面 ...

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 21:29 , Processed in 1.982712 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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