24176|72

732

帖子

2

TA的资源

纯净的硅(中级)

楼主
 

基于STM32和ESP8266的低成本物联网控制盒子 [复制链接]

 
本帖最后由 汤权 于 2016-11-30 10:18 编辑

        我之前发过一个帖子:https://bbs.eeworld.com.cn/thread-496527-1-1.html,这是关于搭建一个简单的智能家居系统。现在我把这个小智能家居系统给做了个小盒子出来了,目的是弄一个方便控制家庭常规电器的系统,可以实现手机联网状态下控制家里的电灯、电热水器、电风扇、大门、空调等等。
        整个系统的硬件构成是:主控STM32F103C8T6、wifi模块ESP8266、温湿度传感器SHT20、光强传感器、红外发射管、存储器AT24C02、蜂鸣器,以及一些洞洞板、杜邦线和一个塑料盒子。
        软件部分的话服务器使用的是CentOS,花钱买的服务器,一块钱一天,没办法,有钱就是任性!在服务器主机上用C语言写的一个简单的程序,设计支持100个账户同时登陆使用,没用数据库,用文件存储用户名和账号的,也没有其他数据,基本上这个服务器的作用就是进行数据透传任务。然后使用设计了安卓手机客户端软件,我不太会安卓程序设计,所以弄得比较粗超,界面也不绚丽,不过能凑合用,。        系统完成之后可以实现手机端对控制盒子进行控制,包括控制继电器以及读取终端传感器的数据。总体来说使用起来还是比较方便的,不过有的时候有一点延时存在,因为中间经过了一个远程的服务器,寄放在深圳好像是,网络可能会塞住。
        废话不多说了,看图吧还是。其实我给这个拍了一个视频,但是很气人的是我的手机上上个星期在公交车上被偷了,视频也没了,气死我了,我一直没买手机,就没有再拍视频了,所以。。。。。。





1 设计构想




        我的设计构想是很好的,一个主控节点连接多个从节点,这种方案类似什么Zigbee,其实我也没弄过ZigBee,猜测是差不多原理的。所有从节点通过433MHz的无线模块发送数据给主节点,整个系统只有主节点能够连入互联网,这样就可以使用分布式节点的方式采集各个角落的信息,而且使用的SI4432无线模块的传输距离还是很不错的,卖家说能穿2000米,用的是棒状天线。




                 

图2 设计原型

一开始使用我的带屏幕的开发板实验开发的,接了几个传感器实验实验,等时机成熟之后再转到实物上去的,我不会工业设计只好买了个壳给装了起来,还挺可爱。壳上顶了一个继电器模块,控制家电用的,我把我的电风扇、台灯都接上去了,可以使用,的用热熔胶封好了,电到了就不好了。




图3 实物正视图




图4 实物俯视图



图5 开肚图

        开肚之后大家会看见其实没什么玩意里面,就两块板子加点线什么的,做工很粗糙。手工DIY嘛,无所谓啦,能用就行了。有机会能做成工业产品那样的是最好了,呲呲




图6 服务器运行截图


        

图7 手机软件启动解锁界面



图8 手机登录界面



图9 手机运行主界面




图10 终端软件设计流程图

  终端盒子的程序设计是在RTOS基础上进行的,就4个线程吧,其实程序很简单,主要我觉得是与ESP8266模块的通信部分比较搞死人。








图11 服务器软件设计流程图





