瑞萨单片机论坛
直播中

jf_01200635

2年用户 136经验值
擅长:测量仪表 嵌入式技术 制造/封装 光电显示 存储技术 接口/总线/驱动 控制/MCU CRF/无线
私信 关注
[经验]

【RA-Eco-RA4M2开发板评测】3、串口蓝牙模块实现电压信息在手机显示

RA4M2通过ADC实现电压和内部温度测量,并可以通过LCD显示出来。如果将RA4M2通过串口与蓝牙模块通信,可以通过蓝牙透传方式将ADC测量数据发给手机,手机通过小程序或专用APP将数据展示出来。
对于蓝牙模块来说,在通过串口使用AT指令完成工作模式等基本配置后,可以无需进行蓝牙针对性编程,MCU可以串口直接将数据透传到手机。

一、数据交换格式定义

先定义透传数据交换格式,方便MCU和手机传递ADC数据。

数据由16字节表示:
uint8_t four_ADC_UpdateCharData[16]

第一个四字节 第二个四字节 第三个四字节 第四个四字节
保留 ADC采集电压 参考电压 内部温度
void formatSendData(uint32_t x,uint8_t pos)

{
uint8_t i;
a_ADC_UpdateCharData[0] = (x >> 24) & 0xFF;  // 最高有效字节
a_ADC_UpdateCharData[1] = (x >> 16) & 0xFF;
a_ADC_UpdateCharData[2] = (x >> 8) & 0xFF;
a_ADC_UpdateCharData[3] = x & 0xFF;          // 最低有效字节
for(i=0;i<4;i++)
{
four_ADC_UpdateCharData[pos*4+i]=a_ADC_UpdateCharData[i];
}
}

二、MCU端程序

ADC采集

void read_adc_value(void)
{
    uint16_t adc_data;
    double a0;
    int32_t cal127;
    uint8_t buf[30]={0};

    R_ADC_ScanStart(&g_adc4_ctrl);
    while (!scan_complete_flag) //等待转换完成标志
    {
        ;
    }
   scan_complete_flag = false; //重新清除标志位

    formatSendData(3300,0);
   //输入电压
   R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_4, &adc_data);
   a0 = (double)(adc_data*3.3/4095);
   cal127=a0*1000;

    formatSendData(cal127,1);
   sprintf((char*)buf,"%05.2f",a0);
   GUI_WriteASCII_BIG(60,5,buf,VGA_WHITE,VGA_RED);
   //参考电压
   R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_VOLT, &adc_data);
   a0 = (double)(adc_data*3.3/4095);
   cal127=a0*1000;

    formatSendData(cal127,2);

   sprintf((char*)buf,"%05.2f",a0);
   GUI_WriteASCII_BIG(60,55,buf,VGA_WHITE,VGA_GREEN);
   //内部温度
    R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_TEMPERATURE, &adc_data);

    double temperature = ADCTEMP_AS_C(adc_data);
    sprintf((char*)buf,"%05.2f",temperature);

    cal127=1000*temperature;

     formatSendData(cal127,3);
    GUI_WriteASCII_BIG(60,105,buf,VGA_WHITE,VGA_BLUE);

    for (int i = 0; i < 16; i++) {
        printf("%c", four_ADC_UpdateCharData[i]);  // %02X 表示2位十六进制,不足补零
    }
    printf("\r\n");
}

采集电压:
R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_4, &adc_data);

采集参考电压:
R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_VOLT, &adc_data);

采集内部温度:
R_ADC_Read(&g_adc4_ctrl, ADC_CHANNEL_TEMPERATURE, &adc_data);

printf已经重定向串口,并且串口与蓝牙模块连接,通过以下程序将采集的数据输出到蓝牙模块:

for (int i = 0; i < 16; i++) {
printf("%c", four_ADC_UpdateCharData[i]);  // %02X 表示2位十六进制,不足补零
}
printf("\r\n");

三、通过小程序处理蓝牙接收到的数据

小程序实现略。思路是小程序扫描蓝牙设备,进行连接。连接成功后,自动获得所有蓝牙特征值,如果是透传notify特征值,则进行订阅。订阅完成后,在MCU每次发送透传数据后,手机会收到16字节交换数据,进行解析并在手机屏显示。

6.jpg

7.jpg

8.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分