本帖最后由 回到原点123 于 2018-2-27 10:34 编辑
由于放假在家,手里面什么模块都没有,所以只能做一些简单的了!
这次我准备通过咱们的涂鸦板 检测温度,上云,然后控制。
目标是:首先检测周围环境温度,然后上传云端;当温度比APP设定值大的时候,开启LED2。(用LED模拟继电器)
尴尬的是我手头上没有温湿度检测模块,所以想别的办法了。
我用的是另一个板子的MPU6050测出来的温度(之前我还不知道STM32有自带的温度传感器,可以检测芯片温度,看到ddllxxrr的帖子我才知道STM32还有这个功能)
好尴尬
原理是通过另一个板子的MPU6050模块测出温度值,然后通过串口传送给涂鸦板,然后上云,控制.
首先去涂鸦官网上创建产品、设置数据点、选择APP界面、下载MCU开发包。
然后移植SDK,(按照readme里面 和 程序里面的注释 操作就好了。) 之后加上串口通讯接受温度的程序就好了;
- <font size="1">void uart2_init(u32 bound){
- //GPIO¶Ë¿ÚÉèÖÃ
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //ʹÄÜUSART2
-
- //USART2_TX GPIOA.2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
- GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.2
-
- //USART2_RX GPIOA.3³õʼ»¯
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
- GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.3
- //Usart2 NVIC ÅäÖÃ
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ
- NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
-
- //USART ³õʼ»¯ÉèÖÃ
- USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
- USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½
- USART_Init(USART2, &USART_InitStructure); //³õʼ»¯´®¿Ú1
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжÏ
- USART_Cmd(USART2, ENABLE); //ʹÄÜ´®¿Ú1
- }
- void USART2_IRQHandler(void) //´®¿Ú2ÖжϷþÎñ³ÌÐò
- {
- u8 Res;
- #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS.
- OSIntEnter();
- #endif
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
- {
- Res =USART_ReceiveData(USART2); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
-
- if((USART2_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
- {
- if(USART2_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
- {
- if(Res!='D')USART2_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼
- else USART2_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË
- }
- else //»¹Ã»ÊÕµ½0X0D
- {
- if(Res=='E')USART2_RX_STA|=0x4000;
- else
- {
- USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
- USART2_RX_STA++;
- if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ
- }
- }
- }
- } </font>
复制代码
中断服务函数里面以‘’ED’为数据传输结束标志位,收到'ED'则表示一次温度接受完成。
- <font size="1">if(USART2_RX_STA&0x8000)
- {
- len=USART2_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
- printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n\r\n");
- printf("%d\r\n",len);
- temperature=0;
- temperature=USART2_RX_BUF[12]-'0'+(USART2_RX_BUF[11]-'0')*10;
- // for(t=0;t<len;t++)
- // {
- // temperature=atoi(USART2_RX_BUF);
- // temperature=temperature*10+USART2_RX_BUF[t];
- // }
- printf("%d",temperature);
- USART2_RX_STA=0;
- }</font>
-
复制代码把接受到的温度值,提取出来.
这个是串口调试助手收到的 温度值,第二行是数据长度,第三行是温度值。(由于是杜邦线连接,传输有时候不稳定)
这个是APP操作界面。
下面是视频演示效果。
|