keil5开发案例分享 基于STM32设计遥控小车

一、环境介绍
小车主控mcu: stm32f103zet6 
stm32程序开发ide: keil5
stm32程序风格:  采用寄存器方式开发,注释齐全,执行效率高,方便移植
手机app:  采用qt设计,程序支持跨平台编译运行(android、ios、windows、linux都可以编译运行,对应平台上qt的环境搭建,之前博客已经发了文章讲解)
硬件包含:  淘宝购买的完整一套4轮遥控小车(采用stm32f103zet6作为主控板)、dht11温湿度传感器、中科微gps模块、esp8266
小车完整源码下载地址: https://download.csdn.net/download/xiaolong1126626497/19557040
app完整源码下载地址:   https://download.csdn.net/download/xiaolong1126626497/19557009
二、功能介绍 这是基于stm32设计的4轮遥控小车,支持通过android手机app、windows上位机完成对小车遥控;支持前进、后退、左转、右转、停止等操作。
小车上会实时采集温度、湿度、gps经纬度、通过esp8266 wifi上传至手机app,手机app收到数据之后,会将温湿度实时显示出来,经纬度收到后会调用百度地图,显示小车的位置,并且数据也会存放到数据库里,方便查看历史数据;支持范围内温湿度查询、最高温湿度、最低温湿度查询。
小车电机驱动模块采用l298n、wifi模块采用esp8266、mcu采用stm32f103c8t6、温湿度模块采用dth11、gps模块采用北斗gps+bds。

​ 

三、相关硬件介绍 ​

​ 

四、程序源码 硬件连接说明:  
gps接的串口1:   pa3(rx)   --5v~3.3v
wifi接的串口3:  pb10(tx)--->接esp8266的rx    pb11(rx)--->接esp8266的tx    --3.3v
dht11温湿度接:  pa7  

