版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1 智能家居系 无线扩展板安装安装 第1章智能家居系统 智能家居系OpenWrt支持。3000多种软件包囊括从工具链(toolchain),到内核(linuxkernel),到软件包 ArduinoArduino系统包含两个部分,即硬件(各种型号的Arduino板)和软件(ArduinoIDE),是 ArduinoIDE软件ArduinoIDE基于processingIDE开发,对于初学者来说极易掌握,同时有着足够的灵活ArduinoIDE可以在Windows、MacintoshOSX、Linux三大主流操作系统上运行,而其他的NRF24L01 2401输出功率频道的选择和协议的设置可以通过接口进行,126个通信通道,6数据通道,满足多点通信和调频需要,如图19所示。由于价格已降为10元左右,因此性价比非常高。不足之处是穿墙能力不足,传输距离受到环境干扰较大,容易丢包。 Zigbee 网址\h 继电 水滴传感 智能家居系统流程图(见图1- 智能家居系统流程ArduinoIDE ArduinoIDE软件下载二维网址\h \h 网址\h 网址\hWeb图1-25云端服务器PHP一年,由于此篇涉及到PHP、WebSERVER等其他编程语言,篇幅过大,因此只提供源代 云端源文 网址\h第2章家居网关 家居网关左面介 家居网关右面介 市面上的703n路由WiFi核心板 材料列表(见表2- HY5DU121622DTP-1 D43TSOP66单排 圆排 刷写固件到Flash \h 取下原Flash 更换内 焊上刷好的Flash芯片、新内存、脚针(见图2- USB扩展板 USBHUB贴片电阻贴片电阻贴片电阻贴片电阻贴片电阻2 USB扩展板也可以单独使用,使用USB线插入电脑,就可以识别TF卡和当USBHUB使用Arduino扩展板Arduino扩展板采用的是ATMEG644PA芯片,拥用64KFlash,并有两个串口,Serial用于 1.材料列表(见表2- 名 型 数 备贴片贴片电阻贴片电阻贴片电阻贴片电阻2 Arduino扩展板也可以单独使用,使用ArduinoIDE下载程序,与普通Arduino板使用无线扩展板无线扩展板的作用就是将n2401、gb等无线模块与duno扩展板连接,由duno控制无线的发射,接收和控制其他无线终端设备,从而形成家居网关的概念,如图218示。 无线扩展板介绍 贴片电阻 用OpenWrt 四板叠加的家居网关连 使用浏览器打开 固件下载二维网址\h进入刷固件页面,如图2-24 刷写新固件页确定刷固件(见图2- 确定刷固 设置中文,如图2-28、图2-29 设置中文显 设置时区,如图2-30 设置时修改编译源,如图2-31所示(用于安装各种驱动和软件 修改编译在软件包里,将src/gz开头的删除,然后添加src/gzattitude_adjustment_12.09_rc2\h设置sta+ap模式(上网+手机连接打开无线,搜索家里的WiFi,如图2-32 搜索家里的加入到家里的WiFi,如图2-33、图2-34、图2-35 加入到家里的 单击添 设置OpenWrt的DHCP(自动分配IP),如图2-40、图2-41 单击修改 使用putty的SSH登录设置OpenWrt密码(有密码才能用ssh远程连接 单击系统管理 设置登录密使用putty登录 TF opkgupdate更新软件安装挂载软件库(如图2-48所示) 安装挂载软件opkgopkginstallkmod-usb-storageblock-mountblock-hotplugkmod-fs-ext4mkfs.ext4/dev/sda1 mkdir-p #生成一个TFmount/dev/sda1 #将TF卡挂载到/mnt/sda1configoption'device''/dev/sda1'option'options''rw,sync'option'enabled_fsck''0'option'enabled''1'option'target''/mnt/sda1' 添加自动挂载配使用winscp上传文件(上传下载源文件到 \h 上传文件到 安装配置php+mysql+uhttpd安装PHP到TF卡,如图2-55 mkdir-p/mnt/sda1/php/#echodestphpdisk/mnt/sda1/php/>>/etc/opkg.conf#添加到opgkopkg--destphpdiskinstallphp5-fastcgiphp5-mod-gdphp5-mod-xmlphp5-mod-ctphp5-mod-sessionphp5-mod-socketsphp5-mod-tokenizerphp5-mod-mcryptphp5-mod-mbsphp5-mod-pdophp5-mod-curlphp5-mod-mysqlopkginstallzoneinfo-asia#映射TF卡的库文件,如图2-56 ln-s/mnt/sda1/php/etc/php.ini/etc/php.iniln-s/mnt/sda1/php/etc/php5/etc/php5ln-s/mnt/sda1/php/usr/lib/libpcre.so.0.0.1ln-s/mnt/sda1/php/usr/lib/libpcreposix.so.0.0.0/usr/lib/libpcreposix.so.0ln-s/mnt/sda1/php/usr/lib/libsqlite.so.0.8.6/usr/lib/libsqlite.so.0ln-s/mnt/sda1/php/usr/lib/libsqlite3.so.0.8.6/usr/lib/libsqlite3.so.0ln-s/mnt/sda1/php/usr/lib/libxml2.so.2.7.8/usr/lib/libxml2.so.2ln-s/mnt/sda1/php/usr/lib/libz.so.1.2.3ln-s/mnt/sda1/php/usr/lib/libuClibc++-0.2.4.so/usr/lib/libuClibc++.so.0ln-s/mnt/sda1/php/usr/lib/libmysqlclient.so.16/usr/lib/libmysqlclient.so.1ln-s/mnt/sda1/php/usr/lib/php/usr/lib/phpln-s/mnt/sda1/php/usr/bin/php-cgi/usr/bin/php-修改php.ini short_open_tag=error_log=doc_root="/mnt/sda1/www"#修改成TFdate.timezone=Asia/Shanghaimysql.default_socket=/var/run/mysqld.socksession.auto_start=1配置 optionhome'/mnt/sda1/www把/www修改成/mnt/sda1/wwwoptionindex_pageindex.php listinterpreter".php=/usr/bin/php- #添/etc/init.d/uhttpd测试php\h php的配置信安装使用putty安装opkginstallmysql-使用winscp编辑/etc/f,如图2-60 datadir=/mnt/sda1/mysql/data/mysql/tmpdir=/mnt/sda1/mysql/data/tmp/bind-address=使用putty安装创建数据库目录,如图2-61 mkdir-p/mnt/sda1/mysql/data/mysqlmkdir-p/mnt/sda1/mysql/data/tmp使用putty初始化数据库,如图2-62 初始化数据库、设置密码mysql_install_dbforcemysqld--skip-grant进入mysqlmysql-uroot#进入mysql以后出现mysql>updateusersethost='%'whereuser='root'andhost='localhost';updateusersetpassword=PASSWORD('znck007')whereuser='root';flush使用putty重启killallmysqld#停/etc/init.d/mysqldenable#/etc/init.d/mysqldstart#再启动MySQL使用NavicatForMysql软件新建mysql 新建一个数据 输入数据库名 CREATETABLEIFNOTEXISTS`api_worklist``id`int(16)unsignedNOTNULL`type`int(2)NOTNULLCOMMENT'1网设2上传3定时`uid`int(8)NOT`sid`varchar(3)NOT`nid`varchar(3)NOT`data`varchar(32)NOT`note`varchar(64)NOT`status`int(2)NOTNULLCOMMENT'1成功2失败3超次数4超15分`time`datetimeNOT`ip`varchar(16)NOT`num`int(2)NOTNULL,PRIMARYKEY(`id`),KEY`uid`(`uid`),KEY`time`(`time`))ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1 刷新查看生成的安装安装Python相应类库,如图2-69 mkdir-p/mnt/sda1/python/#echodestpythondisk/mnt/sda1/python/>>/etc/opkg.conf#添加到opgk配置文件opkg--destpythondiskinstallpython#将python安装到TF卡ln-s/mnt/sda1/python/usr/bin/python/usr/bin/python#为python创建快捷方式,如需键入/mnt/sda1/python/usr/bin/python才能启动pythonopkg--destpythondiskinstallpyserial opkg--destpythondiskinstallpython-mysql#安装mysql操作类编写Python脚本(串口通信、读写、更新、删除MYSQL数据库 #-*-coding:utf-8-importcgi,osimportcommandsimportserialimporturllib,urllib2importtimeimportapikey='你的Key'#云服务器key,改成自己的Key(可以到\h/免费申请,本apiurl='\h'#云服务器网址,也可以建自己的云服务器isyunserver=3#1只使用本地服务器2只使用云服务器3本地和云服务器一起使用logpath='/mnt/sda1/www/cgi-bin/znckbgrun'#日志保存路径dogpath='/mnt/sda1/www/cgi-bin/znckdogtime'#看门狗的保存路径#GETdefBaseGet(url,data):#printrepr(result)returnresultprint"BaseGetWriteLog(logpath,"BaseGetexcept:")#写日志return""#POSTdefBasePost(url,data):postData=urllib.urlencode(data);req=urllib2.Request(url,postData);req.add_header('Content-Type',"application/x-www-form-urlencoded");resp=urllib2.urlopen(req);code=resp.getcode()#printrepr(result)returnresultprint"BasePostWriteLog(logpath,"BasePostexcept:")#写日志return""#defZnckApiGetData():postdata={}printreturnprint"ZnckApiGetDataWriteLog(logpath,"ZnckApiGetDataexcept:")#写日志return""defZnckApiPostData(value):value0="%03d"%int(value[0].strip())#转成00x格式value1="%03d"%int(value[1].strip())#转成00xpostdata={}printreturnprint"ZnckApiPostDataWriteLog(logpath,"ZnckApiPostDataexcept:")#写日志return""#获取mysqldefSelectWorklist():#conn.select_db('znckapi')#count=cur.execute('SELECT*FROMapi_worklistWHEREstatus=0ORDERBYDESCLIMIT0,1')#最后1条#printifresults:forrin#printstr(r[0])+str(r[1])+str(r[2])+str(r[3])+str(r[4])+str(value0="%03d"%int(r[3].strip())#转成00x格式value1="%03d"%int(r[4].strip())#转成00xif(r[10]>5):#如果num字段大于5cur.execute('UPDATEapi_worklistSETstatus=3wheresid=%nid=%sandstatus=0',snvalue)#cur.execute('UPDATEapi_worklistSETnum=num+1wheresid=%sanid=%sandstatus=0',snvalue)#returnexceptprint"MysqlError%d:%s"%(e.args[0],WriteLog(logpath,"MysqlError%d:%s"%(e.args[0],e.args[1]))#写日志print"SelectWorklistWriteLog(logpath,"SelectWorklistexcept...")#写日志return""#添加数据到defInsertWorklist(value):now=time.strftime('%Y-%m-%d%H:%M:%S')#当前时间value0="%03d"%int(value[0].strip())#转成00x格式value1="%03d"%int(value[1].strip())#转成00x格式cur.execute('DELETEFROMapi_worklistwheretype=2andsid=%sandnidstatus>0',snvalue)#删除相同数据invalue=[2,0,value0,value1,value[2],"uploaddata",1,now,""cur.execute('INSERTINTOALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',invalue)#if(value[2]=='update'):cur.execute('UPDATEapi_worklistSETstatus=1wheresid=%sandexceptprint"MysqlError%d:%s"%(e.args[0],WriteLog(logpath,"MysqlError%d:%s"%(e.args[0],e.args[1]))#print"InsertWorklistWriteLog(logpath,"InsertWorklistexcept...")#return#defWriteLog(file,value):file=file+time.strftime('%Y-%m-%d')+".log"#生成log文件名称now=time.strftime('%Y-%m-%d%H:%M:%S')#当前时间f=open(file,'ab')print"exceptdefWritedogtime(file,value):f=open(file,'w')print"exceptdefResolveZnck(data):if(data.find('{ck')>=0&data.find('}')>=0):#如果是'{ck00x00x000000}'start=data.find('{ck');#定位字符开始位置end=len(data);#定位字符长度data_t=data[start:end];#截取正确的格式data_t=data_t.replace('\r','')#替换回车换行data_t=data_t.replace('\n','')#returnvalue;#cmdstring="ls/dev/ttyUSB0"#判断是否是ttyUSB0(status,output)=commands.getstatusoutput(cmdstring)if(status==0):#0代表成功大于0print"ttyUSB0ser=serial.Serial('/dev/ttyUSB0',115200,timeout=1)#打开串口通信#ser.write("lABC")#向串口发送字符cmdstring="ls/dev/ttyUSB1"#判断是否是ttyUSB1(status,output)=commands.getstatusoutput(cmdstring)if(status==0):#0代表成功大于0是各种错误print"ttyUSB1ser=serial.Serial('/dev/ttyUSB1',115200,timeout=1)#打开串口通信#ser.write("lABC")#向串口发送字符print"ttyUSBcheckerror..."WriteLog(logpath,"ttyUSBcheckerror...")#写日志cmdstring="rm-rf"+dogpath#删除旧的看门狗文件(status,output)=commands.getstatusoutput(cmdstring)sendcount=0#记录循环次数errorcount=0记录错误次数whileTrue:data=ser.readline()#读取一行读取1个字符if(data.find('{ck')>=0anddata.find('}')>=0):#如果是'{ck00x00x0000data=data.replace('\r','')#替换回车换行data=data.replace('\n','')##if(isyunserver==1orisyunserver==3):#if(isyunserver==2orisyunserver==3):ifdata!=""#print"serialdata<<<"+dataWriteLog(logpath,data写日志sendcount=sendcount+1#计数器加1if(sendcount%1==0):#间隔1次执行#if(isyunserver==1orisyunserver==3):if(repost.find('{ck')>=0andrepost.find('}')>=0#如果是'{ck00x00x000000}'#print"serialwrite>>>"+repost#if(isyunserver==2orisyunserver==3):if(repost.find('{ck')>=0andrepost.find('}')>=0):#如果是'{#print"serialwrite>>>"+repost#print'sendcount='+str(sendcount)if(sendcount>10000):sendcount=0#初始化为Writedogtime(dogpath,time.strftime('%Y-%m-%dexceptException,e:errorcount=errorcount+1#计数器加1#print'errorcount='+str(errorcount)print"exceptError%s"%WriteLog(logpath+"err","exceptError%s"%(e)+str(errorcount))#写日志Arduino处理命令后,通过Zigbee、nrf24l01发送到控制端。 本书第1章1.8测试脚本是否运行成功,如图2-72 python/mnt/sda1/www/cgi-bin/znckbgrun# \hkillall-9killall-9实现python #!/bin/sh#Copyright(C)2013OpenWstart()python/mnt/sda1/www/cgi-bin/znckbgrunstop()killall-9/etc/init.d/znckserver/etc/init.d/znckserver 开机启动、马上运#/etc/init.d/znckserverdisable#/etc/init.d/znckserverstop#停止enable和运行/etc/init.d/znckserverstart。Arduino网关代码编译 网址\h安装CH340 拆下Arduino扩展板和无线扩展板直接USB 使用Arduinoide软件打开下载的网关源代码,如图2-81 Arduinoide软件打开网关代选择板znck007arduinoCore(Atmega644PA@16M,5V)如图2-82 官方最新版本的Arduinoide是没有这个板的,如果要添加,则复制Arduino软件的 编译代码下载到Arduino板,显示Doneuploading表示成功,如图2-84 串口监 代码最关键的三个部分 初始化 发送函家居网关叠加上电运行,如图2-91 家居网关叠加效果 家居网关运行日 家居网关演示视频二维网址\h第3章电灯开关 电灯开关的正面 电灯开关的背面 无线开关模块介绍其实原理很简单,手机通过连接网关或互联网,再将命令字符写入网关数据库,网关获取到命令后,调用duno的无线模块2401gb等,再发送到指定控制端模块 电灯开关模块功能流程材料列表(见表3-1)、原理图(见图3- 电灯开关无线模块材料列MicroUSB贴片电阻贴片电阻贴片电阻贴片电阻5.08mm继电器5VT73SRD-5VDC-SL-C5脚1.272.542.542.54 无线开关模块原理 无线开关模块图3-7 继电器介绍 开关源代码下载二维\h*NRF24l01MISO->MOSI->SCK->CE->CSN->TX->RXDRX->#include //引用SPI#include //引用Mirf#include<nRF24L01.h> #include<MirfHardwareSpiDriver.h> #include<EEPROM.h> int //int ////无线串口通信处理(zigbee/bluetooth等unsignedlong //char //char //int //unsignedlongnrf24l01nowlast; charnrf24l01buff[33]={0}; char //NRF24L01int //NRF24L01//int //手动开关针脚int //手动开关针脚int //手动开关针脚int //当前开关值int //当前开关值int //当前开关值int //开关针脚int //开关针脚int //开关针脚int //开关状态int //开关状态int //开关状态void //设置串口波特率/初始化Mirf,用于NRF24L01harclient[10]={0}; // // // // // //pinMode(pinIn0,INPUT_PULLUP);//将管脚设置为输入并且内部上拉模式pinMode(pinIn1,INPUT_PULLUP);//将管脚设置为输入并且内部上拉模式pinMode(pinIn2,INPUT_PULLUP);//digitalWrite(pinIn0,HIGH);//设置默认高电位digitalWrite(pinIn1,HIGH);//设置默认高电位digitalWrite(pinIn2,HIGH);//state0= //读取romstate1= //读取romstate2= //读取romSerial.println("zwifi_kaiguan");// //打印当前电位状态 //打印当前电位状态if(state0==255)state0=0; if(state1==255)state1=0; if(state2==255) //默认rom则设为关状void//检测无线串口数据处理(zigbee/bluetooth等unsignedlongserial1now=millis();//获取现在的时间if(serial1now-serial1nowlast>=5000)//如果数据间隔超过5秒而清空字符(为了防止数据错乱serial1nowlast=millis();//记录当前时间memset(serial1buff,0,129);//清空缓存字符 while(Serial.available( //if(serial1i=Serial.println("serial // // serial1buff[serial1i]=serial1Data;//保存到数组serial1i++;//数组长度if(serial1Data=='}'||//如果发现}而说明命令结束(并少于129个字符,太长会出错serial1nowlast= //记录当前时间,不然5charbody[129]={0}; //获取只是{ckxxxxxx}的字符, //这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}")) //这里不打印,否则检测到{ckxxxx} //字符数需大于 // Serial.println("");//打印结束标示 //unsignedlongnrf24l01now=millis(); if(nrf24l01now-nrf24l01nowlast>=5000)//如果数据间隔超过5秒而清空字符(为了防止数据错乱nrf24l01nowlast= //memset(nrf24l01buff,0, // //byte // // // //清理NRF24L01 //这里不打印,否则检测到{ckxxxx}for(inti=0;i<Mirf.payload;i++)//if(nrf24l01i=Serial.println("nrf24l01 // //读取NRF24L01if(nrf24l01Data=='{')nrf24l01i=0;//如果发现{则设长度为0开始nrf24l01buff[nrf24l01i]=nrf24l01Data;//保存到数组 if(nrf24l01Data=='}'||//如果发现}而说明命令结束(并少于33个字符,太长会出错nrf24l01nowlast= //更新当前时间,不然5charbody[33]={0}; //获取只是{ckxxxxxx} //这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}")) //这里不打印,否则检测到{ckxxxx} //字符数需大于 //memset(nrf24l01buff,0,33);//字符数组长度初始为0nrf24l01i=0;//字符数组长度初始为0 // //if(val0= // // //if(val0= //Serial.print("val0 //if(state0= // // charhandonoff[33]={0}; //延时2000 // // charhandonoff[33]={0}; //延时2000 //if(val1= // // //if(val1= //Serial.print("val1 //if(state1= // // charhandonoff[33]={0}; //延时2000 // // charhandonoff[33]={0}; //延时2000 //if(val2= // // //if(val2= //Serial.print("val2 //if(state2= // // charhandonoff[33]={0}; //延时2000 // // charhandonoff[33]={0}; //延时2000if(state0==1) // ////ONOFFif(state1= // ////ONOFFif(state2=// ////初始化Mirf0初始化1为接收2voidMirf_Init(inttxrx,char*server,intif(txrx=0){Mirf.spi= //设置 //初始Mirf.setRADDR((byte //if(txrx=1){Mirf.setRADDR((byte //if(txrx=2){Mirf.setTADDR((byte //Mirf.payload= //Mirf.channel= // ////NRF24l01voidMirf_Send(intchannel,char*server,char*str){ int // charwords=str[bufi]; Mirf.send((byte // // //voidget_znck_body(char*p,char*s){char //int //bool //int // //if(p[bufi]=='{'){ if(p[bufi]=='}'&&isend==true){//如果是}则结束截取 // //如果为true // //voidset_onoff(charint //获取int //获取int //获取if(s==sid&&n==0 //如果是1if(d==1 // //EEPROM.write(0, //写入romif(d==0 // //EEPROM.write(0, //写入romif(s==sid&&n==1 //如果是2if(d==1 // //EEPROM.write(1, //写入romif(d==0 // //EEPROM.write(1, //写入romif(s==sid&&n==2 //如果是3if(d==1 // //EEPROM.write(2, //写入romif(d==0 // //EEPROM.write(2, //写入rom//if(s==sid){ charserver[10]={0}; //赋值网关接收名 //char //char //sprintf(front,"{ck%03d%03d",s,n);//赋值前缀sprintf(updateData,"%supdate}",front);//生成反馈数组 //发送给NRF24L01(NRF24L01会发给网关charclient[10]={0}; //设置为接收模//获取sidintget_sid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharSid[4]={0}; int //转成 //return //返回return //格式不对返回//获取nidintget_nid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&//如果含{ck和},并长度大于charcharNid[4]={0}; int //转成 //return //返回return //格式不对返回//获取dataintget_data(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharData[4]={0}; intintData=atoi(charData); return //返回return //格式不对返回 连接电脑前的准 手动开关引线介 引线与线 使用Arduinoide打开源代码,如图3-17 使用Arduinoide打开源代码intsid=3;//模块类型intnid=0;//然后选择Tools->Board->ArduinoUno板,如图3-18所示。后面各章中的各种控制板和传感板都选择ArduinoUno板,因为我们都采用ATMEGA328P芯片。 选择板Arduino 编译代码到开关打开ToolS→SerialMonitor,会弹出如图3-21 打开串口监视 测试手动开关针 手动开关触发的串口数 云端服务器首 添加电灯开关设 无线开关模块监视串口打 ①添加一条\h 家里电灯开关内 无线开关模块的接 关掉总开关,接电线到无线开关模 将无线开关模块放入电灯开关 安装上原电灯开 合上原电灯面 电灯开关演示视频二维网址\h第4章无线插座图4-1 无线开关模图4-3DIY 连接电脑编译刷写源代 拆开后盖 插座内部结 拆出两个插 拆出后的效 使用电烙铁拆除插 使用剪刀剪开 插座和无线开关模块接线 手动开关焊 合上插座盖子 贴上面 无线插座插上电 打开手机云端操作无线插 无线插座演示视频二维网址\h第5章远程开门 摇控门 无线控制材料列表(见表5-1)、原理图(见图5-表5-1XC6206P332MR662K)microUSB贴片电阻贴片电阻贴片电阻贴片电阻1.272.542.542.54 无线控制模块原理 遥控门锁拆开后盖 远程开门源代码下载二维\h*NRF24l01MISO->MOSI->SCK->CE->CSN->TX->RXDRX->*D3->DATAGND->#include<SPI.h>//引用SPI库文件#include<Mirf.h引用Mirf库文件#include<nRF24L01.h>//引用NRF24L01#include<MirfHardwareSpiDriver.h>//引用Mirf驱动库文件#include<EEPROM.h>//引用EEPROM库文件intsid=5;//模块类型intnid=1;////无线串口通信处理(zigbee/bluetooth等unsignedlongserial1nowlast;//串口检测间隔时间charserial1buff[129]={0};//串口缓存字符charserial1Data串口单个字符intserial1i=0;//串口字符数unsignedlongnrf24l01nowlast;//NRF24L01检测间隔时间charnrf24l01buff[33]={0};//NRF24L01缓存字符charnrf24l01Data;//NRF24L01单个字符intnrf24l01i=0;//NRF24L01字符数//intpinIn0=A0;//手动开关针脚intval0;//当前开关值1intpinOut0=3开关针脚1intstate0=0;//开关状态1voidSerial.begin(115200);//设置串口波特率charclient[10]={0}客户端名称sprintf(client,"clie%d",sid);//设置客户端名称Mirf_Init(0,client,sid);//初始化NRF24L01收发pinMode(pinIn0,INPUT);//设置输入模式pinMode(pinOut0,OUTPUT);//设置输出输式pinMode(pinIn0,INPUT_PULLUP);//将管脚设置为输入并且内部上拉模式digitalWrite(pinIn0,HIGH);//设置默认高电位state0=EEPROM.read(0);//读取romSerial.println("zwifi_kaimen");//Serial.print(state0);//打印当前电位状态1if(state0==255)state0=0;//默认romvoid//检测无线串口数据处理(zigbee/bluetooth等unsignedlongserial1now=millis();//if(serial1now-serial1nowlast>=5000)//如果数据间隔超过5秒而清空字符(serial1nowlast=millis();//记录当前时间memset(serial1buff,0,129);//清空缓存字符while(Serial.available())//if(serial1i=Serial.println("serial->");//serial1Data=(char)Serial.read();//serial1i++;//数组长度if(serial1Data=='}'||serial1i>=129)//如果发现}而说明命令结束(serial1nowlast=millis();//记录当前时间,不然5charbody[129]={0};//声明新字符数组//serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}"))//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strlen(body)>10)//字符数需大于set_onoff(body);//serial1i=0;//字符数组长度初始为 ");//delay(100);//unsignedlongnrf24l01now=millis();//if(nrf24l01now-nrf24l01nowlast>=5000)//如果数据间隔超过5秒而清空字符(nrf24l01nowlast=millis();//记录当前时间memset(nrf24l01buff,0,33);//清空缓存字符bytedata[Mirf.payload];//声明字节//Serial.println((char)*data);//这里不打印,否则检测到{ckxxxx}for(inti=0;i<Mirf.payload;i++)//if(nrf24l01i=Serial.println("nrf24l01->");//nrf24l01Data=(char)data[i];//读取NRF24L01if(nrf24l01Data=='{')nrf24l01i=0;//如果发现{则设长度为0开始if(nrf24l01Data=='}'||nrf24l01i>=33)//如果发现}而说明命令结束(并少于33nrf24l01nowlast=millis();//更新当前时间,不然5charbody[33]={0};//get_znck_body(nrf24l01buff,body);//获取只是{ckxxxxxx}的字符,//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}"))//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strlen(body)>10)//字符数需大于set_onoff(body);//memset(nrf24l01buff,0,33);//字符数组长度初始为0 ");//delay(100);//if(val0==LOW)//检测按键是否按下if(val0==LOW)//检测按键是否按下Serial.print("val0if(state0=0)//如果原来是关状态charhandonoff[33]={0};//声明手动开关字符delay(2000);//延时2000else//charhandonoff[33]={0};//声明手动开关字符delay(2000);//延时2000if(state0==1)digitalWrite(pinOut0,HIGH);//digitalWrite(pinOut0,LOW);////初始化Mirf0初始化1为接收2voidMirf_Init(inttxrx,char*server,intif(txrx=0){Mirf.spi=&MirfHardwareSpi;//设置spiMirf.setRADDR((byte*)server);//if(txrx=1){Mirf.setRADDR((byte*)server);//if(txrx=2){Mirf.setTADDR((byte*)server);//Mirf.payload=sizeof(char);//收发字节Mirf.channel=channel;//设置频道//NRF24l01voidMirf_Send(intchannel,char*server,charintbufi=0;//声明变量charwords=str[bufi];//发送的字符Mirf.send((byte*)&words);//发送命令delay(50);//voidget_znck_body(char*p,char*s){charrechar[33]={0};//声明数组intbufi=0;//当前长度boolisend=false;//开始和结束intcharnum=0;//字符长度for(bufi=0;bufi<strlen(p);bufi++){//if(p[bufi]=='{'){//如果是{则开始截取if(p[bufi]=='}'&&isend==true){//如果是}则结束截取rechar[charnum]=p[bufi];////voidset_onoff(charints=get_sid(body);//获取sidintn=get_nid(body);//获取nidintd=get_data(body);//获取dataif(s==sid&&n==0)//if(d==1)//state0=1;//EEPROM.write(0,state0);//写入romif(d==0)//state0=0;//EEPROM.write(0,state0);//写入rom//if(s==sid){//charserver[10]={0};//声明网关接收名称//Serial.println(server);//charupdateData[33]={0};//声明更新数组charfront[10]={0};//声明更新前缀sprintf(front,"{ck%03d%03d",s,n);//赋值前缀Mirf_Send(1,server,updateData);//发送给NRF24L01(NRF24L01会发给网关charclient[10]={0};//声明客户端//获取sidintget_sid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharSid[4]={0};//声明数组intintSid=atoi(charSid);//转成intreturnintSid;//返回sidreturn0;//格式不对返回//获取nidintget_nid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharNid[4]={0};//声明数组intintNid=atoi(charNid);//转成intreturnintNid;//返回nidreturn0;//格式不对返回//获取dataintget_data(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharData[4]={0};//声明数组intintData=atoi(charData);//转成intreturnintData;//返回datareturn0;//格式不对返回DIY 无线控制板连接电脑使用duno软件打开远程开门的源代码,编译时,选择好口和dunono板,将源代码里的d、nd改成云端产生的d、nd后进行编译,因为在第3章电灯开关时已经详细地进行了说明,这里就不再讲解了。 安装门栓图5- 安装门 盒上后盖图5- 安装好后的效 门锁和无线控制板连接图图5- 连接好后的效 无线控制板的3D盒子图5-16 远程开门演示视频二维网址\h第6章窗帘开关 市场上的无线遥控窗 443无线控制材料列表(见表6-1)、原理图(见图6- 433无线控制板材料列XC6206P332MR662K)microUSB贴片电阻贴片电阻贴片电阻贴片电阻1.272.54排 2.54单排 2.54跳线 433无 433无线控制板原理 无线遥控窗帘电动 拆开电动机的尾 使用433 443无线控制板下载二维网址\hDIY 使用Arduino软件打开433无线控制板的源代码,编译时,选择好COM口和Arduino 使用3D打印盒子(见图6- 窗帘开关演示视频二维网址\h第7章红外遥控 红外遥控材料列表(见表7-1)、原理图(见图7- 红外遥控材料列XC6206P332MR662K)microUSB贴片电阻贴片电阻贴片电阻贴片电阻1.272.542.542.54贴片电阻贴片电阻贴片电阻 红外遥控板原理 红外遥控源代码下载二维\h*NRF24l01MISO->MOSI->SCK->CE->CSN->TX->RXDRX->A5->DATAGND->GNDVCC->D3->DATAGND->#include<SPI.h>//引用SPI库文件#include<Mirf.h引用Mirf库文件#include<nRF24L01.h>//引用NRF24L01#include<MirfHardwareSpiDriver.h>//引用Mirf驱动库文件#include<EEPROM.h>//引用EEPROM库文件#include<IRremote.h>//intsid=6;//模块类型intnid=1;////无线串口通信处理(zigbee/bluetooth等unsignedlongserial1nowlast;//串口检测间隔时间charserial1buff[129]={0};//串口缓存字符charserial1Data串口单个字符intserial1i=0;//串口字符数unsignedlongnrf24l01nowlast;//NRF24L01检测间隔时间charnrf24l01buff[33]={0};//NRF24L01缓存字符charnrf24l01Data;//NRF24L01单个字符intnrf24l01i=0;//NRF24L01字符数//intpinIn0=A0手动触发针脚intval0;//当前触发值intpinOut0=A1;//IRsendirsend;//声明红外变量intisdump=0//0为自学1为发射intRECV_PIN=A5;//IRrecvirrecv(RECV_PIN);//声明接收类decode_resultsresults;//红外解码结果类voidSerial.begin(115200);//设置串口波特率charclient[10]={0}客户端名称sprintf(client,"clie%d",sid);//设置客户端名称Mirf_Init(0,client,sid);//初始化NRF24L01收发pinMode(pinIn0,INPUT);//设置输入模式pinMode(pinOut0,OUTPUT);//设置输出输式pinMode(pinIn0,INPUT_PULLUP);//将管脚设置为输入并且内部上拉模式digitalWrite(pinIn0,HIGH);//设置默认高电位irrecv.enableIRIn();//启动红外接收Serial.println("zwifi_hongweixian");//打印void//检测无线串口数据处理(zigbee/bluetooth等unsignedlongserial1now=millis();//if(serial1now-serial1nowlast>=5000)//如果数据间隔超过5秒而清空字符(serial1nowlast=millis();//记录当前时间memset(serial1buff,0,129);//清空缓存字符while(Serial.available())//if(serial1i=Serial.println("serial->");//serial1Data=(char)Serial.read();//serial1i++;//数组长度if(serial1Data=='}'||serial1i>=129)//如果发现}而说明命令结束(并少于129serial1nowlast=millis();//记录当前时间,不然5charbody[129]={0};//get_znck_body(serial1buff,body);//获取只是{ckxxxxxx}//serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}"))//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strlen(body)>10)//字符数需大于set_infrared(body);//serial1i=0;//字符数组长度初始为 ");//delay(100);//unsignedlongnrf24l01now=millis();//if(nrf24l01now-nrf24l01nowlast>=5000)//如果数据间隔超过5秒而清空字符(nrf24l01nowlast=millis();//记录当前时间memset(nrf24l01buff,0,33);//清空缓存字符bytedata[Mirf.payload];//声明字节//Serial.println((char)*data);//这里不打印,否则检测到{ckxxxx}for(inti=0;i<Mirf.payload;i++)//if(nrf24l01i=Serial.println("nrf24l01->");//nrf24l01Data=(char)data[i];//读取NRF24L01if(nrf24l01Data=='{')nrf24l01i=0;//如果发现{则设长度为0开始if(nrf24l01Data=='}'||nrf24l01i>=33)//如果发现}而说明命令结束(并少于33nrf24l01nowlast=millis();//更新当前时间,不然5charbody[33]={0};//get_znck_body(nrf24l01buff,body);//获取只是{ckxxxxxx}//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strstr(body,"{ck")&&strstr(body,"}"))//Serial.println(body);//这里不打印,否则检测到{ckxxxx}if(strlen(body)>10)//字符数需大于set_infrared(body);//memset(nrf24l01buff,0,33);//字符数组长度初始为0 ");//delay(100);//if(val0==LOW||isdump==1)//检测按键是否按下digitalWrite(pinOut0,HIGH);//if(irrecv.decode(&results)){//如果红外编码正确Serial.println(results.value,HEX);//打印编码值dump(&results);//dump编码irrecv.resume();//digitalWrite(pinOut0,LOW);//则设为低电位delay(10);//延时//初始化Mirf0初始化1为接收2voidMirf_Init(inttxrx,char*server,intif(txrx=0){Mirf.spi=&MirfHardwareSpi;//设置spiMirf.setRADDR((byte*)server);//if(txrx=1){Mirf.setRADDR((byte*)server);//if(txrx=2){Mirf.setTADDR((byte*)server);//Mirf.payload=sizeof(char);//收发字节Mirf.channel=channel;//设置频道//NRF24l01voidMirf_Send(intchannel,char*server,charintbufi=0;//声明变量charwords=str[bufi];//发送的字符Mirf.send((byte*)&words);//发送命令delay(50);//voidget_znck_body(char*p,char*s){charrechar[33]={0};//声明数组intbufi=0;//当前长度boolisend=false;//开始和结束intcharnum=0;//字符长度for(bufi=0;bufi<strlen(p);bufi++){//if(p[bufi]=='{'){//如果是{则开始截取if(p[bufi]=='}'&&isend==true){//如果是}则结束截取//voidset_infrared(charints=get_sid(body);//获取sidintn=get_nid(body);//获取nidchard[32]={0};//声明字符组if(s==sid&&n==nid)//if(strlen(d)==1&&d[0]=='0')//如果数据是isdump=1;//if(strlen(d)==1&&d[0]=='1')//如果数据是charsdata[20]={0};//声明字符组if(strlen(d)>5)//如果字符大于5sendInfrared(d);////if(s==sid){//charserver[10]={0};//声明网关接收名称//Serial.println(server);//charupdateData[33]={0};//声明更新数组charfront[10]={0};//声明更新前缀sprintf(front,"{ck%03d%03d",s,n);//赋值前缀Mirf_Send(1,server,updateData);//发送给NRF24L01(NRF24L01会发给网关charclient[10]={0};//声明客户端//获取sidintget_sid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharSid[4]={0};//声明数组intintSid=atoi(charSid);//转成intreturnintSid;//返回sidreturn0;//格式不对返回//获取nidintget_nid(charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和charcharNid[4]={0};//声明数组intintNid=atoi(charNid);//转成intreturnintNid;//返回nidreturn0;//格式不对返回//获取dataintget_data(char*buff,charif(strstr(buff,"{ck")&&strstr(buff,"}")&&strlen(buff)>10)//如果含{ck和for(inti=0;i<strlen(buff);i++){//循环原字符if(buff[9+i]=='}')break;//遇到}而退出循环return1;//返回return0;//格式不对返回//voiddump(decode_results*results)intcount=results-if(results->decode_type==UNKNOWN){Serial.print("Unknownencoding:elseif(results->decode_type==NEC){Serial.print("DecodedNEC:");elseif(results->decode_type==SONY){Serial.print("DecodedSONY:");elseif(results->decode_type==RC5){Serial.print("DecodedRC5:");elseif(results->decode_type==RC6){Serial.print("DecodedRC6:");elseif(results->decode_type==PANASONIC){Serial.print("DecodedPANASONIC-Address:");Serial.print("Value:");elseif(results->decode_type==JVC){Serial.print("DecodedJVC:");elseSerial.print(results->value,DEC);Serial.print("(");Serial.print(results->bits,DEC);Serial.println("bits)");Serial.print("Raw(");Serial.print(count,DEC);Serial.print("):");//for(inti=0;i<count;i++){if((i%2)==1){Serial.print(results->rawbuf[i]*USECPERTICK,elseSerial.print(-(int)results->rawbuf[i]*USECPERTICK,//charrawbuf[255]={0};chardecode_type[10]={0};chardecode_value[16]={0};chardecode_bits[10]={0};//写入romfor(inti=0;i<256;i++){EEPROM.write(i,0);for(inti=0;i<strlen(rawbuf);i++){EEPROM.write(i,rawbuf[i]);Serial.print("EEPROM.writecount=");//voidsendInf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训期间的安全责任课件
- 培训专案总结报告
- 员工培训课件模板
- 口腔护士培训课件内容
- 肺动脉导管置入术总结2026
- 医院课件培训总结报道
- 化工经济与技术
- Unit 4 Life on Mars高频考点讲义 -译林版英语九年级下册
- 化妆礼仪培训课件
- 分腿前桥技术讲解
- 2025福建高中春季高考学业水平考试数学测试卷
- DZT0181-1997水文测井工作规范
- DB375026-2022《居住建筑节能设计标准》
- 【深信服】PT1-AF认证考试复习题库(含答案)
- 社会实践-形考任务四-国开(CQ)-参考资料
- 腰椎间盘突出患者术后护理课件
- 语文小学二年级上册期末培优试卷测试题(带答案)
- 医院护理培训课件:《高压氧临床的适应症》
- 中山大学研究生因公临时出国境申报表
- 腱鞘囊肿日间手术
- YY/T 0127.18-2016口腔医疗器械生物学评价第18部分:牙本质屏障细胞毒性试验
评论
0/150
提交评论