[RISC-V MCU 应用开发] 【RISC-V MCU CH32V103测评】-温度上传至Onenet-shihengrui⑥

[复制链接]
 楼主| nvjwiciw659 发表于 2020-12-6 23:58 | 显示全部楼层 |阅读模式
本帖最后由 nvjwiciw659 于 2020-12-7 09:26 编辑

最近出差,回到郑州发现暖气已经通了,有暖气的感觉真好.同时因为出差耽误了测评,现在我把之前搞得几个外设综合一下,做一个小DEMO,监测一下家里的温度.  

所用外设

* 1.GPIO 一直闪烁,表示运行状态
* 2.USART 串口,与8266通信必备
* 3.SPI 读写外部FLASH(记录上电次数,很无聊的一个功能)
* 4.TIM 定时器,用于计时
* 5.ADC 用于读取内部温度  


外观  

20201206234356.png

简单用杜邦线连了连,也没什么外观可言

GPIO  

这里只做了简单的点灯,通过计时器,1S中闪烁一次

USART&连接Onenet

上篇我写好了串口收发驱动,这次直接用就行,我们添加一些驱动,用的是最简单的HTTP协议,直接按文档POST即可,代码如下

  1. #include "ESP.h"
  2.     #include "tim.h"
  3.     #include "usart.h"
  4.     #include "debug.h"
  5.    
  6.     #include <stdio.h>
  7.     #include <string.h>
  8.    
  9.     #define DEVID   "********"
  10.    
  11.     #define APIKEY  "********"
  12.    
  13.     extern float tem;
  14.    
  15.     char *const esp_inti_cmd[][2] = {
  16.     "AT\r\n", "OK",
  17.     "ATE0\r\n", "OK",
  18.     "AT+CWMODE=3\r\n", "OK",
  19.     "AT+CWJAP="********","3673671040"\r\n", "GOT IP",
  20.     "AT+CIFSR\r\n", "OK",
  21.     "AT+CIPSTART="TCP","183.230.40.33",80\r\n", "CONNECT",
  22.     //"AT+CIPSEND=4\r\n", "OK",
  23.     //"test", "SEND OK",
  24.     0, 0};
  25.    
  26.     /*
  27.     串口发送函数
  28.     *str为指令
  29.     len为指令长度
  30.     */
  31.     void ESP_SendString(unsigned char *str, unsigned short len)
  32.     {
  33.         uint8_t i;
  34.         for(i=0;i<len;i++)
  35.         {
  36.             USARTx_SendByte(USART3, *(str+i));
  37.         }
  38.     }
  39.    
  40.     /*
  41.     AT指令发送函数
  42.     *cmd为AT指令
  43.     *res为需匹配的数据
  44.     timeOut未等待时间
  45.     匹配成功返回 0
  46.     匹配失败返回 1
  47.     */
  48.     _Bool ESP8266_SendCmd(char *cmd, char *res,uint16_t timeOut)
  49.     {
  50.         ESP_SendString((unsigned char *)cmd, strlen((const char *)cmd));//发送AT指令
  51.    
  52.         while(timeOut--)//等待
  53.         {
  54.             if(!uart2_rx.flag)                            //如果收到数据
  55.             {
  56.                 if(strstr((const char *)uart2_rx.rx_buff, res) != NULL)       //如果匹配到数据
  57.                 {
  58.                     CLEAR_UART2();                                   //清空缓存
  59.                     return 0;
  60.                 }
  61.             }
  62.             Delay_Ms(1);
  63.         }
  64.         return 1;
  65.     }
  66.    
  67.     /*
  68.     服务器下发解析函数
  69.     返回值为结构体
  70.    
  71.     ipd_rx.len
  72.     非下发数据返回:0
  73.     解析失败返回:-1
  74.     正确解析返回:数据长度
  75.     */
  76.     IPD_RX ESP8266_GetIPD(void)
  77.     {
  78.         IPD_RX ipd_rx;
  79.         uint8_t i;
  80.         char *ptrIPD = NULL;
  81.         ipd_rx.len = 0;
  82.         ptrIPD = strstr((char *)uart2_rx.rx_buff, "IPD,");                //搜索“IPD”头
  83.         if(ptrIPD == NULL)//没找到直接退出
  84.         {
  85.             ipd_rx.len = 0;
  86.             return ipd_rx;
  87.         }
  88.         else
  89.         {
  90.             ptrIPD = strchr(ptrIPD, ',');                           //找到','
  91.             ptrIPD++;
  92.             for(i=0;i<10;i++)//获取数据长度
  93.             {
  94.                 if((ptrIPD[i]>='0')&&(ptrIPD[i]<='9'))
  95.                 {
  96.                     ipd_rx.len = ipd_rx.len*10+(ptrIPD[i]-'0');
  97.                 }
  98.                 else    break;
  99.             }
  100.             ptrIPD = strchr(ptrIPD, ':');                           //找到':'
  101.             if(ptrIPD != NULL)
  102.             {
  103.                 ptrIPD++;
  104.                 ipd_rx.IPD_buff = (uint8_t *)(ptrIPD);
  105.                 return ipd_rx;
  106.             }
  107.             else
  108.             {
  109.                 ipd_rx.len = -1;
  110.                 return ipd_rx;
  111.             }
  112.         }
  113.     }
  114.    
  115.     _Bool esp_test(void)
  116.     {
  117.         uint8_t i;
  118.         for(i=0;i<100;i++)
  119.         {
  120.             if(esp_inti_cmd[i][0])
  121.             {
  122.                 if(ESP8266_SendCmd(esp_inti_cmd[i][0],esp_inti_cmd[i][1],5000))
  123.                 {
  124.                     printf("Init:%d error\r\n",i);//失败
  125.                 }
  126.                 else
  127.                 {
  128.                     printf("Init:%d ok\r\n",i);//成功
  129.                 }
  130.             }
  131.             else
  132.             {
  133.                 printf("ESP Init Success\r\n");
  134.                 return 0;//初始化完成
  135.             }
  136.         }
  137.         return 1;
  138.     }
  139.    
  140.     void OneNet_FillBuf(char *buf)
  141.     {
  142.         char text[24];
  143.         char buf1[128];
  144.    
  145.         memset(text, 0, sizeof(text));
  146.         memset(buf1, 0, sizeof(buf1));
  147.    
  148.         strcpy(buf1, "{");
  149.    
  150.         memset(text, 0, sizeof(text));
  151.         sprintf(text, ""Temperature":%f",tem);
  152.         strcat(buf1, text);
  153.    
  154.         strcat(buf1, "}");
  155.    
  156.         sprintf(buf, "POST /devices/%s/datapoints?type=3 HTTP/1.1\r\napi-key:%s\r\nHost:api.heclouds.com\r\n"
  157.                         "Content-Length:%d\r\n\r\n",
  158.    
  159.                         DEVID, APIKEY, strlen(buf1));
  160.    
  161.         strcat(buf, buf1);
  162.     }
  163.    
  164.     //==========================================================
  165.     //  函数名称:   OneNet_SendData
  166.     //
  167.     //  函数功能:   上传数据到平台
  168.     //
  169.     //  入口参数:   type:发送数据的格式
  170.     //
  171.     //  返回参数:   无
  172.     //
  173.     //  说明:
  174.     //==========================================================
  175.     void OneNet_SendData(void)
  176.     {
  177.    
  178.         char buf[256];
  179.         char buf1[50];
  180.         memset(buf, 0, sizeof(buf));
  181.         memset(buf1, 0, sizeof(buf1));
  182.    
  183.    
  184.         OneNet_FillBuf(buf);                                    //封装数据流
  185.         sprintf(buf1, "AT+CIPSEND=%d\r\n",strlen(buf));
  186.         ESP8266_SendCmd(buf1,"OK",5000);
  187.         ESP_SendString((unsigned char *)buf, strlen(buf));    //上传数据
  188.     }


SPI读写外部FLASH

这里我用了官方的例程,所以只发应用了

  1. /*记录上电次数*/
  2.         SPI_Flash_Read(&count,0x0,1);
  3.         Delay_Ms(100);
  4.         if(!count)
  5.             count++;
  6.         printf("Number of power on Is: %d\r\n",count);
  7.         count++;
  8.         SPI_Flash_Write(&count,0,1);
  9.         Delay_Ms(500)


TIM

我这里使用定时器主要就是做一个简单的计时,驱动也是例程写好的,直接运用了,就是用来让灯亮灭以及定时上传温度

  1. void TIM3_IRQHandler(void)
  2.     {
  3.         if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
  4.         {
  5.             if(tim_count%2)
  6.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
  7.             else
  8.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
  9.             tim_count++;
  10.             TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIM3的中断挂起位。
  11.         }
  12.     }  


ADC

使用ADC计算内部温度,上篇已经说过,这里就不贴代码了.

MAIN

贴一下main函数

  1. /*******************************************************************************
  2.     * Function Name  : main
  3.     * Description    : Main program.
  4.     * Input          : None
  5.     * Return         : None
  6.     *******************************************************************************/
  7.     int main(void)
  8.     {
  9.         u8 count;
  10.    
  11.         /*外设初始化*/
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  13.         Delay_Init();
  14.         USART_Printf_Init(115200);
  15.         USARTx_CFG();
  16.         adc_Init();
  17.         LED_Init();
  18.         SPI_Flash_Init();
  19.         TIM3_Int_Init(4999,7199);
  20.    
  21.    
  22.         /*记录上电次数*/
  23.         SPI_Flash_Read(&count,0x0,1);
  24.         Delay_Ms(100);
  25.         if(!count)
  26.             count++;
  27.         printf("Number of power on Is: %d\r\n",count);
  28.         count++;
  29.         SPI_Flash_Write(&count,0,1);
  30.         Delay_Ms(500);
  31.    
  32.         /*初始化串口缓存结构体*/
  33.         CLEAR_UART2();
  34.    
  35.         esp_test();
  36.         while(1)
  37.         {
  38.             if(tim_count>50)
  39.             {
  40.                 tim_count = 0;
  41.                 tem=get_temperature();
  42.                 printf("Temperature:%.2f\r\n",tem);
  43.                 CLEAR_UART2();
  44.                 OneNet_SendData();
  45.             }
  46.         }
  47.     }


展示一下Onenet的应用

20201206234330.png

算是基本完结了吧,USB功能一直没能尝试,明天又是周一了,又开始忙碌的一周,有时间再搞(一直想玩USB功能却一直没玩,害),沁恒加油!,俺一直稀罕你支持你,国产加油!最后说一句,期待573.

再展示一个一直想玩但没时间玩的,而且已经买了,板子已经偷偷画好的579

20201206234921.png

加油,打工人,奥里给!

哎哎哎,最后附上gitee链接,主要文件我都传了上去
https://gitee.com/shihengrui/ch32-vf103





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

本版积分规则

13

主题

79

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

13

主题

79

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部