基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

发布者:数据之翼最新更新时间:2022-10-12 来源: csdn关键字:STM32  遥控小车  ESP8266 手机看文章 扫描二维码
随时随地手机看文章

一、环境介绍

小车主控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.3V

WIFI接的串口3:  PB10(TX)--->接ESP8266的RX    PB11(RX)--->接ESP8266的TX    --3.3V

DHT11温湿度接:  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("正在初始化请稍等.rn");

 

   printf("DHT11_Init:%drn",DHT11_Init());//温湿度传感器初始化

   

   printf("准备检测WIFI硬件,请稍等...rn");

    //初始化WIFI硬件

   if(ESP8266_Init())printf("WIFI硬件错误.rn");

   else

   {

       printf("WIFI设备正常....rn");

      //配置WIFI的模式   192.168.4.1

      printf("WIFI配置状态:%drn",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]='';

           //解析经纬度

           GPS_GNRMC_Decoding((char*)USART2_RX_BUFFER,&Longitude,&latitude);

           USART2_RX_CNT=0;

           USART2_RX_FLAG=0;

           //打印到串口调试助手

           printf("GPS:%f,%frn",Longitude,latitude);

       }

       

        

        //接收到WIFI的数据

        if(USART3_RX_FLAG)

        {

            USART3_RX_BUFFER[USART3_RX_CNT]='';

            printf("WIFI:%srn",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("向前...rn");

                CarGo();

            }

            else if(strstr((char*)Buffer,":b"))

            {

                 printf("后退...rn");

                CarBack();

            }

            else if(strstr((char*)Buffer,":c"))

            {

                 printf("向左...rn");

                 CarLeft();

            }

            else if(strstr((char*)Buffer,":d"))

            {

                 printf("向右...rn");

                 CarRight();

            }

            else if(strstr((char*)Buffer,":e"))

            {

                 printf("停止...rn");

                 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:%srn",(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 < (-1)*front_right_speed_duty)

{

FRONT_RIGHT_BACK;

}else                //停止

{

FRONT_RIGHT_STOP;

}

}

else                //停止

{

FRONT_RIGHT_STOP;

}

//左后轮

if(behind_left_speed_duty > 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 < (-1)*behind_left_speed_duty)

{

BEHIND_LEFT_BACK;

} else                //停止

{

BEHIND_LEFT_STOP;

}

}

else                //停止

{

BEHIND_LEFT_STOP;

}

}

 

 

//向前

void CarGo(void)

{

front_left_speed_duty=SPEED_DUTY;

front_right_speed_duty=SPEED_DUTY;

behind_left_speed_duty=SPEED_DUTY;

behind_right_speed_duty=SPEED_DUTY;

}

 

//后退

void CarBack(void)

{

front_left_speed_duty=-SPEED_DUTY;

front_right_speed_duty=-SPEED_DUTY;

behind_left_speed_duty=-SPEED_DUTY;

behind_right_speed_duty=-SPEED_DUTY;

}

 

//向左

void CarLeft(void)

{

front_left_speed_duty=-20;

front_right_speed_duty=SPEED_DUTY;

behind_left_speed_duty=-20;

behind_right_speed_duty=SPEED_DUTY+10;//增加后轮驱动力

}

 

//向右

void CarRight(void)

{

front_left_speed_duty=SPEED_DUTY;

front_right_speed_duty=-20;

behind_left_speed_duty=SPEED_DUTY+10;//增加后轮驱动力

behind_right_speed_duty=-20;

}

 

//停止

void CarStop(void)

{

front_left_speed_duty=0;

front_right_speed_duty=0;

behind_left_speed_duty=0;

behind_right_speed_duty=0;

}

 

 

 

/*

FRONT_LEFT_F_PIN PG13 左前前进IO

FRONT_LEFT_B_PIN PG11 左前后退IO

FRONT_RIGHT_F_PIN PC11 右前前进IO

FRONT_RIGHT_B_PIN PD0   右前后退IO

BEHIND_LEFT_F_PIN PD6     左后前进IO

BEHIND_LEFT_B_PIN PG9     左后后退IO

右后电机的两个控制IO这里改为两路使能EN1、EN2,高电平有效

BEHIND_RIGHT_F_PIN PD4     右电机使能IO

BEHIND_RIGHT_B_PIN PD2     左电机使能IO

*/

void MotorInit(void)

