1039|1

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【安信可BW16-Kit开发板】ble uart 发送测温数据 [复制链接]

一、板卡连接

      使用的温度传感器是 D6T-44L-06H,板卡通过I2C总线读取传感器信息,再通过蓝牙传输数据

      

 

二、代码烧录

* includes */
#include <Wire.h>
#include "BLEDevice.h"


#define UART_SERVICE_UUID      "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"

#define STRING_BUF_SIZE 100
/* defines */
#define D6T_ADDR 0x0A  // for I2C 7bit address
#define D6T_CMD 0x4C  // for D6T-44L-06/06H, D6T-8L-09/09H, for D6T-1A-01/02

#define N_ROW 4
#define N_PIXEL (4 * 4)
#define N_READ ((N_PIXEL + 1) * 2 + 1)

BLEService UartService(UART_SERVICE_UUID);
BLECharacteristic Rx(CHARACTERISTIC_UUID_RX);
BLECharacteristic Tx(CHARACTERISTIC_UUID_TX);
BLEAdvertData advdata;
BLEAdvertData scndata;
bool notify = false;

void writeCB (BLECharacteristic* chr, uint8_t connID) {
    //printf("Characteristic %s write by connection %d :\n", chr->getUUID().str(), connID);
    Serial.print("Characteristic ");
    Serial.print(chr->getUUID().str());
    Serial.print(" write by connection ");
    Serial.println(connID);
    if (chr->getDataLen() > 0) {
        Serial.print("Received string: ");
        Serial.print(chr->readString());
        Serial.println();
    }
}

void notifCB(BLECharacteristic* chr, uint8_t connID, uint16_t cccd) {
    if (cccd & GATT_CLIENT_CHAR_CONFIG_NOTIFY) {
        //printf("Notifications enabled on Characteristic %s for connection %d \n", chr->getUUID().str(), connID);
        Serial.print("Notifications enabled on Characteristic");
        notify = true;
    } else {
        //printf("Notifications disabled on Characteristic %s for connection %d \n", chr->getUUID().str(), connID);
        Serial.print("Notifications disabled on Characteristic");
        notify = false;
    }
    Serial.print(chr->getUUID().str());
    Serial.print(" for connection");
    Serial.println(connID);
}


uint8_t rbuf[N_READ];
double ptat;
double pix_data[N_PIXEL];

uint8_t calc_crc(uint8_t data) {
    int index;
    uint8_t temp;
    for (index = 0; index < 8; index++) {
        temp = data;
        data <<= 1;
        if (temp & 0x80) {data ^= 0x07;}
    }
    return data;
}

/** <!-- D6T_checkPEC {{{ 1--> D6T PEC(Packet Error Check) calculation.
 * calculate the data sequence,
 * from an I2C Read client address (8bit) to thermal data end.
 */
bool D6T_checkPEC(uint8_t buf[], int n) {
    int i;
    uint8_t crc = calc_crc((D6T_ADDR << 1) | 1);  // I2C Read address (8bit)
    for (i = 0; i < n; i++) {
        crc = calc_crc(buf[i] ^ crc);
    }
    bool ret = crc != buf[n];
    if (ret) {
        Serial.print("PEC check failed:");
        Serial.print(crc, HEX);
        Serial.print("(cal) vs ");
        Serial.print(buf[n], HEX);
        Serial.println("(get)");
    }
    return ret;
}

/** <!-- conv8us_s16_le {{{1 --> convert a 16bit data from the byte stream.
 */
int16_t conv8us_s16_le(uint8_t* buf, int n) {
    uint16_t ret;
    ret = (uint16_t)buf[n];
    ret += ((uint16_t)buf[n + 1]) << 8;
    return (int16_t)ret;   // and convert negative.
}

/** <!-- setup {{{1 -->
 * 1. Initialize 
       - initialize a Serial port for output.
	   - initialize I2C.
 */
void setup() {
    Serial.begin(115200);  // Serial baudrate = 115200bps
    Wire.begin();  // i2c master
    advdata.addFlags();
    advdata.addCompleteName("AMEBA_BLE_DEV");
    scndata.addCompleteServices(BLEUUID(UART_SERVICE_UUID));

    Rx.setWriteProperty(true);
    Rx.setWritePermissions(GATT_PERM_WRITE);
    Rx.setWriteCallback(writeCB);
    Rx.setBufferLen(STRING_BUF_SIZE);
    Tx.setReadProperty(true);
    Tx.setReadPermissions(GATT_PERM_READ);
    Tx.setNotifyProperty(true);
    Tx.setCCCDCallback(notifCB);
    Tx.setBufferLen(STRING_BUF_SIZE);

    UartService.addCharacteristic(Rx);
    UartService.addCharacteristic(Tx);

    BLE.init();
    BLE.configAdvert()->setAdvData(advdata);
    BLE.configAdvert()->setScanRspData(scndata);
    BLE.configServer(1);
    BLE.addService(UartService);

    BLE.beginPeripheral();
	  delay(620);
}