4.1  stm32小车端:  main.c源码#include stm32f10x.h#include led.h#include delay.h#include key.h#include usart.h#include #include timer.h#include bluetooth.h#include esp8266.h#include dht11.h#include gps.h#include motor.h/*硬件连接说明: gps接的串口1: pa3(rx) --5v~3.3vwifi接的串口3: pb10(tx)--->接esp8266的rx pb11(rx)--->接esp8266的tx --3.3vdht11温湿度接: pa7 */u8 esp8266_sendbuff[50];char buffer[1024];int main(){ u32 time_cnt=0; double longitude=120.086199; double latitude=30.139219; u8 temp=20; u8 humi=70; //延时2秒保证系统稳定 delay_ms(1000); delay_ms(1000); led_init(); beep_init(); usart1_init(115200); //串口调试 usart2_init(9600); //接gps模块 timer2_init(72,20000); usart3_init(115200); //串口-wifi esp8166_01默认波特率9600 esp8266_12f默认波特率115200 timer3_init(72,20000); //超时时间20ms printf(正在初始化请稍等.\r\n); printf(dht11_init:%d\r\n,dht11_init());//温湿度传感器初始化 printf(准备检测wifi硬件,请稍等...\r\n); //初始化wifi硬件 if(esp8266_init())printf(wifi硬件错误.\r\n); else { printf(wifi设备正常....\r\n); //配置wifi的模式 192.168.4.1 printf(wifi配置状态:%d\r\n,esp8266_ap_tcp_server_mode(esp8266_666,12345678,8089)); } motorinit(); //电机初始化 //电机脉冲控制 timer4_init(72,1000); while(1) { //接收到gps的数据 if(usart2_rx_flag) { usart2_rx_buffer[usart2_rx_cnt]='\0'; //解析经纬度 gps_gnrmc_decoding((char*)usart2_rx_buffer,&longitude,&latitude); usart2_rx_cnt=0; usart2_rx_flag=0; //打印到串口调试助手 printf(gps:%f,%f\r\n,longitude,latitude); } //接收到wifi的数据 if(usart3_rx_flag) { usart3_rx_buffer[usart3_rx_cnt]='\0'; printf(wifi:%s\r\n,usart3_rx_buffer); strcpy(buffer,(char*)usart3_rx_buffer); usart3_rx_cnt=0; usart3_rx_flag=0; beep=1; delay_ms(50); beep=0; if(strstr((char*)buffer,:a)) { printf(向前...\r\n); cargo(); } else if(strstr((char*)buffer,:b)) { printf(后退...\r\n); carback(); } else if(strstr((char*)buffer,:c)) { printf(向左...\r\n); carleft(); } else if(strstr((char*)buffer,:d)) { printf(向右...\r\n); carright(); } else if(strstr((char*)buffer,:e)) { printf(停止...\r\n); carstop(); } } time_cnt++; delay_ms(10); //判断轮询时间 if(time_cnt>=100*2) { time_cnt=0; //读取温湿度数据 dht11_read_data(&temp,&humi); sprintf((char*)esp8266_sendbuff,#%d,%d,%f,%f,temp,humi,longitude,latitude); //向服务器上传数据 esp8266_serversenddata(0,esp8266_sendbuff,strlen((char*)esp8266_sendbuff)); //打印到串口调试助手 printf(esp8266_sendbuff:%s\r\n,(char *)esp8266_sendbuff); //运行状态 motor_led=!motor_led; } }} 4.2 stm32小车端: 电机控制源码#include motor.h//全局变量定义unsigned int speed_count=0;//占空比计数器 50次一周期int front_left_speed_duty=speed_duty;int front_right_speed_duty=speed_duty;int behind_left_speed_duty=speed_duty;int behind_right_speed_duty=speed_duty;unsigned char continue_time=0;//根据占空比驱动电机转动void carmove(void){ behind_right_en; //右前轮 if(front_right_speed_duty > 0)//向前 { if(speed_count < front_right_speed_duty) { front_right_go; }else //停止 { front_right_stop; } } else if(front_right_speed_duty < 0)//向后 { if(speed_count 0)//向前 { if(speed_count < behind_left_speed_duty) { behind_left_go; } else //停止 { behind_left_stop; } } else if(behind_left_speed_duty < 0)//向后 { if(speed_count apb2enr|=1crl&=0xf0f0f0f0; gpiod->crl|=0x03030303; gpioc->crh&=0xffff0fff; gpioc->crh|=0x00003000; carstop();} 4.3  stm32小车端:  esp8266 wifi源码#include esp8266.hu8 esp8266_ip_addr[16]; //255.255.255.255u8 esp8266_mac_addr[18]; //硬件地址/*函数功能: esp8266命令发送函数函数返回值:0表示成功 1表示失败*/u8 esp8266_sendcmd(char *cmd){ u8 i,j; for(i=0;i<10;i++) //检测的次数--发送指令的次数 { usart3_rx_flag=0; usart3_rx_cnt=0; usartx_stringsend(usart3,cmd); delay_ms(200); if(usart3_rx_flag) { usart3_rx_buffer[usart3_rx_cnt]='\0'; usart3_rx_flag=0; usart3_rx_cnt=0; if(strstr((char*)usart3_rx_buffer,ok)) { return 0; } } } return 1;}/*函数功能: esp8266硬件初始化检测函数函数返回值:0表示成功 1表示失败*/u8 esp8266_init(void){ esp8266_sendcmd(+++); delay_ms(200); esp8266_sendcmd(+++); delay_ms(200); return esp8266_sendcmd(at\r\n);}/*函数功能: 一键配置wifi为ap+tcp服务器模式函数参数:char *ssid 创建的热点名称char *pass 创建的热点密码 (最少8位)u16 port 创建的服务器端口号函数返回值: 0表示成功 其他值表示对应错误值*/u8 esp8266_ap_tcp_server_mode(char *ssid,char *pass,u16 port){ char *p; u8 i; char tmp_buff[100]; /*1. 测试硬件*/ if(esp8266_sendcmd(at\r\n))return 1; /*2. 关闭回显*/ if(esp8266_sendcmd(ate0\r\n))return 2; /*3. 设置wifi模式*/ if(esp8266_sendcmd(at+cwmode=2\r\n))return 3; /*4. 复位*/ esp8266_sendcmd(at+rst\r\n); delay_ms(1000); delay_ms(1000); delay_ms(1000); /*5. 关闭回显*/ if(esp8266_sendcmd(ate0\r\n))return 5; /*6. 设置wifi的ap模式参数*/ sprintf(tmp_buff,at+cwsap=\%s\,\%s\,1,4\r\n,ssid,pass); if(esp8266_sendcmd(tmp_buff))return 6; /*7. 开启多连接*/ if(esp8266_sendcmd(at+cipmux=1\r\n))return 7; /*8. 设置服务器端口号*/ sprintf(tmp_buff,at+cipserver=1,%d\r\n,port); if(esp8266_sendcmd(tmp_buff))return 8; /*9. 查询本地ip地址*/ if(esp8266_sendcmd(at+cifsr\r\n))return 9; //提取ip地址 p=strstr((char*)usart3_rx_buffer,apip); if(p) { p+=6; for(i=0;*p!='';i++) { esp8266_ip_addr[i]=*p++; } esp8266_ip_addr[i]='\0'; } //提取mac地址 p=strstr((char*)usart3_rx_buffer,apmac); if(p) { p+=7; for(i=0;*p!='';i++) { esp8266_mac_addr[i]=*p++; } esp8266_mac_addr[i]='\0'; } //打印总体信息 printf(当前wifi模式:ap+tcp服务器\n); printf(当前wifi热点名称:%s\n,ssid); printf(当前wifi热点密码:%s\n,pass); printf(当前tcp服务器端口号:%d\n,port); printf(当前tcp服务器ip地址:%s\n,esp8266_ip_addr); printf(当前tcp服务器mac地址:%s\n,esp8266_mac_addr); return 0;}/*函数功能: tcp服务器模式下的发送函数发送指令: */u8 esp8266_serversenddata(u8 id,u8 *data,u16 len){ u8 i,j,n; char esp8266_sendcmd[100]; //组合发送过程中的命令 for(i=0;i)) { //继续发送数据 usartx_datasend(usart3,data,len); //等待数据发送成功 delay_ms(200); if(usart3_rx_flag) { usart3_rx_buffer[usart3_rx_cnt]='\0'; usart3_rx_flag=0; usart3_rx_cnt=0; if(strstr((char*)usart3_rx_buffer,send ok)) { return 0; } } } } } return 1;} 4.4  qt软件端代码布局 ​


奥地利电信A1将选择诺基亚作为5G网络建设的合作伙伴
对飚骁龙!联发科技杀入游戏市场
AGV自动搬运机器人采用红外反射式光电传感器
盛弘统一电能质量调节器 电能质量+选配储能方案来袭
加密货币生态目前的发展情况分析
keil5开发案例分享 基于STM32设计遥控小车
新手24字走遍CAD
08年IC产业增长前景黯淡因为产能平衡需求疲软
如何保护听力?这些伤耳的习惯要改掉
ME7660CS1G充电泵直流-直流电压转换器
创意火环LED灯DIY教程
工信部发布车联网无限电专用频率,助力智能网联汽车产业发展
2021年,5G智能手机出货量预计将达到5亿部
内控管理信息系统六大经济业务管理功能,增强会计信息数据准确性
关于研究人员开发出新设备帮助盲人改善恢复视力的办法浅解
高德地图电子眼服务全新升级,新增抓拍种类和罚单高发提醒
吸尘器的辐射有多大
BobotMOP8300电动拖把评测 表现几乎可以用完美形容
通信网络是主要功能
高速USB总线转接芯片CH347概述、特点及封装