這個保溫瓶可感應(yīng)內(nèi)部溫度并通過藍牙將信息發(fā)送到接收器。
在本文中,我將向您展示如何在兩個 ESP32 板之間傳輸傳感器的藍牙協(xié)議。
你需要的東西:
M5Stick C
M5Stamp Pico
LM35溫度傳感器
M5棒C:
M5StickC 是迷你 M ESP32 提供的。它是一個可以實現(xiàn)你的 Stack55、開源的物聯(lián)網(wǎng)。它是做什么的? M5stickC是M5Stack產(chǎn)品系列的核心設(shè)備之一,并幫助您進行過程中的產(chǎn)品原型設(shè)計。
電源開關(guān)操作:
引導(dǎo):長按電源鍵2秒
電視:長按電源鍵6秒
注意:
M5StickC支持的波特率:1200~115200、250K、500K、750K、1500K
產(chǎn)品特點
基于ESP32
組合6軸IMU
紅色 LED
紅外線發(fā)射器
麥克風(fēng)
按鈕,LCD(0.96英寸)
壓縮鋰電池
可伸縮
可穿戴和壁掛式
游戲多平臺開發(fā):
UIFlow
微蟒
阿杜諾
.NET納米框架
M5Stamp Pico:
它的 STAMP-P 超設(shè)計尺寸,在 PCB 上像具有低 32 位 ICOX 接口的 LXLX 6 微處理器,40MHz 打印機一樣精確。例如可穿戴設(shè)備、醫(yī)療設(shè)備、傳感器和其他物聯(lián)網(wǎng)設(shè)備。
多種安裝方式,實現(xiàn)無限可能!(SMT、DIP、飛線接口),采用耐高溫塑料外殼,3D天線和5號天線可以更好的保護。
LOW-CODE DEV OPMENT:STAMP-MP-編程,腳本化編程平臺;全面Arduino免編程3-2-微型圖形開發(fā)等開發(fā)平臺,快速支持Python等開發(fā)、Python等各類應(yīng)用程序開發(fā)。
HIGH: 1P-ICO5V STA->3V DC/MP-1DC/1P-ICO5V STA-3V DC/12GR,全RGB燈,接口x1x1,xx電路,通訊穩(wěn)定,提供可靠的無線無線。
強大的擴展性:接入M5軟硬件生態(tài):豐富的傳感器、執(zhí)行、功能、配件選擇,極速系統(tǒng)接入模塊。
產(chǎn)品特點:
芯片組:ESP32-PICO-D4(2.4GHz Wi-Fi雙模)
支持 UIFlow 圖形化編程
多IO引出線,支持多種應(yīng)用形式(SMT、DIP、fly-by-wire)
集成嵌入式RGB LED和按鈕
微型模塊
LM35溫度傳感器:
LM35 35 模擬溫度模擬輸出與成比35,其傳感器單獨外接LM35 或LM 正時揚聲器。專門針對LM35 的外接光源或正向LM 自動精確輸出,提供和正常輸出和適當?shù)奶匦?5 模擬模擬溫度與輸出與成比35。控制電路連接。
硬件連接:
將 GND 的輸出端連接到 LM3 的第 36 Stamp 端,將 LM3 的電源連接到 LM3 的 5 V 和 GND。
VOUT -> G36
接地點 - > 接地點
VCC - > 5V
對發(fā)射器進行編程:
在本文中,微型發(fā)射器將發(fā)射器發(fā)射到中部,并連接發(fā)射器,向發(fā)射器發(fā)射紅外發(fā)射器。
#include
#include
#include
#include
#include
// LED 計數(shù)
#define NUM_LEDS 1
#define DATA_PIN 27
// 定義 LED 的數(shù)組
CRGB leds[NUM_LEDS];
#define Button 39
//BLE 服務(wù)器名稱
#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;
布爾設(shè)備連接 = 假;
#define SERVICE_UUID "91bad492-b950-4226-aa2b-4ede9fa42f59"
// 溫度特性和描述符
BLECharacteristic bmeTemperatureCelsiusCharacteristics("cba1d466-344c-4be3-ab3f-189f80dd7518", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor bmeTemperatureCelsiusDescriptor(BLEUUID((uint16_t)0x2902));
//設(shè)置回調(diào) onConnect 和 onDisconnect
類 MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
無效 onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
void setup() {
// 開始串行通信
Serial.begin(115200);
FastLED.addLeds
pinMode(按鈕,輸入);
// 創(chuàng)建 BLE 設(shè)備
BLEDevice::init(bleServerName);
// 創(chuàng)建 BLE 服務(wù)器
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// 創(chuàng)建 BLE 服務(wù)
BLEService *bmeService = pServer->createService(SERVICE_UUID);
// 創(chuàng)建 BLE 特征并創(chuàng)建 BLE 描述符
bmeService->addCharacteristic(&bmeTemperatureCelsiusCharacteristics);
bmeTemperatureCelsiusDescriptor.setValue("BME 溫度攝氏");
bmeTemperatureCelsiusCharacteristics.addDescriptor(&bmeTemperatureCelsiusDescriptor);
// 啟動服務(wù)
bmeService->start();
// 開始廣告
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
Serial.println("等待客戶端連接通知...");
}
無效循環(huán)(){
靜態(tài)布爾狀態(tài);
狀態(tài) = 數(shù)字讀?。ò粹o);
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 值轉(zhuǎn)換為以毫伏為單位的電壓
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
// 將電壓轉(zhuǎn)換為溫度,單位為°C
temp = milliVolt / 10;
靜態(tài)字符溫度CTemp[6];
dtostrf(temp, 6, 2, temperatureCTemp);
//設(shè)置溫度特征值并通知連接的客戶端
bmeTemperatureCelsiusCharacteristics.setValue(temperatureCTemp);
bmeTemperatureCelsiusCharacteristics.notify();
// 現(xiàn)在關(guān)閉 LED,然后暫停
leds[0] = 0x00f000;
FastLED.show();
Serial.print("攝氏溫度:");
串行打印(溫度);
Serial.println("oC");
最后時間 = 毫秒();
}
}
在此代碼中,如果您需要更改 BLE 服務(wù)器名稱,請根據(jù)需要更改此行:
基本代碼 LM35 包含讀數(shù)這行的,不要更改這些。
這是發(fā)送器的 BLE 服務(wù) ID:
這是溫度數(shù)據(jù)的服務(wù)ID:
M5 沒有使用任何重置按鈕,但它有一個在這里定義的按鈕,我重置了電路板 Pico。
最后,將代碼上傳到 M5Stamp Pico,確保您選擇了正確的板設(shè)置:
對預(yù)測:
在本文中,將發(fā)射器中的5個發(fā)射器接收來自發(fā)射器的溫度。
#include
#include "BLEDevice.h"
//BLE 服務(wù)器名稱
#define bleServerName "M5"
/* 服務(wù)的 UUID,我們要讀取的特征 */
// BLE 服務(wù)
static BLEUUID bmeServiceUUID("91bad492-b950-4226-aa2b-4ede9fa42f59");
//溫度攝氏特性
靜態(tài)BLEUUID temperatureCharacteristicUUID("cba1d466-344c-4be3-ab3f-189f80dd7518");
//標志說明是否應(yīng)該開始連接以及連接是否正常
static boolean doConnect = false;
靜態(tài)布爾連接=假;
//外圍設(shè)備的地址。地址將在掃描過程中找到...
static BLEAddress *pServerAddress;
//我們要讀取的特征
值 static BLERemoteCharacteristic* temperatureCharacteristic;
//激活通知
const uint8_t notificationOn[] = {0x1, 0x0};
const uint8_t notificationOff[] = {0x0, 0x0};
//存儲溫濕度的變量
char* temperatureChar;
//檢查新的溫度和濕度讀數(shù)是否可用的標志
boolean newTemperature = false;
//連接到具有名稱、服務(wù)和特征的 BLE 服務(wù)器
bool connectToServer(BLEAddress pAddress) {
BLEClient* pClient = BLEDevice::createClient();
// 連接到移除的 BLE 服務(wù)器。
pClient->connect(pAddress);
Serial.println(" - 連接到服務(wù)器");
// 在遠程 BLE 服務(wù)器中獲取對我們所追求的服務(wù)的引用。
BLERemoteService* pRemoteService = pClient->getService(bmeServiceUUID);
if (pRemoteService == nullptr) {
Serial.print("未能找到我們的服務(wù) UUID:");
Serial.println(bmeServiceUUID.toString().c_str());
返回(假);
}
// 獲取遠程BLE服務(wù)器服務(wù)中的特征引用。
temperatureCharacteristic = pRemoteService->getCharacteristic(temperatureCharacteristicUUID);
if (temperatureCharacteristic == nullptr) {
Serial.print("未能找到我們的特征 UUID");
返回假;
}
Serial.println(" - 找到我們的特征");
//為特征分配回調(diào)函數(shù)
temperatureCharacteristic->registerForNotify(temperatureNotifyCallback);
返回真;
}
//當收到另一個設(shè)備的廣告時調(diào)用的回調(diào)函數(shù)
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
if (advertisedDevice.getName() == bleServerName) { //檢查廣告商的名稱是否匹配
廣告設(shè)備.getScan()->stop();//可以停止掃描,我們找到了我們要找的
東西 pServerAddress = new BLEAddress(advertisedDevice.getAddress());//廣告客戶的地址就是我們需要的
那個 doConnect = true;//設(shè)置指標,說明我們已經(jīng)準備好連接
Serial.println("Device found. Connecting!");
}
}
};
//當BLE Server發(fā)送一個帶有notify屬性的新溫度讀數(shù)時
static void temperatureNotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData, size_t length, bool isNotify) {
//存儲溫度值
temperatureChar = (char*)pData;
新溫度=真;
}
//在 OLED 顯示屏中打印最新傳感器讀數(shù)的函數(shù)
void printReadings() {
M5.update();
//擦除顯示器中之前的內(nèi)容
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("---------");
}
無效設(shè)置() {
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("我們現(xiàn)在連接到 BLE 服務(wù)器。");
M5.Lcd.print("連接到BLE服務(wù)器");
//激活每個Characteristic的Notify屬性
temperatureCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn, 2, true);
連接=真;
} else {
Serial.println("我們連接服務(wù)器失?。恢貑⒛脑O(shè)備再次掃描附近的BLE服務(wù)器。");
M5.Lcd.print("未連接");
}
連接 = 假;
}
//如果有新的溫度讀數(shù)可用,則在 OLED 中打印
if (newTemperature) {
newTemperature = false;
打印讀數(shù)();
}
}
請確保您在此服務(wù)名稱重命名為與相同的名稱,并在設(shè)備名稱和溫度數(shù)據(jù) ID 中與匹配匹配。
一些代碼行來顯示我添加到 TFT 顯示器。
完成后,進行所需的更改,將代碼上傳到 M5Stick C。
上傳一次代碼后,就可以點擊發(fā)射器和器上的按鈕并接收監(jiān)控輸出。
-
傳感器
+關(guān)注
關(guān)注
2551文章
51106瀏覽量
753651 -
藍牙協(xié)議
+關(guān)注
關(guān)注
1文章
29瀏覽量
11418 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17279
發(fā)布評論請先 登錄
相關(guān)推薦
評論