本帖最后由 lyj336 于 2020-7-12 21:42 编辑

很荣幸能够申请到富芮坤的FR8016H物联网开发板,这次申请到的开发板,虽然说主控芯片拥有蓝牙内核,但是板子上也有Wifi模块ESP-01S的接口。蓝牙只能在局域网内使用,我想做的Demo是基于广域网的,所以选择使用了Wifi模块。

一、产品开路
不得不说,富芮坤的开发板是真的好,没收到快递之前,我还以为板子的尺寸至少有10cm*10cm以上,因为我看到的简介中,这块开发板拥有很多的板载芯片,而且是我们常用的芯片。但是一开箱,板子确实惊艳到我了,板载那么多的外设,尺寸大约只有8cm*6cm大小。一个板子板子竟然能做到如此小巧而精美,给富芮坤点赞。
5.jpg
        

FR8016H物联网开发板的主控芯片是FR8016HA SOC蓝牙芯片,其符合BLE5.0标准的SOC芯片,内置16位audio codec,内置PMU,在蓝牙协议范围内提供了强大的连接特性。
        突出的优势有以下三个方面:
        (a) 内置16位audio codec:可以支持低成本的麦克风音频输入和模拟音频输出。在智能灯控,智能锁等应用中提示音的输出都是刚需。
        (b) 内置PMU:可以对外部锂电池提供200mA的充电电流,同时内部的LDO可以对外提供60mA左右的电流。在便携消费类产品中提供了单片解决方案,降低了产品的系统成本,比如智能穿戴等。
        (c) 在蓝牙协议范围内提供了强大的连接特性:主从一体,支持多达20个蓝牙设备同时保持连接,支持标准的SIG MESH以及客户定制的私有MESH协议。在智能电网应用中,智能传感器网络等应用中都有蓝牙多连接的需求。
FR8016H物联网开发板板载外设多得,确实值得称赞。
10.png
1、 MIC&气压检测芯片
2、USB 转TTL芯片与 USB接口
3、六轴陀螺仪
4、外接电池接口
5、温湿度传感器芯片
6、3个按键
7、2个LED灯
8、喇叭接口
9、空气质量检测模块接口
10、ESP01 Wifi模块接口
11、步进电机接口
12、像素密度为240*240的LCD屏。
二、应用思路
这次参加富芮坤我的作品应用思路是,使用Wifi模块连接到家里的路由器,借助远程TCP服务器,把家里的温度、湿度、大气压情况发送到
手机端。这样能在局域网内观察到家里的温度、湿度、大气压情况,在广域网也能观察到家里的温度、湿度、大气压情况。
硬件方面比较简单,结合开发板,在WiFi接口接上ESP01S模块,使用几根杜邦线,连接传感器芯片到主控引脚。
10.jpg
Wifi模块为了减少时间,只是使用AT指令进行控制。通过UART输出AT指令到Wifi模块,进而控制它。官方提供的原理图中,WiFi模块的RX、TX接到主控芯片的PD5、PD4,但是还有U1TXD、U1RXD的网络标号,不要以为PD4、PD5只能使用为UART1串口,也可以复用为UART0的TX、RX。