图12 安卓客户端软件设计流程图


        其他传感器的程序坛友们都会,我只想把我的ESP8266控制程序弄出来,因为我弄这个弄了不少时间,希望能够给想用ESP8266的朋友参考参考,写的不好见谅啊。

  1. RESULT AT_WaitResponse(u16 timeout)
  2. {
  3.         u8 c;
  4.         u16 pt = 0;
  5.         
  6. //         ÏèμèêÕμ½μúò»¸ö×Ö½ú£¬μèμúò»¸ö×Ö½ú2»é趨3¬ê±ê±¼ä£¬
  7. //         μ±êÕμ½μúò»¸ö×Ö½úÖ®oóoóÃæμÄ×Ö½úÔùé趨3¬ê±»úÖÆ

  8.         //μè′yêÕμ½Ö¸áî»ØÏÔêy¾Y
  9.         while(1)
  10.         {
  11.                 c = UartGetByte(USART2);
  12.                 if(c == '\r' || c == '\n')
  13.                 {
  14.                         ResultStr[pt++] = '\r';
  15.                         ResultStr[pt++] = '\n';
  16.                         ResultStr[pt] = '\0';
  17.                         printf("%s",ResultStr);        //′òó¡Ö¸áî»ØÏÔ
  18.                         break;
  19.                 }
  20.                 ResultStr[pt++] = c;
  21.         }
  22.         pt = 0;        //
  23. //         ResultStr[pt++] = UartGetByte(USART2);        //μè′y»ñè¡μúò»¸ö»Øó|×Ö·û′®
  24.         //»ñè¡esp8266μÄ»Øó|×Ö·û′®
  25.         while(1)
  26.         {
  27.                 if(UartGetByte2(USART2,(u32)timeout*1000,&c))
  28.                 {
  29.                         ResultStr[pt++] = c;
  30. //                         UartSendByte(USART1,c);
  31.                 }
  32.                 else
  33.                         break;
  34.         }
  35.         
  36.         ResultStr[pt] = '\0';        //ìí¼óò»¸ö½áêø·û
  37.         printf("%s",ResultStr);        //′òó¡
  38.         
  39.         //2éÕò·μ»ØμÄ×Ö·û′®ÖDóDûóDERROR»òÕßOKμ¥′ê
  40.         if(strstr((const char*)ResultStr,"OK"))
  41.         {
  42. //                 printf("OK");
  43.                 return AT_OK;
  44.         }
  45.         else if(strstr((const char*)ResultStr,"ERROR"))
  46.         {
  47. //                 printf("ERROR");
  48.                 return AT_ERROR;
  49.         }
  50.         return AT_ERROR;
  51. }

  52. //μè′yêÕμ½str×Ö·û′®Ôò·μ»Ø
  53. void AT_WaitResponse2(char *str)
  54. {
  55.         u8 c,i = 0,len = strlen(str),data;
  56.         QueueFlush(&Esp8266Queue);        //ÏèÇå¿Õ¶óáD»o3åÇø
  57.         //μè′yêÕμ½Ö¸áî»ØÏÔêy¾Y
  58.         while(UartGetByte3(USART1,&c) == 0)
  59.         {
  60.                 while(QueueGet(&Esp8266Queue,&data))
  61.                 {
  62.                         UartSendByte(USART1,data);
  63.                         if(data == str[i])
  64.                         {
  65.                                 i++;
  66.                                 if(i == len)
  67.                                 {
  68. //                                         printf("\r\nfind %s,breakout\r\n",str);
  69.                                         printf("\r\n");
  70.                                         return;
  71.                                 }
  72.                         }
  73.                         else
  74.                                 i = 0;
  75.                 }
  76.                 OS_Sleep(10);
  77.         }
  78. }

  79. //str1±íê¾Õyè·,str2±íê¾′íÎó,oˉêyóμóD·μ»ØÖμ
  80. RESULT AT_WaitResponse3(char *str1,char *str2)
  81. {
  82.         u8 c,cnt1 = 0,cnt2 = 0,len1 = strlen(str1),len2 = strlen(str2),data;
  83.         //μè′yêÕμ½Ö¸áî»ØÏÔêy¾Y
  84.         while(UartGetByte3(USART1,&c) == 0)
  85.         {
  86.                 while(QueueGet(&Esp8266Queue,&data))
  87.                 {
  88.                         UartSendByte(USART1,data);
  89.                         if(data == str1[cnt1])
  90.                         {
  91.                                 cnt1++;
  92.                                 if(cnt1 == len1)
  93.                                 {
  94. //                                         printf("\r\nfind %s,breakout\r\n",str1);
  95.                                         printf("\r\n");
  96.                                         return AT_OK;
  97.                                 }
  98.                         }
  99.                         else
  100.                                 cnt1 = 0;
  101.                         
  102.                         if(data == str2[cnt2])
  103.                         {
  104.                                 cnt2++;
  105.                                 if(cnt2 == len2)
  106.                                 {
  107. //                                         printf("\r\nfind %s,breakout\r\n",str2);
  108.                                         printf("\r\n");
  109.                                         return AT_ERROR;
  110.                                 }
  111.                         }
  112.                         else
  113.                                 cnt2 = 0;
  114.                 }
  115.                 OS_Sleep(10);
  116.         }
  117.         return AT_ERROR;
  118. }

  119. RESULT AT_Reset(void)
  120. {
  121.         printf("reset esp8266\r\n");
  122.         //rstòy½ÅμÄéÏéyÑضÔesp8266½øDD¸′λ2ù×÷
  123.         ESP8266_RST = 0;
  124.         delay_ms(10);
  125.         ESP8266_RST = 1;
  126.         delay_ms(10);
  127.         
  128.         AT_WaitResponse2("ready");
  129.         printf("reset done\r\n");
  130.         return AT_OK;
  131. }

  132. RESULT AT_Test(void)
  133. {
  134.         printf("test esp8266\r\n");
  135.         sprintf((char*)Usart2Buf,"AT\r\n");
  136.         UartSendStr(USART2,Usart2Buf);
  137.         AT_WaitResponse2("OK");
  138.         return AT_OK;
  139. }

  140. RESULT AT_Version(void)
  141. {
  142.         printf("esp8266 version\r\n");
  143.         sprintf((char*)Usart2Buf,"AT+GMR\r\n");
  144.         UartSendStr(USART2,Usart2Buf);
  145.         AT_WaitResponse2("OK");
  146.         return AT_OK;
  147. }

  148. RESULT AT_STA_AP(CWMODE mode)
  149. {
  150.         printf("esp8266 working mode\r\n");
  151.         sprintf((char*)Usart2Buf,"AT+CWMODE=%d\r\n",mode);
  152.         UartSendStr(USART2,Usart2Buf);
  153.         AT_WaitResponse2("OK");
  154.         return AT_OK;
  155. }

  156. RESULT AT_ListAP(void)
  157. {
  158.         printf("list avalible AP\r\n");
  159.         sprintf((char*)Usart2Buf,"AT+CWLAP\r\n");
  160.         UartSendStr(USART2,Usart2Buf);
  161.         AT_WaitResponse2("OK");
  162.         return AT_OK;
  163. }

  164. RESULT AT_JoinAP(char *ssid,char *passwd)
  165. {
  166.         printf("connect to ssid:%s with passwd:%s\r\n",ssid,passwd);
  167.         sprintf((char*)Usart2Buf,"AT+CWJAP="%s","%s"\r\n",ssid,passwd);
  168.         UartSendStr(USART2,Usart2Buf);
  169. //         AT_WaitResponse3("OK","ERROR");
  170.         return AT_WaitResponse3("OK","FAIL");
  171. }

  172. RESULT AT_QuitAP(void)
  173. {
  174.         printf("disconnect from AP\r\n");
  175.         sprintf((char*)Usart2Buf,"AT+CWQAP\r\n");
  176.         UartSendStr(USART2,Usart2Buf);
  177.         AT_WaitResponse2("OK");
  178.         return AT_OK;
  179. }

  180. RESULT AT_IP(void)
  181. {
  182.         printf("IP address\r\n");
  183.         sprintf((char*)Usart2Buf,"AT+CIFSR\r\n");
  184.         UartSendStr(USART2,Usart2Buf);
  185.         AT_WaitResponse2("OK");
  186.         return AT_OK;
  187. }

  188. //establish TCP connection
  189. RESULT AT_EstTCPCon(char *addr,u16 port)
  190. {
  191.         printf("establish TCP connection\r\n");
  192.         sprintf((char*)Usart2Buf,"AT+CIPSTART="TCP","%s",%d\r\n",addr,port);
  193.         UartSendStr(USART2,Usart2Buf);
  194.         //óDμÄÄ£¿éμÄ»Øó|êÇLinkedóDμÄêÇCONNECTED¼óOK£¬oüéËÄÔ¾-°¡
  195. //         AT_WaitResponse2("OK");
  196. //         AT_WaitResponse2("Linked");
  197.         return AT_WaitResponse3("Linked","Unlink");;
  198. }

  199. //·Çí¸′«Ä£ê½Ï·¢Ëílen¸ö×Ö½úμÄêy¾Y
  200. RESULT AT_SendData(u8 *data,u8 len)
  201. {
  202.         int i;
  203.         printf("send data\r\n");
  204.         sprintf((char*)Usart2Buf,"AT+CIPSEND=%d\r\n",len);
  205.         UartSendStr(USART2,Usart2Buf);
  206.         AT_WaitResponse2("OK");
  207.         for(i=0;i<len;i++)
  208.                 UartSendByte(USART2,data[i]);
  209.         AT_WaitResponse2("SEND OK");//μèμ½êÕμ½»Øó|
  210.         return AT_OK;
  211. }

  212. //Transparent transmission
  213. RESULT AT_DirectTrans(u8 sw)
  214. {
  215.         printf("transparent transmission\r\n");
  216.         if(sw == On)
  217.         {
  218.                 sprintf((char*)Usart2Buf,"AT+CIPMODE=1\r\n");
  219.                  UartSendStr(USART2,Usart2Buf);
  220.                 AT_WaitResponse2("OK");

  221.                 UartSendStr(USART2,"AT+CIPSEND\r\n");
  222.                 AT_WaitResponse2(">");
  223.                 return AT_OK;
  224.         }
  225.         else
  226.         {
  227.                  UartSendStr(USART2,"+++");
  228.                 return AT_OK;
  229.         }
  230. }
