lyj336

  • 0 主题
  • 0 帖子
  • 318 积分
  • 身份:LV2 初级技术员
  • E币:221

【富芮坤物联网开发板测评】 基于ESP8266的家庭环境监测

2020-7-12 21:35:41 显示全部楼层
本帖最后由 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的复用功能很多,如下所示。这就使得芯片的引脚可以灵活的运用起来。
  1. #define PORTD4_FUNC_D4              0x00
  2. #define PORTD4_FUNC_I2C0_CLK        0x01
  3. #define PORTD4_FUNC_I2S_CLK         0x02
  4. #define PORTD4_FUNC_PWM4            0x03
  5. #define PORTD4_FUNC_SSP0_CLK        0x04
  6. #define PORTD4_FUNC_UART0_RXD       0x05
  7. #define PORTD4_FUNC_UART1_RXD       0x06
  8. #define PORTD4_FUNC_ANT_CTL0        0x07
  9. #define PORTD4_FUNC_PDM_CLK         0x08
  10. #define PORTD4_FUNC_ADC0            0x0c

  11. #define PORTD5_FUNC_D5              0x00
  12. #define PORTD5_FUNC_I2C0_DAT        0x01
  13. #define PORTD5_FUNC_I2S_FRM         0x02
  14. #define PORTD5_FUNC_PWM5            0x03
  15. #define PORTD5_FUNC_SSP0_CSN        0x04
  16. #define PORTD5_FUNC_UART0_TXD       0x05
  17. #define PORTD5_FUNC_UART1_TXD       0x06
  18. #define PORTD5_FUNC_ANT_CTL0        0x07
  19. #define PORTD5_FUNC_PDM_DAT         0x08
  20. #define PORTD5_FUNC_ADC1            0x0c
