0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用M5Stack设计一个BLE保温杯

科技观察员 来源:Pradeep 作者:Pradeep 2022-05-25 16:46 次阅读

这个保温瓶可感应内部温度并通过蓝牙信息发送到接收器

在本文中,我将向您展示如何在两个 ESP32 板之间传输传感器的蓝牙协议。

pYYBAGKN61aATlc_AAPKy41aNZ0183.png

你需要的东西:

M5Stick C

M5Stamp Pico

LM35温度传感器

M5棒C:

pYYBAGKN7iGAejPIAAJFFSSEDUA961.png

M5StickC 是迷你 M ESP32 提供的。它是一个可以实现你的 Stack55、开源的物联网。它是做什么的? M5stickC是M5Stack产品系列的核心设备之一,并帮助您进行过程中的产品原型设计。

电源开关操作:

引导:长按电源键2秒

电视:长按电源键6秒

注意:

M5StickC支持的波特率:1200~115200、250K、500K、750K、1500K

产品特点

基于ESP32

组合6轴IMU

红色 LED

红外线发射器

麦克风

按钮,LCD(0.96英寸)

压缩锂电池

可伸缩

可穿戴和壁挂式

游戏多平台开发:

UIFlow

微蟒

阿杜诺

.NET纳米框架

M5Stamp Pico:

poYBAGKN7i6AdNyyAAN6rE7Xxc0376.png

它的 STAMP-P 超设计尺寸,在 PCB 上像具有低 32 位 ICOX 接口的 LXLX 6 微处理器,40MHz 打印机一样精确。例如可穿戴设备、医疗设备、传感器和其他物联网设备。

多种安装方式,实现无限可能!(SMT、DIP、飞线接口),采用耐高温塑料外壳,3D天线和5号天线可以更好的保护。

LOW-CODE DEV OPMENT:STAMP-MP-编程,脚本化编程平台;全面Arduino免编程3-2-微型图形开发等开发平台,快速支持Python等开发、Python等各类应用程序开发。

HIGH: 1P-ICO5V STA->3V DC/MP-1DC/1P-ICO5V STA-3V DC/12GR,全RGB灯,接口x1x1,xx电路,通讯稳定,提供可靠的无线无线。

强大的扩展性:接入M5软硬件生态:丰富的传感器、执行、功能、配件选择,极速系统接入模块。

产品特点:

芯片组:ESP32-PICO-D4(2.4GHz Wi-Fi双模)

支持 UIFlow 图形化编程

多IO引出线,支持多种应用形式(SMT、DIP、fly-by-wire)

集成嵌入式RGB LED和按钮

微型模块

LM35温度传感器:

poYBAGKN7jyAVGtvAAFAVcmerus761.png

LM35 35 模拟温度模拟输出与成比35,其传感器单独外接LM35 或LM 正时扬声器。专门针对LM35 的外接光源或正向LM 自动精确输出,提供和正常输出和适当的特性35 模拟模拟温度与输出与成比35。控制电路连接。

硬件连接:

pYYBAGKN7kmAN4aRAAJ9jsF9_OI308.png

将 GND 的输出端连接到 LM3 的第 36 Stamp 端,将 LM3 的电源连接到 LM3 的 5 V 和 GND。

VOUT -> G36

接地点 - > 接地点

VCC - > 5V

对发射器进行编程:

在本文中,微型发射器将发射器发射到中部,并连接发射器,向发射器发射红外发射器。

#include
#include
#include
#include
#include

// LED 计数
#define NUM_LEDS 1
#define DATA_PIN 27

// 定义 LED 的数组
CRGB leds[NUM_LEDS];

#define Button 39
//BLE 服务器名称
#define bleServerName "M5"

//LM35
#define ADC_VREF_mV 3300.0 // 以毫伏
为单位 #define ADC_RESOLUTION 4096.0
#define PIN_LM35 36 // ESP32 引脚 GIOP36 (ADC0) 连接到 LM35

浮动温度;
浮动温度F;
浮动嗡嗡声;

// 定时器变量
unsigned long lastTime = 0;
无符号长定时器延迟 = 30000;

布尔设备连接 = 假;

#define SERVICE_UUID "91bad492-b950-4226-aa2b-4ede9fa42f59"

// 温度特性和描述符
BLECharacteristic bmeTemperatureCelsiusCharacteristics("cba1d466-344c-4be3-ab3f-189f80dd7518", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor bmeTemperatureCelsiusDescriptor(BLEUUID((uint16_t)0x2902));

//设置回调 onConnect 和 onDisconnect
类 MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
无效 onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};