/** <!-- loop - Thermal sensor {{{1 -->
 * 2. read data.
 */
void loop() {
    int i = 0;
	  int16_t itemp = 0;
	
	// Read data via I2C
	// I2C buffer of "Arduino MKR" is 256 buffer. (It is enough)
    memset(rbuf, 0, N_READ);
    Wire.beginTransmission(D6T_ADDR);  // I2C slave address
    Wire.write(D6T_CMD);               // D6T register
    Wire.endTransmission();
	  delay(1);
    Wire.requestFrom(D6T_ADDR, N_READ);
    while (Wire.available()) {
        rbuf[i++] = Wire.read();
    }
    D6T_checkPEC(rbuf, N_READ - 1);
    
    //Convert to temperature data (degC)
    ptat = (double)conv8us_s16_le(rbuf, 0) / 10.0;
	  for (i = 0; i < N_PIXEL; i++) {
		  itemp = conv8us_s16_le(rbuf, 2 + 2*i);
		  pix_data[i] = (double)itemp / 10.0;
	  }
    
    //Output results
    double sum ;
	  for (i = 0; i < N_PIXEL; i++) {
	    sum += pix_data[i];
  	}	
    double average = sum / N_PIXEL;
    
    String str = ("The average temporature: " + String(average) + "°C\n");
	
    delay(300);	

    Tx.writeString(str);
    if (BLE.connected(0) && notify) {
        Tx.notify(0);
    }
    delay(5000);
}

三、实验结果

使用手机上的 android 端蓝牙调试软件:serial bluetooth terminal

在device里找到,开发板设置的蓝牙名称,连接

 

连接后就进入到串口 terminal,传感器对着一台手机。

由于String buffer不是很大,我只对16个方位的温度值取平均值,做个功能展示

 

此帖出自无线连接论坛

最新回复

结果看应该是发送测温数据成功   详情 回复 发表于 2024-3-9 07:48
点赞 关注
 

回复
举报

6809

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

结果看应该是发送测温数据成功

此帖出自无线连接论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
IPTV数字电视和网络电视的区别与联系

IPTV是以家用电视机为主要显示设备,集互联网、多媒体、通信等多种技术于一体,通过IP协议向家庭用户提供多种交互式媒体服务的业 ...

IC设计领域介绍及工程师未来出路规划

一、 IC 设计领域简介 (一)模拟与混号讯号电路设计 IC 电路可分为为模拟 IC 与数字 IC 两大类,以及两者兼具的混合讯号等三种 ...

当代最有竞争力的模拟技术和产品大看台

当代最有竞争力的模拟技术和产品大看台:前置放大器 前置放大器一般位于信号调理电路的最高端,它主要用于放大从传感器过来的 ...

ubuntu下修改内核发生“ncurses libraries“错误(解决方法)

BSEC@bsec-server:~/kernel/Kernel$ make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC script ...

学习笔记分享】【MSP430学习笔记】IAR开发环境中的数据、函数定位方法

IAR集成开发环境下,变量和函数的定位方法。 71081 qq:906411450 triton.zhang 本帖最后由 Triton.zhang 于 2011-9-2 ...

【MSP430F5529测评】2. UART串口通信

本帖最后由 wuguangtao 于 2020-10-27 22:17 编辑 # MSP430F5529LP UART 串口通信测试 由于energia很容易上手和测试, 这 ...

华为电磁兼容性结构设计规范 V2.0

本规范规定了电磁兼容性结构设计(屏蔽和搭接等)的主要原理 、设计原则和详细设计方法。 如果要深入理解电磁兼容的理论 ...

【安信可UWB室内定位模组NodeMCU-BU01】02.AT指令测距

1、NodeMCU-BU01开发板跳帽设置 NodeMCU-BU01开发板板载了一颗STM32 MCU作为主控制芯片,集成了AT调试指令功能,方便在线实时 ...

理论知识指导

各位朋友,前段时间用TAS5630B这颗集成内部MOS的D类运放芯片做了个D类功放,前前后后用了十几片,没有一块板子活过10分钟,既 ...

【得捷电子Follow me第1期】任务1 熟悉thonny软件与micropython的基本语法

本帖最后由 爱吃鱼的加菲猫 于 2023-5-29 22:00 编辑 第一步,开箱及排针焊接 先来两张焊接完成照片,我用了彩色排针区分 ...

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