15.png
PD4、PD5的复用功能很多,如下所示。这就使得芯片的引脚可以灵活的运用起来。
#define PORTD4_FUNC_D4              0x00
  • #define PORTD4_FUNC_I2C0_CLK        0x01
  • #define PORTD4_FUNC_I2S_CLK         0x02
  • #define PORTD4_FUNC_PWM4            0x03
  • #define PORTD4_FUNC_SSP0_CLK        0x04
  • #define PORTD4_FUNC_UART0_RXD       0x05
  • #define PORTD4_FUNC_UART1_RXD       0x06
  • #define PORTD4_FUNC_ANT_CTL0        0x07
  • #define PORTD4_FUNC_PDM_CLK         0x08
  • #define PORTD4_FUNC_ADC0            0x0c
  • #define PORTD5_FUNC_D5              0x00
  • #define PORTD5_FUNC_I2C0_DAT        0x01
  • #define PORTD5_FUNC_I2S_FRM         0x02
  • #define PORTD5_FUNC_PWM5            0x03
  • #define PORTD5_FUNC_SSP0_CSN        0x04
  • #define PORTD5_FUNC_UART0_TXD       0x05
  • #define PORTD5_FUNC_UART1_TXD       0x06
  • #define PORTD5_FUNC_ANT_CTL0        0x07
  • #define PORTD5_FUNC_PDM_DAT         0x08
  • #define PORTD5_FUNC_ADC1            0x0c
  • 复制代码
    因为UART1已经和co_printf()打印函数绑定到一起,所以我选择使用UART0来与Wifi模块进行通信。UART0初始化如下。
    void Wifi_Init(void)
  • {
  •        system_set_port_pull(GPIO_PD4, true);
  •         system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);
  •         system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);
  •         uart_init(UART0, BAUD_RATE_115200);
  • }
  • 复制代码
    LCD屏幕控制代码使用官方的SDK中的例程。但是把例程下载到开发板,发现屏幕显示不正常,显示屏内容旋转了180度。
    14.jpg
    我到LCD屏初始化代码下查看,发现有 DEV_V_1_4,这是1.4板子的LCD初始化代码。把DEV_V_1_4 定义为0:#define DEV_V_1_4  (0)  //FR8016H DEV1.4,屏幕显示正常。
        {
  •         LCD_WR_REG(0xfe);
  •         LCD_WR_REG(0xef);        
  •                         
  •         LCD_WR_REG(0x36);        
  •         LCD_WR_DATA8(0x48);        
  •         LCD_WR_REG(0x3a);        
  •         LCD_WR_DATA8(0x05);        
  • 复制代码
    温湿度采集使用的是板载的SHT30温湿度芯片,SHT30驱动采集代码使用SDK中的代码。
    大气压采集使用的是板载上的CAPB18-001传感器,它的驱动代码也是使用SDK中的代码。
    系统上电后,Wifi模块进行初始化,初始化完成才能,采集数据,上传数据到手机端,时间大约需要七秒。
    Wifi初始化完成后,进行其他外设初始化。然后创建两个周期性任务,一个是进行数据采集和显示更新,一个是数据发送到手机端。分别为1秒执行一次,3秒执行一次。
        //OS Timer
        os_timer_init(&timer_refresh,timer_refresh_fun,NULL);//创建一个周期性1s定时的系统定时器
        os_timer_start(&timer_refresh,1000,1);
        os_timer_init(&timer_espsend_fresh,timer_espsend_fun,NULL);//创建一个周期性3s定时的系统定时器
        os_timer_start(&timer_espsend_fresh,3000,2);

    四、功能体验
    系统重启后,会显示图片,等待Wifi模块初始化完成。
    11.jpg
    大约7秒后,LCD显示下面内容。显示的数据大约1秒更新一次。
    13.jpg
    打开手机端的网络调试助手,连接到指定的广域网下TCP服务器,可以看到手机收到了开发板上传的数据。
    16.jpg
    五、客观评价
    FR8016H物联网开发板板载资源、主控芯片方面都很好,但是开始时,必须要仔细看原理图,因为很多板载芯片不是直接连到主控芯片的,很多是需要跳线帽或者杜邦线把板载芯片接到主控芯片引脚。开发板附带的跳线帽有点不够,应该多送几个。

    个人觉得官方SDK的主控外设函数接口说明不够全面,只找到一份SDK 使用指导书,但是里面的东西不够多,比如UART外设中断怎么使用配置,系统时间函数说明等等都没有。但是相信富芮坤这方面一定会做得更好。
    六、关键代码
    void simple_peripheral_init(void)
  • {
  •        demo_LCD_APP();       
  •         Wifi_delay_1ms(2000);
  •         esp_init();
  •         //SendStr("hello");
  •         //demo_LCD_APP();                                                                    //显示屏
  •         demo_CAPB18_APP();                                                            //气压计
  •         demo_SHT3x_APP();                                                            //温湿度
  •         gyro_dev_init();                                                            //加速度传感器
  •         lcd_show_logo(lcd_show_workmode[App_Mode]);//刷新,显示当前模式的名称
  •        
  •         //OS Timer
  •         os_timer_init(&timer_refresh,timer_refresh_fun,NULL);//创建一个周期性1s定时的系统定时器
  •         os_timer_start(&timer_refresh,1000,1);
  •         os_timer_init(&timer_espsend_fresh,timer_espsend_fun,NULL);//创建一个周期性1s定时的系统定时器
  •         os_timer_start(&timer_espsend_fresh,3000,2);
  • }
  • 复制代码
    void timer_refresh_fun(void *arg)
  • {
  •         /*SendStr("hello");
  •         SendLR();*/
  •         uint8_t LCD_ShowStringBuff[30];
  •         int8_t ret=0;
  •         //SHT30数据读取,并在lcd上显示
  •         LCD_ShowChinese(20,100,6,16,BLUE);   //温
  •         LCD_ShowChinese(40,100,7,16,BLUE);  //度
  •         LCD_ShowChinese(20,120,8,16,BLUE);  //湿
  •         LCD_ShowChinese(40,120,9,16,BLUE);  //度
  •         LCD_ShowChinese(20,140,10,16,BLUE);  //气
  •         LCD_ShowChinese(40,140,11,16,BLUE);  //压
  •         ret = sht3x_measure_blocking_read(&temperature, &humidity);//Read temperature        humidity
  •         if (ret == STATUS_OK)
  •         {
  •                 co_printf("temperature = %d,humidity = %d\r\n",temperature,humidity);
  •                 sprintf((char *)LCD_ShowStringBuff,": %0.1f   ",temperature/1000.0);
  •                
  •                 LCD_ShowString(60,100,LCD_ShowStringBuff,BLACK);
  •                 sprintf((char *)LCD_ShowStringBuff,": %0.1f%%   ",humidity/1000.0);
  •                 LCD_ShowString(60,120,LCD_ShowStringBuff,BLACK);
  •        
  •         }
  •         else
  •         {
  •                 //co_printf("SHT30 error reading measurement\n");
  •                
  •                 sprintf((char *)LCD_ShowStringBuff,": error          ");
  •                 LCD_ShowString(60,100,LCD_ShowStringBuff,BLACK);
  •                 sprintf((char *)LCD_ShowStringBuff,": error          ");
  •                 LCD_ShowString(60,120,LCD_ShowStringBuff,BLACK);
  •         }
  •         //CAPB18数据读取,并在lcd上显示
  •         ret = CAPB18_data_get(&capb18_temp,&capb_airpress);
  •         if(ret == true)
  •         {
  •                 sprintf((char*)LCD_ShowStringBuff,": %7.5f  ",capb_airpress);
  •                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  •                 LCD_ShowString(60,140,LCD_ShowStringBuff,BLACK);
  •         /*
  •                 sprintf((char*)LCD_ShowStringBuff,"CAPB18_TMP= %7.5f  ",capb18_temp);
  •                 co_printf("%s\r\n",LCD_ShowStringBuff);
  •                 LCD_ShowString(20,200,LCD_ShowStringBuff,BLACK);*/
  •         }
  •         else
  •         {
  •                 //co_printf("CAPB18 error reading measurement\n");
  •                 sprintf((char*)LCD_ShowStringBuff,": error                 ");
  •                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  •                 LCD_ShowString(60,140,LCD_ShowStringBuff,BLACK);
  •        
  •                 //sprintf((char*)LCD_ShowStringBuff,"CAPB18_TMP= error                 ");
  •                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  •                 //LCD_ShowString(20,200,LCD_ShowStringBuff,BLACK);
  •         }
  • }
  • 复制代码
    void timer_espsend_fun(void *arg)
  • {
  •         uint8_t StringBuff[40];
  •         sprintf((char *)StringBuff,"Temperature= %0.1f     \n",temperature/1000.0);
  •         esp_send(StringBuff);
  •         Wifi_delay_1ms(10);
  •         sprintf((char *)StringBuff,"Humidity= %0.1f%%   \n",humidity/1000.0);
  •         esp_send(StringBuff);
  •         Wifi_delay_1ms(10);
  •         sprintf((char*)StringBuff,"Press= %3.3fKPa  ",capb_airpress/1000.0);
  •         esp_send(StringBuff);
  •         Wifi_delay_1ms(10);
  • }
  • 复制代码
    七、总结
    由于最近事情很多,时间很匆忙,做得一个很小的物联网方案。使用Wifi模块连接到家里的路由器,借助远程TCP服务器,把家里的温度、湿度、大气压情况发送到手机端。这样能在局域网内观察到家里的温度、湿度、大气压情况,在广域网也能观察到家里的温度、湿度、大气压情况。方案内容不多,还有很可以改进的地方,没有时间将设备接入物联网平台很是遗憾,但是后面会重新改进。后面会使用开发板的BLE5.0 蓝牙功能,因为这才是FR8016H物联网开发板的重点,后面有时间还会进行这方面的学习分享。