主控STM32配合ESP8266 实现手机app远程控制

(一)手机端android app代码

Android app 代码如下:
Android手机appTCP通信

(二) 单片机STM32单片机主程序代码

//代码共计79行
//日期:2020.2.22
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "stm32f10x.h"
#include "wifi_modul.h"
#include "tim_3.h"
#include "stdlib.h"
#include "string.h"
#define WIFI_HOT "\"CMCC-bqb6\",\"qywkaaf7\""
//¶¨Òå·ÓÉÆ÷Èȵ㣬TCP·þÎñÆ÷¶Ë¿Ú£¬ESP8266mode
u8 * wifi_hot=(u8*)WIFI_HOT;
 

u8 RX_cnt=0,tim1s_flag=0;
u8 hardware_init()
{
  u8 set_succflg=0;
  delay_init();	    //ÑÓʱº¯Êý³õʼ»¯
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //ÉèÖÃÖжÏǶÌ×ÏòÁ¿
  LED_Init();		  	//³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
  TIM3_Int_Init(9999,7199);  //TIM3¼Æʱ1s
  KEY_Init();
  uart3_init(115200);
  uart1_init(115200);
  wifi_modul_init();
  set_succflg=esp8266_AT_init(wifi_hot);   //ESP8266³õʼ»¯£¬Á¬½Ó·ÓÉÆ÷£¬²¢¿ªÆôAPģʽ
  return set_succflg;
}

 int main(void)
 {
   u8 connect_flag;
   hardware_init();
	while(1)
	{  
        if(USART3_RX_STA==0){
            if(!mystrcmp(USART3_RX_BUF,(u8 *)"+IPD")){              //Ô¶³Ì¶Ë·¢À´µÄÏûÏ¢ÑéÖ¤Ö¡Í·ÊÇ·ñÕýÈ·£¬ÕýÈ·×°ÈëCMDÊý×é
                copy_string(USART3_RX_CMD_BUF[cmd_cnt++],USART3_RX_BUF,(USART3_RX_CMD_STA&0x3fff));    //½âÎöÊÇÃüÁÔò×°ÈëÃüÁîÊý×é
                if(cmd_cnt){
                        cmd_cnt--;                 
                    switch(cmd_Resolve(USART3_RX_CMD_BUF[cmd_cnt]))    //ÃüÁî´¦Àíº¯Êý
                    {
                        case '0': 
                              LED1=1;
                              LED0=1;
                              break;                              
                        case '1':
                              LED1=0;
                              LED0=0;
                              break;
                       default:                                     //Ö¡½âÎö´íÎó
                              break;
                    }
                      
                }
                USART3_RX_BUF[0]='X';
             }
            if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT"))  //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó´ò¿ªÏûÏ¢
                connect_flag=1;
            if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT FAIL"))    //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó¶Ï¿ªÏûÏ¢
                connect_flag=0;            
         }
         if((tim1s_flag>1)&&(connect_flag==1)){       //Èç¹ûIPÁ¬½ÓÕýÈ·£¬¶¨Ê±Ò²µ½´ï·¢ËÍSTM32ζÈ
               send_STM32Temp();
               tim1s_flag=0;
         }
        delay_ms(50);
	}
}
 
void TIM3_IRQHandler(void)   //TIM3¶¨Ê±ÖжÏ
{
	  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //¼ì²éTIM3¸üÐÂÖжϷ¢ÉúÓë·ñ
		{
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //Çå³ýTIMx¸üÐÂÖжϱêÖ¾
              tim1s_flag+=1;
		}
}


(三)项目总结与结果展示:

  • 关于switch case 结构,要注意switch的函数对象是数值,不是字符。
  • 代码一定要注意格式,开始不注意格式,后来一个小问题找了半天才找到,尤其是段if嵌套。
  • Android 程序不能在main Thread 里进行等待太长时间的操作,一定要放到子线程里,如需刷新主线程的页面,子线程必须调用handler配合Message来实现。
  • 项目实际使用的话最好用内网穿透,使用花生壳申请一个公网IP,登录路由器设置IP地址绑定设备序列号(防止路由器断电自动分配IP),设置内网穿透的对象的IP地址和端口号。这样在手机端就可以用任何网络控制STM32了。

结果:

  • 手机端远程控制开发板LED
  • 开发板每隔2秒上报给手机app一个温度数据
  • 整个框架实现了互相通信,其他的功能就没必要浪费时间做了,往里加就好。

你可能感兴趣的:(单片机:ST,兆易)