手把手教你开发基于单片机的wifi通信的物联网项目(远程灯控制)

图片


《《《《《正文》》》》》


 

《前言》

本文主要介绍开发一个基于单片机的wifi通信远程灯控制的方法,单片机只需支持UART通信即可,以实现最简单的远程控制开关、远程控制亮度,配网后,只需手机联网就可控制联网设备;

本文的wifi模块是基于涂鸦智能的wifi模块,主芯片使用STM32F103C8T6;wifi模块与主芯片使用最基本的UART串口实现通信;


 

《WIFI模块申请》

1、登入涂鸦智能loT平台;

    平台网址:https://www.tuya.com/cn/

图片


2、创建产品;

图片


3、方案选择;

方案选择wifi,点击创建产品。这里有很多涂鸦自己定义的产品,我们先选这个;其他可根据自己的项目选择;

图片


 

4、功能定义;

第3步之后会跳出功能选择;选择自己需要的功能;

我定义了开关状态值,bool类型表示开\关;以及亮度值,Value类型表示亮度,从0-1000;

图片

图片


5、选择手机app面板;

下载手机涂鸦智能App,这里我使用了涂鸦提供的界面,这个界面根据自己需求开发,或者有特殊要求也可以提交需求,涂鸦会帮你开发;

图片

图片


6、选择wifi模组,并下单购买;

下面是我的模块,你选择一个模块就行;

图片


7、其他默认即可;等待模块快递寄到;


 

 

《硬件设计》

1、获取模组封装尺寸;

在硬件开发下,模组详情下获取封装尺寸;

图片


2、下面这个是我的封装尺寸,涂鸦自家的模块封装尺寸都差不多

图片

图片

3、画模块封装pcblib;

这里我自己画的,带3D;供参考;下载地址:

https://pan.baidu.com/s/1hqxgKS46EaokUoN7utyw7g

提取码:airX

图片

图片


 

4、原理图设计:

按键是长按5s进入配网;灯是指示wifi模块工作状态,常亮表示联网正常,长灭表示未配网;快闪表示正在配网状态;wifi模组与MCU使用usart串口连接;这里的按键口A_14和灯口A_19注意,会在下面代码配置里使用到;

图片

图片

图片


5、布板

略。。。。就是拉拉线,没什么特殊要求;

我的部分pcb;

图片


6、回来的板子;

图片

焊接后:这里我把最初的原理图端口和封装端口左右镜像弄反了,所以只能这么焊;上面分享的封装资源是修改后ok的;

图片


 

《软件设计》

当中涉及的PWM、UART等模块代码可参考以下文章。

基于C语言的机械按键模块化软件开发(模块化程度高,可高速移植)

STM32F103之脉冲宽度调制(PWM)模块开发(含呼吸灯实例源代码)

STM32F103之时基中断(TIM)模块开发

STM32F103调试串口(USART)模块开发(内含Printf重定向函数说明)


 

软件其实主要是模块与主芯片之间的UART通信;我这里使用涂鸦的提供的WIFI的SDK进行移植;


 

1、获取我上面文章的USART模块代码;

相关代码获取地址:

https://pan.baidu.com/s/1zyrOF18WxIq0H3_4qU7Evg

关注公众号,发送1234,获取提取码;

图片


2、获取SDK:进入涂鸦平台,进入产品开发,在硬件开发的最下面下载MCU_SDK,这里有很多资料,都可以下载看看;

图片

图片


3、打开下载包,将里面的mcu_sdk复制到usart工程文件下,除了VERSION.md文件,其他都加入工程;

图片

 

图片


3、下面开始移植,涂鸦有移植教学文档;在网站的文档中心搜索移植就可以找到移植说明文档,这里你可以看他的文档详细些;下面是我的移植过程;

图片


4、在文件路径中添加mcu_sdk文件路径;

图片


把wifi.h头文件写到main.h

图片


把main.h头文件写在wifi.h里

图片

这个时候编译还有很多问题,不急;


 

5、我们模块的方式使用模块自处理模式,找到protocol.h下将这个功能宏定义打开;并根据硬件,指示灯GPIO是A_19,就是19,按键GPIO是A_14,就是14,如下代码:

图片


6、在protocol.c添加字节发送函数;

图片


7、在USART串口接收中断函数中添加uart_receive_input()函数;如下:

图片


8、在protocol.c的all_data_update函数上传自己初始化数据的;这个是用来上电更新所有数据的,我就默认上电关闭led,亮度值为1%,即10;如下代码;

图片

如果你本地改变了数据,就调用上面的各自的函数就能实现数据上传了;

  •  
  •  
mcu_dp_bool_update(DPID_SWITCH_LED,0); //BOOL型数据上报;mcu_dp_value_update(DPID_BRIGHT_VALUE,100); //VALUE型数据上报;

9、在protocol.c里有数据下传的函数,只要在这个函数里添加自己的响应操作就就可以实现wifi控制了;我这个有2个功能,开关和亮度,就有下面2个函数,有多少数据下传就有多少个函数;

图片

图片


10、在主函数main.c初始化调用wifi_protocol_init();usart波特率为9600;在死循环里调用wifi_uart_service();必须放在while(1),不要加任何判断;

int main(void){      NvicConfig();      USART_init(9600);        wifi_protocol_init();        for(;;)      {        wifi_uart_service();      }}

11、最后编译,把错误去掉,一般都是些中文。注释掉就可以了;

图片

图片

图片

图片

图片


12、下载,长按按键5s,涂鸦wifi就会进入配网状态,灯会快闪;打开手机涂鸦智能app进行配网;

这样整个联网就成功了;


 

《远程灯实例》

下面是我的涂鸦智能App控制LED亮灭、亮度的实例视频;也可使用4g,只要手机联网就可以远程控制;

代码地址:

https://pan.baidu.com/s/1ptGuLFsNW9MM5Xqv2Dmx6w

提取码:airX

 


《《《《《END》》》》》

图片

  • 6
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
很抱歉,我无法提供您所需要的详细程。但是,您可以在网络上寻找相关的程和资源,以学习和掌握51单片机的红外通信技术。以下是一个简单的红外通信示例程序,仅供参考: ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit IRIN = P3^2; //红外接收器引脚 sbit IRLED = P1^0; //红外发射器引脚 uchar code table[] = {0x02, 0x01, 0x0A, 0x08}; //红外发送数据 void delay(uint t) { while(t--); } void init() { TMOD = 0x01; //定时器0工作方式1 TH0 = 0x3C; //定时器0初值 TL0 = 0xB0; TR0 = 1; //启动定时器0 ET0 = 1; //使能定时器0中断 EA = 1; //使能总中断 } void main() { init(); while(1) { if(IRIN == 0) //检测到红外信号 { delay(200); //延时一段时间,等待信号稳定 if(IRIN == 0) //再次检测红外信号 { IRLED = 1; //红外发射器输出高电平 delay(150); //发射红外信号 IRLED = 0; //红外发射器输出低电平 } while(!IRIN); //等待红外信号结束 } } } void interruptTimer0() interrupt 1 { static uchar i = 0; TH0 = 0x3C; //定时器0初值 TL0 = 0xB0; i++; if(i >= 4) //发送完整个红外码 { i = 0; TR0 = 0; //停止定时器0 } if(table[i] & 0x01) //发送高电平 { IRLED = 1; } else //发送低电平 { IRLED = 0; } table[i] >>= 1; //移位,准备发送下一个数据位 } ``` 以上代码仅供参考,具体的实现方式和硬件电路配置可能因情况而异,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值