void setup() {
// 开始串行通信
Serial.begin(115200);

FastLED.addLeds(leds, NUM_LEDS);

pinMode(按钮,输入);

// 创建 BLE 设备
BLEDevice::init(bleServerName);

// 创建 BLE 服务器
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

// 创建 BLE 服务
BLEService *bmeService = pServer->createService(SERVICE_UUID);

// 创建 BLE 特征并创建 BLE 描述符
bmeService->addCharacteristic(&bmeTemperatureCelsiusCharacteristics);
bmeTemperatureCelsiusDescriptor.setValue("BME 温度摄氏");
bmeTemperatureCelsiusCharacteristics.addDescriptor(&bmeTemperatureCelsiusDescriptor);


// 启动服务
bmeService->start();

// 开始广告
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
Serial.println("等待客户端连接通知...");
}

无效循环(){
静态布尔状态;
状态 = 数字读取(按钮);
if (State == 0)
{
ESP.restart();
}
if (deviceConnected) {
if ((millis() - lastTime) > timerDelay) {

// 打开 LED,然后暂停
leds[0] = 0xf00000;
FastLED.show();
延迟(2000);

// 从温度传感器读取 ADC 值
int adcVal = analogRead(PIN_LM35);
// 将 ADC 值转换为以毫伏为单位的电压
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
// 将电压转换为温度,单位为°C
temp = milliVolt / 10;

静态字符温度CTemp[6];
dtostrf(temp, 6, 2, temperatureCTemp);
//设置温度特征值并通知连接的客户端
bmeTemperatureCelsiusCharacteristics.setValue(temperatureCTemp);
bmeTemperatureCelsiusCharacteristics.notify();

// 现在关闭 LED,然后暂停
leds[0] = 0x00f000;
FastLED.show();

Serial.print("摄氏温度:");
串行打印(温度);
Serial.println("ºC");

最后时间 = 毫秒();
}
}


在此代码中,如果您需要更改 BLE 服务器名称,请根据需要更改此行:

poYBAGKN7lmAGyI6AABGDmW1f5k292.png

基本代码 LM35 包含读数这行的,不要更改这些。

poYBAGKN7mWAKIJgAAD4DysjYoc788.png

这是发送器的 BLE 服务 ID:

pYYBAGKN7nGAM8vnAABpEoAugOk083.png

这是温度数据的服务ID:

pYYBAGKN7n2AQ75iAACpNulSWbg324.png

M5 没有使用任何重置按钮,但它有一个在这里定义的按钮,我重置了电路板 Pico。

poYBAGKN7omAWYWNAAB_SBAdd2k548.png

最后,将代码上传到 M5Stamp Pico,确保您选择了正确的板设置:

poYBAGKN7pWAVhn_AAGf4RFgeVk889.png

对预测:

在本文中,将发射器中的5个发射器接收来自发射器的温度。

#include
#include "BLEDevice.h"

//BLE 服务器名称
#define bleServerName "M5"

/* 服务的 UUID,我们要读取的特征 */
// BLE 服务
static BLEUUID bmeServiceUUID("91bad492-b950-4226-aa2b-4ede9fa42f59");

//温度摄氏特性
静态BLEUUID temperatureCharacteristicUUID("cba1d466-344c-4be3-ab3f-189f80dd7518");


//标志说明是否应该开始连接以及连接是否正常
static boolean doConnect = false;
静态布尔连接=假;

//外围设备的地址。地址将在扫描过程中找到...
static BLEAddress *pServerAddress;

//我们要读取的特征
值 static BLERemoteCharacteristic* temperatureCharacteristic;

//激活通知
const uint8_t notificationOn[] = {0x1, 0x0};
const uint8_t notificationOff[] = {0x0, 0x0};


//存储温湿度的变量
char* temperatureChar;

//检查新的温度和湿度读数是否可用的标志
boolean newTemperature = false;


//连接到具有名称、服务和特征的 BLE 服务器
bool connectToServer(BLEAddress pAddress) {
BLEClient* pClient = BLEDevice::createClient();

// 连接到移除的 BLE 服务器。
pClient->connect(pAddress);
Serial.println(" - 连接到服务器");

// 在远程 BLE 服务器中获取对我们所追求的服务的引用。
BLERemoteService* pRemoteService = pClient->getService(bmeServiceUUID);
if (pRemoteService == nullptr) {
Serial.print("未能找到我们的服务 UUID:");
Serial.println(bmeServiceUUID.toString().c_str());
返回(假);
}

// 获取远程BLE服务器服务中的特征引用。
temperatureCharacteristic = pRemoteService->getCharacteristic(temperatureCharacteristicUUID);

if (temperatureCharacteristic == nullptr) {
Serial.print("未能找到我们的特征 UUID");
返回假;
}
Serial.println(" - 找到我们的特征");

//为特征分配回调函数
temperatureCharacteristic->registerForNotify(temperatureNotifyCallback);
返回真;
}

//当收到另一个设备的广告时调用的回调函数
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
if (advertisedDevice.getName() == bleServerName) { //检查广告商的名称是否匹配
广告设备.getScan()->stop();//可以停止扫描,我们找到了我们要找的
东西 pServerAddress = new BLEAddress(advertisedDevice.getAddress());//广告客户的地址就是我们需要的
那个 doConnect = true;//设置指标,说明我们已经准备好连接
Serial.println("Device found. Connecting!");
}
}
};

//当BLE Server发送一个带有notify属性的新温度读数时
static void temperatureNotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData, size_t length, bool isNotify) {
//存储温度值
temperatureChar = (char*)pData;
新温度=真;
}


//在 OLED 显示屏中打印最新传感器读数的函数
void printReadings() {
M5.update();

//擦除显示器中之前的内容
M5.Lcd.fillScreen(BLACK);

M5.Lcd.setTextColor(红色);
M5.Lcd.setCursor(20, 18);
M5.Lcd.setTextSize(1.8);
M5.Lcd.print("[");
M5.Lcd.setTextColor(绿色);
M5.Lcd.print("BLE 智能烧瓶");
M5.Lcd.setTextColor(红色);
M5.Lcd.print(" ]");
M5.Lcd.setCursor(18, 40);
M5.Lcd.setTextColor(绿色);
Serial.print("温度:");
M5.Lcd.print("温度:");
Serial.println(温度字符);
M5.Lcd.print(温度字符);
M5.Lcd.print("C");

M5.Lcd.setCursor(15, 55);
M5.Lcd.setTextColor(红色);
M5.Lcd.print("---------");

浮动 x = atof(温度字符);
if (x >= 35.0)
{
Serial.println("可能是过热");
M5.Lcd.setCursor(15, 65);
M5.Lcd.setTextColor(红色);

M5.Lcd.print("可能过热");
}
else {
Serial.println("可以喝");
M5.Lcd.setCursor(30, 65);
M5.Lcd.setTextColor(绿色);
M5.Lcd.print("可以喝了");
}

M5.Lcd.setCursor(15, 75);
M5.Lcd.setTextColor(红色);
M5.Lcd.print("---------");
}
无效设置() {

M5.begin();
M5.Lcd.setRotation(3);
M5.Axp.ScreenBreath(10);
M5.Lcd.setTextColor(RED);
M5.Lcd.setCursor(10, 35);
M5.Lcd.setTextSize(1.8);

//Start serial communication
Serial.begin(115200);
Serial.println("Starting Arduino BLE Client application...");

//Init BLE device
BLEDevice::init("");

BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
pBLEScan->start(30);
}

void loop() {

if (doConnect == true) {
if (connectToServer(*pServerAddress)) {
Serial.println("我们现在连接到 BLE 服务器。");
M5.Lcd.print("连接到BLE服务器");
//激活每个Characteristic的Notify属性
temperatureCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn, 2, true);
连接=真;
} else {
Serial.println("我们连接服务器失败;重启您的设备再次扫描附近的BLE服务器。");
M5.Lcd.print("未连接");
}
连接 = 假;
}
//如果有新的温度读数可用,则在 OLED 中打印
if (newTemperature) {
newTemperature = false;
打印读数();
}
}
请确保您在此服务名称重命名为与相同的名称,并在设备名称和温度数据 ID 中与匹配匹配。

pYYBAGKN7qWAAj3jAAGZZI9kO-I811.png

一些代码行来显示我添加到 TFT 显示器。

pYYBAGKN7raAA95RAAJ5gu4WpI4351.png

完成后,进行所需的更改,将代码上传到 M5Stick C。

pYYBAGKN7sOAIFZhAAHk2mWIEK8739.png

poYBAGKN7tOANxAhAAEoUeoPI-0843.png

上传一次代码后,就可以点击发射器和器上的按钮并接收监控输出。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48092

    浏览量

    740010
  • 蓝牙协议
    +关注

    关注

    1

    文章

    27

    浏览量

    11306
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15806
收藏 人收藏

    评论

    相关推荐

    智能保温杯

    、作品名称智能保温杯垫二、创意来源如今无论是白领族还是学生族,每家每户都会在上网工作、冲浪时泡上壶醇香的咖啡或是
    发表于 11-17 01:40

    今天收到Litepoint下载活动的保温杯,有图片哦

    ` 本帖最后由 maoshen 于 2014-4-9 14:12 编辑 Litepoint送的保温杯质量很好,,,而且耐收藏{:4_95:}`
    发表于 04-01 12:41

    从0到1学习M5stack系列教程()Hello World

    UIFlow, MicroPython, Arduino本系列教程将与大家起学习如何使用Arduino开发M5Stack系列产品。首先按照惯例来进行最基本的Hello Worl
    发表于 08-09 20:00

    M5Stack学习Arduino(四)WebServer服务

    本帖最后由 M5Stack 于 2019-8-26 11:03 编辑 M5Stack内置了TF卡槽,因此可以方便的读写文件,本节将利用M5Stack
    发表于 08-26 10:42

    M5Stack学习Arduino(五)BLE-MIDI

    ``M5Stack支持蓝牙,本节就利用BLE功能来做一个蓝牙MIDI外设,通过M5Stack的按键触发MIDI事件,这里仅抛砖引玉,当然你还
    发表于 09-02 16:00

    保温杯垫PSE证书METI注册备案

    电池PSE证书,LED灯PSE证书,电器PSE证书,充电宝PSE证书,移动电源PSE证书,开关插座PSE证书,保温杯垫PSE证书,保温杯PSE证书,锂电池PSE证书,面板灯PSE证书,工矿灯PSE
    发表于 03-23 09:18

    你的保温杯CE证书和FCC证书

    `电池PSE证书,LED灯PSE证书,电器PSE证书,充电宝PSE证书,移动电源PSE证书,开关插座PSE证书,保温杯垫PSE证书,保温杯PSE证书,锂电池PSE证书,面板灯PSE证书,工矿灯PSE
    发表于 03-23 09:47

    用单片机+NTC来测温的保温杯设计

    之前看到过盖子可以显示温度的保温杯,好奇之下买了拆开来看了下,发现是单片机+NTC来测
    发表于 02-28 07:17

    适用于Arduino和M5Stack的MH-Z19B二氧化碳传感器

    描述MH-Z19B 用于 M5StackMH-Z19B是款易于使用的二氧化碳传感器,适用于 Arduino 和 M5Stack。我做了这个板来检查工作中的二氧化碳水平。通过将其安装在 M5S
    发表于 08-16 07:03

    是否有机会看到ESP BASIC的ESP32或M5Stack版本?

    我们是否有机会看到 ESP BASIC 的 ESP32 或 M5Stack 版本?如果在 M5Stack 中安装带有 FACES 键盘的解释器,那将是不可思议的!
    发表于 05-10 08:22

    气密性检测保温杯盖测试实例的介绍

    人到中年不得已,保温杯里泡枸杞。快节奏的生活让更多的人开始养生,那么养生的第一步就是人手一个保温杯。除了中老年朋友以外,如今的佛系青年,甚至小朋友基本都人手一个保温杯。越来越多年轻人习惯外出随身携带
    发表于 01-29 16:43 580次阅读

    简易的电子保温杯pcb设计原理图

    保温杯PCB 保温杯原理图 以上是一个简易电子保温杯的PCB和原理图。此保温杯的功能很简单,就是拨上电源开关后,电
    的头像 发表于 12-08 11:04 1.2w次阅读

    如何知道保温杯盖的防水性能

    现在保温杯的保冷保热已经是基本功能,有一些厂家更是推出了智能型保温杯,主要电子元器件元件都集成在保温杯盖中,可以显示温度,还能定时提醒喝水,还可以电加热保温等等诸多实用性功能,那么
    发表于 06-15 10:33 765次阅读

    M5Stack圣诞雪球开源分享

    电子发烧友网站提供《M5Stack圣诞雪球开源分享.zip》资料免费下载
    发表于 06-28 10:26 0次下载
    <b class='flag-5'>M5Stack</b>圣诞雪球开源分享

    StickC M5Stack LED闪烁

    电子发烧友网站提供《StickC M5Stack LED闪烁.zip》资料免费下载
    发表于 06-29 11:35 0次下载
    StickC <b class='flag-5'>M5Stack</b> LED闪烁