复制代码
也不知道怎么回事代码格式怎么那么差劲,而且中文还是乱码,这个是MDK的问题。安卓的代码也发上来,有兴趣的朋友可以看看,写的很将就,不是很规范,见谅啊。


啊,附件大于15M上传不了,上传到资源中心了,正在审核中,没法发链接,
附件链接:https://download.eeworld.com.cn/detail/%E6%B1%A4%E6%9D%83/563026。不知道为什么要一个芯币,估计上传的时候没改,抱歉啦。


此帖出自stm32/stm8论坛

最新回复

好好学习,天天向上加油,每一个人,加油,自己!!!   详情 回复 发表于 2024-11-13 11:42

赞赏

2

查看全部赞赏

点赞 关注(12)
个人签名亚里士缺德
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
学习一个
此帖出自stm32/stm8论坛
 
 

回复

9717

帖子

24

TA的资源

版主

板凳
 
汤大大威武

这个防水盒我也用过
此帖出自stm32/stm8论坛

点评

哈哈,我还不是大大啊,虾哥才是大大啊。这个防水壳才两三块钱,质量真心不错,我用电烙铁在上面打眼的,因为没电转,呲呲  详情 回复 发表于 2016-11-30 09:01
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
哈哈,手机界面做得好可爱,解锁界面很好看
此帖出自stm32/stm8论坛
 
 
 

回复

602

帖子

1

TA的资源

一粒金砂(中级)

5
 
厉害了   格式乱码,在MDK的设置里面改下General Editor Settings 下的 Encoding 就不会中文注释乱码了
此帖出自stm32/stm8论坛

点评

是么是么?天哪 我都不知道,非常感谢非常感谢,这个乱码问题烦我很久了。  详情 回复 发表于 2016-11-30 08:58
 
个人签名疏雨客晚归,荒烟乱,几许江南无晴!又落花,残香织梦,莫  莫  莫,白首衷肠……
 
 

回复

361

帖子

0

TA的资源

五彩晶圆(中级)

6
 
不错,我也弄过类似的东西,不过试用的移动的onenet平台。当时还加了PM2.5的数据,后来懒病犯了,就再没动过
此帖出自stm32/stm8论坛

点评

咦,其实我也有弄OneNet的,申请了OneNet的开发板还,平台很不错的。  详情 回复 发表于 2016-11-30 09:01
 
 
 

回复

1297

帖子

2

TA的资源

纯净的硅(中级)

7
 
全部走的是TCP连接吗?然后控制指令和传感器数据通过服务器直接中转了?
此帖出自stm32/stm8论坛

点评

嗯,是的,还没来得及加心跳包,不过试了下ESP8266也不会从服务器断开,就懒了没加了。  详情 回复 发表于 2016-11-30 09:04
 
 
 

回复

1万

帖子

26

TA的资源

裸片初长成(高级)

8
 
这篇文章不错,
此帖出自stm32/stm8论坛

点评

谢版主夸奖  详情 回复 发表于 2016-11-30 09:05
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

9
 
wajuka 发表于 2016-11-29 21:49
厉害了   格式乱码,在MDK的设置里面改下General Editor Settings 下的 Encoding 就不会中文注释 ...

是么是么?天哪  我都不知道,非常感谢非常感谢,这个乱码问题烦我很久了。
此帖出自stm32/stm8论坛

点评

在keil的Edit中打开Configuration选项,会弹出上面的选项卡,把上面选项卡里的Encoding选项选择为Chinese GB2312(simplified)代码即可。  详情 回复 发表于 2017-8-10 11:20
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

10
 
littleshrimp 发表于 2016-11-29 21:19
汤大大威武

这个防水盒我也用过

哈哈,我还不是大大啊,虾哥才是大大啊。这个防水壳才两三块钱,质量真心不错,我用电烙铁在上面打眼的,因为没电转,呲呲
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

11
 
yayasoso 发表于 2016-11-29 21:56
不错,我也弄过类似的东西,不过试用的移动的onenet平台。当时还加了PM2.5的数据,后来 ...

咦,其实我也有弄OneNet的,申请了OneNet的开发板还,平台很不错的。
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

12
 
johnrey 发表于 2016-11-29 22:03
全部走的是TCP连接吗?然后控制指令和传感器数据通过服务器直接中转了?

嗯,是的,还没来得及加心跳包,不过试了下ESP8266也不会从服务器断开,就懒了没加了。
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

13
 

谢版主夸奖
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

1万

帖子

2854

TA的资源

管理员

14
 
已经上传的资源我已经都审核完了哦
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 

回复

1万

帖子

2854

TA的资源

管理员

15
 
楼主快更新下附件链接把
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

好的,thankyou  详情 回复 发表于 2016-11-30 10:16
 
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

16
 
okhxyyo 发表于 2016-11-30 10:10
楼主快更新下附件链接把

好的,thankyou
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

1万

帖子

2854

TA的资源

管理员

17
 
上传时默认的是1积分哦。扣的是积分不是芯币哦。你可以自己调整售价。如果你想要更改售价可以联系我进行更改。
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

喔喔,帮我把这个改成0积分下载吧,不想弄什么下载屏障。  详情 回复 发表于 2016-11-30 11:40
 
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

18
 
okhxyyo 发表于 2016-11-30 11:34
上传时默认的是1积分哦。扣的是积分不是芯币哦。你可以自己调整售价。如果你想要更改售价可以联系我进行更 ...

喔喔,帮我把这个改成0积分下载吧,不想弄什么下载屏障。thankyou
此帖出自stm32/stm8论坛

点评

已经调整好了  详情 回复 发表于 2016-11-30 15:00
 
个人签名亚里士缺德
 
 

回复

1万

帖子

2854

TA的资源

管理员

19
 
汤权 发表于 2016-11-30 11:40
喔喔,帮我把这个改成0积分下载吧,不想弄什么下载屏障。thankyou

已经调整好了
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 

回复

1702

帖子

4

TA的资源

纯净的硅(初级)

20
 
先赞一个吧,暂时没有看懂
此帖出自stm32/stm8论坛

点评

啊?我已经很用心得写了,估计表达能力不好,也难怪我高考语文没及格、、、、、  详情 回复 发表于 2016-11-30 15:38
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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