{

RCC->APB2ENR|=1<<8; //PG

[1] [2]
关键字:STM32  遥控小车  ESP8266 引用地址:基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

上一篇:基于STM32设计的小说阅读器(翻页、字体切换、颜色切换、语音播报)
下一篇:基于STM32的录音机设计(STM32F103+VS1053B)

推荐阅读最新更新时间:2024-10-31 17:01

I2C协议的解析
I2C协议的产生 I2C通讯协议由Phiilps公司开发,由于引脚少,硬件实现简单,可拓展性强,不需要 USART,CAN等通讯协议的外部收发设备,被广泛使用在多个集成电路IC间的通讯。 I2C协议的物理层 1)支持设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可链接多个I2C通讯设备 支持多个通讯主机及多个通讯从机 2)I2C总线只使用两条总线线路,一条双向串行数据线SDA,一条串行时钟线SXL。 数据线就是用来表示数据,时钟线用来数据收发同步 3)每个设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问 4)总线通过上拉电阻接到电源。当I2C设别空闲的时候输出高阻态,而当所有的设备都空闲
[单片机]
I2C协议的解析
STM32 UART常用的3种中断接收
#include sys.h #include usart.h #include main.h //如果使用ucos,则包括下面的头文件即可. #if SYSTEM_SUPPORT_OS #include includes.h //ucos 使用 #endif //注意,读取USARTx- SR能避免莫名其妙的错误 u8 USART1_RX_BUF ; //接收缓冲,最USART_RX_LEN个字节 u8 USART2_RX_BUF ; //接收缓冲,最USART_RX_LEN个字节 u8 USART1_TX_BUF ; //发送缓冲,最大USART_TX_LEN个字节 u8 USART2_TX_BUF ; //
[单片机]
STM32学习——EXTI外部中断
EXTI简介 EXTI可以实现对外部输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 可以看到EXTI一共有20条信号线,即可同时检测来自20路的中断请求。 代码实现 (1)首先配置GPIO初始化结构体 GPIO要配置为浮空输入 void Key_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStruc
[单片机]
<font color='red'>STM32</font>学习——EXTI外部中断
玩转STM32CubeMX | STM32内部FLASH
1.内部FLASH简介 之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示 STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成 *主存储器:用来存放代码和数据常量,起始地址是0x08000000,BOOT0和BOOT1都接GND时,就是从该起始地址运行
[单片机]
玩转STM32CubeMX | <font color='red'>STM32</font>内部FLASH
工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯(二)
用PWM生成正弦波   有了PWM,自然就可以用PWM的方法生成正弦波了。下面生成500Hz正弦波的方法参考自张明峰的《PIC单片机入门与实践》   每个正弦波分成四个像限,每个像限16点,共64点,每点出现2个PWM周期,故PWM的周期为:2ms/128=156.25us,频率为64KHz。   TIM3 Frequency = TIM3 counter clock/(ARR + 1)   倒过来:   ARR=TIM3 Counter Clock/TIM3 Frequenc - 1 =562.5-1 =561   如果取ARR的值是561的话,那么实际的频率是64.056KHz,即最终生成为的正弦波频率
[模拟电子]
STM32+74HC595:带领你10分钟用对74HC595
使用的是STM32CBT8,小模块用起来性价比超级高,资源丰富,移植u/COS及HTTP、MQTT协议等等用起来简直欲罢不能,摇摇欲仙! BUT:IO口资源太少了,我想让你驱动100个LED,你缺告诉我,我的要求太多,你满足不了...... 还好,找到了74HC595,但是网上很多资源讲的我看了半天才总结、提炼并另辟蹊径出来精髓 ========================================================== 595具体使用的步骤: 第1步:目的:将要准备输入的位数据移入74HC595数据输入端上。 方法:送位数据到_595。 第2步:目的:将位数据逐位移入74HC595,即数据串入 方法:SH
[单片机]
stm32之备份寄存器(BKP)应用(侵入检测中断)
前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数。保存这些动态信息其实有很多种方法,第一种:在系统掉电前保存到片内flash,但是对flash的读写是按页操作,对于保存一些少量的数据来说并不合算。第二种:在系统掉电前保存在片外的EEPROM,可以根据需要选用合适的EEPROM存储的大小,但这样需要增加额外电路,增加成本。第三种:利用片内的备份寄存器里的后备数据寄存器存储。对于一些中、小型容量产品来说,有10个16位的数据后备寄存器。与前两种不同,它需要将引脚接上电池,否则数据会丢失。下面对备份寄存器深入了解。 1.备份寄存器的特性
[单片机]
<font color='red'>stm32</font>之备份寄存器(BKP)应用(侵入检测中断)
STM32的CAN总线的标识符过滤器组使用注意事项
CAN总线的标识符过滤器很重要。 1. 标识符过滤器是用于接收的,发送的时候无需设置过滤器,这点一定要整明白。 根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU多余的处理时间。 2 什么是标识符? 标识符主要包括如下,也可以简单的理解仅包含ID号,但是在这里下面这些都是要包含的。 比如:数据帧和遥控帧,标识符就包含在其中,所以发送端发帧数据给接收端后,接收端就可以通过硬件标识符过滤器进行筛选,节省了CPU时间: 3. 下面就是最重要的,STM32的CAN总线标识符滤波器组包含两种实现方法: 屏蔽位模式和标识符列表模式,这两种方式怎么理解呢,重点看下面的截图: 书面上解释
[单片机]
<font color='red'>STM32</font>的CAN总线的标识符过滤器组使用注意事项
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved