找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4927|回复: 4
收起左侧

关于单片机智能家居组网 提出一个结构

[复制链接]
ID:371965 发表于 2019-9-3 10:30 | 显示全部楼层 |阅读模式
前几天逛那个宝看到一个433模块,就买回来研究,经过测试,范围在200米以内(测试地点在公司宿舍 ,附近有很多干扰源),数据传输没有问题,然后之前闲着的时候做了一个小玩意,手机app通过手机蓝牙(可以用8266做wiif,公司宿舍没有WiFi就用了蓝牙),控制rgb彩灯,读取温度(18b20),光敏,电路中增加了人体检测,红外开关(类似循迹小车那种 ),还有一个语音识别,播报的模块,用来进行控制交互。
单片机使用15单片机,使用eerom保存温度上下限,实现rgb彩灯的呼吸灯,打算在此基础增加433模块,然后进行一个范围组网,上面说的这个为主机,可以放在有WiFi的地方,然后从机使用433模块与主机进行通讯,手机app通过蓝牙/wiif控制主机,主机在进行从机的控制,有兴趣的可以聊下,现在主机程序已经完成,从机程序简单,打算过几天去打几个板子,有兴趣的可以找我qq150-61-75-1-15

另外附上主机的程序电路下次附上

单片机源程序如下:
  1. #include"stdio.h"  //c语言 自带函数 (printf  函数)
  2. #include"DS18b20.h" //温度检测函数头文件
  3. #include"uart.h" //串口头文件
  4. #include"mode.h" //运算符函数
  5. #include"new.h"                //eeerom头文件/
  6. #include"adc.h"
  7. #include"pwm.h"
  8. #include<intrins.h> //左移右移函数
  9. #include<string.h> //字符操作函数
  10. #define u8 unsigned char
  11.         //串口接收数据缓存数组
  12. extern xdata u8 uart1_shou[uatr];//串口1 接收的数据
  13. extern xdata u8 uart2_shou[uatr];//串口2  接受的数据
  14. extern xdata u8 uart3_shou[uatr];//串口1 接收的数据
  15. extern xdata u8 uart4_shou[uatr];//串口2  接受的数据
  16. extern int mode1;
  17. extern int mode2;
  18. extern int mode3;
  19. extern int mode4;
  20. //温度读取  变量
  21. uint temp1=0;             // 18b202温度数据
  22. bit run_18b20=1;//温度报警启动标志位  1启动报警
  23. bit shou_18b20=1;//测试  只发送一次报警
  24. unsigned char ds_18b20num[]={"D00.0"};                //用来保存温度
  25. unsigned char ds_18b20H[]={"D30.5"};                //语音报警上限
  26. unsigned char ds_18b20L[]={"D20.5"};                //语音报警下限


  27. extern unsigned char ADC_nume[7];//光敏数据保存
  28. bit ET0_run=0;


  29. bit cbs=0;//超声波检测   检测人体
  30. //函数声明
  31. void key();//按键控制函数
  32. void ds18b20_num();///温度读取转换成字符函数
  33. void eerom();//eerom上电初始化函数

  34. void main(void)
  35. {                  
  36.                 //串口初始化
  37.        
  38.   io_init();//io引脚初始化
  39.         Uart1Init();//串口1  初始化
  40.         Uart2Init();//串口2  初始化
  41.         Uart3Init();//串口3  初始化
  42.         Uart4Init();//串口4  初始化
  43.         Timer0Init();
  44.         eerom();//EEROM操作函数

  45.         pwminit();//pwm控制rgb彩灯初始化
  46.         PWM_NUM(0,0,0);//RGB彩灯关闭
  47.         delay_ms(2000);//延时1秒钟   防止电脑上位机反应不过来
  48.         while(1)
  49.         {  
  50.                  UART_1();//蓝牙接口 以及上位机通讯使用
  51.                  UART_2();//语音模块播报使用
  52.                  UART_3();//备用  可以外接串口
  53.                  UART_4();
  54.                  ds18b20_num();//温度读取转换成字符数据
  55.                  ADC_shou();//检测光敏数据
  56.                  key();//板载按钮控制
  57.         }
  58. }

  59. void ds18b20_num()
  60. {
  61.         int wendu_h;//标志位  检测温度是否超过上限
  62.         int wendu_l;//标志位  检测温度是否低于下限       
  63.           ET0 = 0;           
  64.                 tmpchange();          //读取温度
  65.           temp1=ds_tmp();          //温度赋值
  66.                 ET0 = ET0_run;              
  67.           ds_18b20num[0]='D';
  68.                 ds_18b20num[1]=(temp1/100)+48;         //将温度转换成字符型
  69.                 ds_18b20num[2]=(temp1/10%10)+48;
  70.           ds_18b20num[4]=(temp1%10)+48;
  71. //检测温度值是否大于低于设定的上限下限
  72.         wendu_h=strcmp(ds_18b20num,ds_18b20H);
  73.         wendu_l=strcmp(ds_18b20num,ds_18b20L);
  74.         if(wendu_h>0&&run_18b20&&shou_18b20)//温度大于报警值
  75.         {
  76.                 shou_18b20=0;
  77.                 UART(2,"play,245,$");//温度上限报警
  78.                 UART(1,"温度上限报警,当前温度为  ");
  79.                 shou_18b20=0;
  80.                 UART(1,ds_18b20num);
  81.                 UART1_SendLR() ;
  82.                 UART(1,"温度上限为   ");
  83.                 UART(1,ds_18b20H);
  84.                 UART1_SendLR() ;
  85.                 UART(1,"温度下限为  ");
  86.                 UART(1,ds_18b20L);
  87.                 UART1_SendLR() ;
  88.                 UART(2,"play,070,$");//语音播报  温度上限报警
  89.         }
  90.         else if(wendu_l<0&&run_18b20&&shou_18b20)//温度低于下限
  91.         {
  92.                 shou_18b20=0;
  93.                 UART(2,"play,246,$");//温度下限报警
  94.                 UART(1,"温度下限报警,当前温度为  ");
  95.                 UART(1,ds_18b20num);
  96.                 UART1_SendLR() ;
  97.                 UART(1,"温度上限为   ");
  98.                 UART(1,ds_18b20H);
  99.                 UART1_SendLR() ;
  100.                 UART(1,"温度下限为  ");
  101.                 UART(1,ds_18b20L);
  102.                 UART1_SendLR() ;
  103.     UART(2,"play,069,$");//语音播报  温度下限报警
  104.         }
  105.                 if(wendu_l>0&&wendu_h<0)//温度在中间  未发生报警值
  106.         {
  107.                 shou_18b20=1;
  108.         }
  109.        
  110. }
  111. void key()//板载按键操作函数
  112. {
  113.                 if(P24==0)//设置是否为语音唤醒模式
  114.                 {       
  115.                         if(P55)
  116.                         {
  117.                                 UART_shouq(2,"PasswordTrigger,1,$","设置成功",2000);
  118.                                 UART(1,"已设置为口令触发\r\n");
  119.                         }
  120.                                 else
  121.                         {
  122.                                 UART_shouq(2,"PasswordTrigger,0,$","设置成功",2000);
  123.                                                         UART(1,"已取消口令触发\r\n");
  124.                         }               
  125.                                 P55=~P55;
  126.                 }
  127.                 if(P25==0)//按键测试程序  按下按键   返回串口接收的数据  并且取反led指示灯
  128.                 {               
  129.                         UART(1,"A");
  130.                         UART(1,ADC_nume);
  131.                         UART1_SendLR();
  132.                         while(!P25);
  133.                 }
  134.                
  135.                 if(P26==0)//按键测试程序  按下按键   返回串口接收的数据  并且取反led指示灯
  136.                 {       
  137.                         MOR_DS18B20(0,1);
  138.                         while(!P26);
  139.                 }
  140.                
  141.                 if(P50==0)
  142.                 {
  143.                                 LED=~LED;
  144.                         while(!P50);
  145.                 }
  146. }

  147. void eerom()
  148. {
  149. unsigned char eerom_shou;                //
  150. eerom_shou =        IapReadByte(IAP_ADDRESS);//读取一个字节   判断是否为D  
  151.        
  152.                 if(eerom_shou!='D')        //不是D说明 第一次上电  进行数据的初始化
  153.                 {
  154.                 IapEraseSector(IAP_ADDRESS);//删除扇区数据  将数据全部写为ff
  155.                 IapWrite_n(IAP_ADDRESS,ds_18b20H,5);
  156.                 IapWrite_n(IAP_ADDRESS1,ds_18b20L,5);
  157.                 }
  158.                 else//不为D说明不是第一次上电  则读取eerom的数据   进行覆盖
  159.                 {
  160.                 IapRead_n(IAP_ADDRESS,ds_18b20H,5);       
  161.                 IapRead_n(IAP_ADDRESS1,ds_18b20L,5);       
  162.                 }
  163. }
复制代码

所有资料51hei提供下载:
断电保存版本.rar (296.85 KB, 下载次数: 26)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:849805 发表于 2020-12-27 22:04 | 显示全部楼层
支持共享!点赞
回复

使用道具 举报

ID:864602 发表于 2021-1-18 21:59 | 显示全部楼层
感兴趣 ,资源一起来探讨
回复

使用道具 举报

ID:476415 发表于 2021-7-27 12:30 来自手机 | 显示全部楼层
蓝牙加WIFI应该就能解决所有问题了吧,手机端可以方便链接不需要其它硬件。433感觉又复杂了。
回复

使用道具 举报

ID:577622 发表于 2022-11-8 08:13 | 显示全部楼层
433可以像蓝牙一样通讯传输数据吗,没接触过433的模块,只知道一些遥控用。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表