因为UART1已经和co_printf()打印函数绑定到一起,所以我选择使用UART0来与Wifi模块进行通信。UART0初始化如下。
  1. void Wifi_Init(void)
  2. {
  3.        system_set_port_pull(GPIO_PD4, true);
  4.         system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);
  5.         system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);
  6.         uart_init(UART0, BAUD_RATE_115200);
  7. }
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,屏幕显示正常。

  1.     {
  2.         LCD_WR_REG(0xfe);
  3.         LCD_WR_REG(0xef);        
  4.                         
  5.         LCD_WR_REG(0x36);        
  6.         LCD_WR_DATA8(0x48);        
  7.         LCD_WR_REG(0x3a);        
  8.         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外设中断怎么使用配置,系统时间函数说明等等都没有。但是相信富芮坤这方面一定会做得更好。
六、关键代码

  1. void simple_peripheral_init(void)
  2. {
  3.        demo_LCD_APP();       
  4.         Wifi_delay_1ms(2000);
  5.         esp_init();
  6.         //SendStr("hello");
  7.         //demo_LCD_APP();                                                                    //显示屏
  8.         demo_CAPB18_APP();                                                            //气压计
  9.         demo_SHT3x_APP();                                                            //温湿度
  10.         gyro_dev_init();                                                            //加速度传感器
  11.         lcd_show_logo(lcd_show_workmode[App_Mode]);//刷新,显示当前模式的名称

  12.        
  13.         //OS Timer
  14.         os_timer_init(&timer_refresh,timer_refresh_fun,NULL);//创建一个周期性1s定时的系统定时器
  15.         os_timer_start(&timer_refresh,1000,1);
  16.         os_timer_init(&timer_espsend_fresh,timer_espsend_fun,NULL);//创建一个周期性1s定时的系统定时器
  17.         os_timer_start(&timer_espsend_fresh,3000,2);
  18. }
  1. void timer_refresh_fun(void *arg)
  2. {
  3.         /*SendStr("hello");
  4.         SendLR();*/

  5.         uint8_t LCD_ShowStringBuff[30];

  6.         int8_t ret=0;
  7.         //SHT30数据读取,并在lcd上显示
  8.         LCD_ShowChinese(20,100,6,16,BLUE);   //温
  9.         LCD_ShowChinese(40,100,7,16,BLUE);  //度
  10.         LCD_ShowChinese(20,120,8,16,BLUE);  //湿
  11.         LCD_ShowChinese(40,120,9,16,BLUE);  //度
  12.         LCD_ShowChinese(20,140,10,16,BLUE);  //气
  13.         LCD_ShowChinese(40,140,11,16,BLUE);  //压
  14.         ret = sht3x_measure_blocking_read(&temperature, &humidity);//Read temperature        humidity
  15.         if (ret == STATUS_OK)
  16.         {
  17.                 co_printf("temperature = %d,humidity = %d\r\n",temperature,humidity);
  18.                 sprintf((char *)LCD_ShowStringBuff,": %0.1f   ",temperature/1000.0);
  19.                
  20.                 LCD_ShowString(60,100,LCD_ShowStringBuff,BLACK);
  21.                 sprintf((char *)LCD_ShowStringBuff,": %0.1f%%   ",humidity/1000.0);
  22.                 LCD_ShowString(60,120,LCD_ShowStringBuff,BLACK);
  23.        
  24.         }
  25.         else
  26.         {
  27.                 //co_printf("SHT30 error reading measurement\n");
  28.                
  29.                 sprintf((char *)LCD_ShowStringBuff,": error          ");
  30.                 LCD_ShowString(60,100,LCD_ShowStringBuff,BLACK);
  31.                 sprintf((char *)LCD_ShowStringBuff,": error          ");
  32.                 LCD_ShowString(60,120,LCD_ShowStringBuff,BLACK);
  33.         }
  34.         //CAPB18数据读取,并在lcd上显示
  35.         ret = CAPB18_data_get(&capb18_temp,&capb_airpress);
  36.         if(ret == true)
  37.         {
  38.                 sprintf((char*)LCD_ShowStringBuff,": %7.5f  ",capb_airpress);
  39.                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  40.                 LCD_ShowString(60,140,LCD_ShowStringBuff,BLACK);
  41.         /*
  42.                 sprintf((char*)LCD_ShowStringBuff,"CAPB18_TMP= %7.5f  ",capb18_temp);
  43.                 co_printf("%s\r\n",LCD_ShowStringBuff);
  44.                 LCD_ShowString(20,200,LCD_ShowStringBuff,BLACK);*/
  45.         }
  46.         else
  47.         {
  48.                 //co_printf("CAPB18 error reading measurement\n");
  49.                 sprintf((char*)LCD_ShowStringBuff,": error                 ");
  50.                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  51.                 LCD_ShowString(60,140,LCD_ShowStringBuff,BLACK);
  52.        
  53.                 //sprintf((char*)LCD_ShowStringBuff,"CAPB18_TMP= error                 ");
  54.                 //co_printf("%s\r\n",LCD_ShowStringBuff);
  55.                 //LCD_ShowString(20,200,LCD_ShowStringBuff,BLACK);
  56.         }
  57. }
  1. void timer_espsend_fun(void *arg)
  2. {
  3.         uint8_t StringBuff[40];
  4.         sprintf((char *)StringBuff,"Temperature= %0.1f     \n",temperature/1000.0);
  5.         esp_send(StringBuff);
  6.         Wifi_delay_1ms(10);
  7.         sprintf((char *)StringBuff,"Humidity= %0.1f%%   \n",humidity/1000.0);
  8.         esp_send(StringBuff);
  9.         Wifi_delay_1ms(10);
  10.         sprintf((char*)StringBuff,"Press= %3.3fKPa  ",capb_airpress/1000.0);
  11.         esp_send(StringBuff);
  12.         Wifi_delay_1ms(10);
  13. }

七、总结
由于最近事情很多,时间很匆忙,做得一个很小的物联网方案。使用Wifi模块连接到家里的路由器,借助远程TCP服务器,把家里的温度、湿度、大气压情况发送到手机端。这样能在局域网内观察到家里的温度、湿度、大气压情况,在广域网也能观察到家里的温度、湿度、大气压情况。方案内容不多,还有很可以改进的地方,没有时间将设备接入物联网平台很是遗憾,但是后面会重新改进。后面会使用开发板的BLE5.0 蓝牙功能,因为这才是FR8016H物联网开发板的重点,后面有时间还会进行这方面的学习分享。



最新评论

楼层直达:
我要评论
0
3
广告
关闭 热点推荐上一条 /5 下一条
快速回复 返回列表