置顶

我的智慧小屋搭建

oo小溪 发表于2019年11月28日
<p>看了各位搭建的智能小屋,我也开始了我的智能小屋搭建之路。这次我没有买现成的驱动板,尝试购买各种元件来搭建,手工不行,所以没做成房子,只做成了硬件部分。如图:<img src="https://nos.netease.com/edu-image/fb67d7b8c6a545ed9e4fcdda428cdb71.jpg" /></p><p><br /></p><p>材料如下:</p><p>Arduino uno 1个、劢领智能的M0M10XD0wifi模块1个、4700欧姆电阻1个、光敏电阻1个、土壤湿度传感器1个、MQ-2可燃气体传感器1个、CJMCU-8118集成传感器(集成了HDC1080和CCS811两个传感器)1个、有源蜂鸣模块1个、3色LED灯1个、74HC595芯片1个、8路继电器1个、5线4相步进电机及驱动板1个、水泵1个、12V散热风扇1个、9路DC电压转换模块1个、面包板1个及杜邦线若干。</p><p><strong>使用的部分硬件说明</strong></p><p><em><strong>劢领智能的M0M10XD0wifi模块</strong></em></p><p>劢领智能的M0M10XD0wifi模块是一个非常方便的wifi模块,内置连接阿里云MQTT的固件。还有内置的网页供设置使用。</p><p>模块先通过USB2TTL模块设置好无线网络,为了调试方便,我将其连到了软串口(如果连接到默认的串口,在上传程序时必须断开),故还需将波特率调整为9600(默认的115200在我的模拟串口上读取不正常)。</p><p>在Arduino上只需使用“AT+ALISOCK=DeviceName, ProductKey, Device Secret\r\n”即可连接上阿里云,省去了计算密文的麻烦。发布数据时使用“AT+MPUB=qos,len,pub\r\n”指令,然后再发送数据即可,也比较简单。</p><p><em><strong>9路DC电压转换模块</strong></em></p><p>可输入电压为6~12V,转换为3路3.3V,3路5V,另外3路的电压输出与输入电压相同。</p><p><em><strong>74HC595芯片</strong></em></p><p>可以通过3个引脚,控制芯片上的8个脚位高/低电平输出,用以扩展Arduino的脚位,教程见<a href="https://www.bilibili.com/video/av31147843?p=11" target="_blank" >https://www.bilibili.com/video/av31147843?p=11</a></p><p><strong>接口连接</strong></p><p><em><strong>Arduino接口连接</strong></em></p><ul style="list-style-type: disc;" class=" list-paddingleft-2" ><li><p>2、3接口作为虚拟串口,连接M0M10XD0wifi模块;</p></li><li><p>4接口连接蜂鸣器模块;</p></li><li><p>5、6、7接口分别连接74HC595芯片的SH、ST和DS引脚,可通过此3个引脚扩展出8个数字脚位;</p></li><li><p>8、9、10、11连接步进电机的四个脚位;</p></li><li><p>A0接口连接MQ-2可燃气体传感器;</p></li><li><p>A1 接口连接土壤湿度传感器;</p></li><li><p>A2接口接在串联的光敏电阻和4700欧姆电阻中间,以检测光敏电阻阻值变化;</p></li><li><p>SCL/SDA连接CJMCU-8118集成传感器。</p></li></ul><p><em><strong>74HC595芯片接口连接</strong></em></p><ul style="list-style-type: disc;" class=" list-paddingleft-2" ><li><p>6、7、8接口接3色LED灯的3个引脚;</p></li><li><p>1接口接水泵的继电器接口;</p></li><li><p>2接口接风扇的继电器接口。</p></li></ul><p><strong>程序编制</strong></p><p>由于我的wifi模块和传感器与老师的不同,故需修改程序,主要更改如下:</p><p><em><strong>库函数添加,主要用到以下3个库:</strong></em></p><p><code class="brush:cpp;toolbar:false" >#include&nbsp;&lt;SoftwareSerial.h&gt;//模拟串口模块 #include&nbsp;&lt;Wire.h&gt;//I2C连接库 #include&nbsp;&quot;Adafruit_CCS811.h&quot;//CCS811模块库</code></p><p><em><strong>定义虚拟串口引脚,将2和3作为虚拟串口,并在网络通信时通过虚拟串口输出,硬件串口输出各种信息以便于调试:</strong></em></p><p><code class="brush:cpp;toolbar:false" >//wifi模块虚拟串口引脚 #define&nbsp;WIFI_RX&nbsp;&nbsp;2 #define&nbsp;WIFI_TX&nbsp;&nbsp;3 SoftwareSerial&nbsp;WifiSerial(WIFI_RX,&nbsp;WIFI_TX);&nbsp;//&nbsp;软串口对象RX,&nbsp;TX</code></p><p><strong><em>LED灯、水泵及风扇通过74HC595控制,故需定义74HC595的三个脚位和其8个脚位的定义数组,将3个电器定义为HCPinVal数组中的数值,还需定义一个Update74HC595()函数,以更新74HC595脚位的数值,建立控制电器的函数:</em></strong></p><p><code class="brush:cpp;toolbar:false" >//控制74HC595的三个脚位 #define&nbsp;SH&nbsp;5 #define&nbsp;ST&nbsp;6 #define&nbsp;DS&nbsp;7 //74HC595的8个脚位的数值 int&nbsp;HCPinVal[8]&nbsp;=&nbsp;{&nbsp;0,0,0,0,0,0,0,0&nbsp;}; //74HC595的8个脚位代表的数值 #define&nbsp;LightRPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HCPinVal[5] #define&nbsp;LightGPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HCPinVal[6] #define&nbsp;LightBPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HCPinVal[7] #define&nbsp;&nbsp;FanPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HCPinVal[2] #define&nbsp;&nbsp;PumpPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HCPinVal[1] //刷新74HC595的8个脚位 void&nbsp;Update74HC595()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(ST,&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;7;&nbsp;i&nbsp;&gt;-1;&nbsp;--i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(SH,&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(DS,&nbsp;HCPinVal[i]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(SH,&nbsp;HIGH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(ST,&nbsp;HIGH); } //控制灯泡 void&nbsp;light(int&nbsp;state)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;LightRPin&nbsp;=&nbsp;state;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;LightGPin&nbsp;=&nbsp;state;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;LightBPin&nbsp;=&nbsp;state;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Update74HC595();} //控制风扇 void&nbsp;fan(int&nbsp;state)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;FanPin&nbsp;=&nbsp;state;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Update74HC595();} //控制水泵 void&nbsp;pump(int&nbsp;state)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;PumpPin&nbsp;=&nbsp;state;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Update74HC595(); &nbsp;&nbsp;&nbsp;}</code></p><p><em><strong>定义步进电机控制程序,我的步进电机是直接通过对4个脚位交替接地实现转动的,对应驱动板上的4个脚位要分别给与高电平:</strong></em></p><p><code class="brush:cpp;toolbar:false" >//开关窗帘需转动的圈数 #define&nbsp;CurtainTurns&nbsp;&nbsp;800 //窗帘转速,值越小,转越快 #define&nbsp;CurTarinDelayTime&nbsp;10 int&nbsp;CurtainMotorPin[5]&nbsp;=&nbsp;{11&nbsp;,8,9,10,11&nbsp;}; //控制窗帘电机 void&nbsp;curtain(int&nbsp;state){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurtainMotorPin[4]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(state==ON) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;CurtainTurns;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;4;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(CurtainMotorPin[i],&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(CurtainMotorPin[i&nbsp;+&nbsp;1],&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(CurTarinDelayTime); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;CurtainTurns;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;4;&nbsp;i&nbsp;&gt;0;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(CurtainMotorPin[i],&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(CurtainMotorPin[i&nbsp;-&nbsp;1],&nbsp;LOW); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(CurTarinDelayTime); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} }</code></p><p><strong><em>定义AT指令格式,需根据模块修改成对应的AT指令,同时对应的上传步骤也需更改:</em></strong></p><p><code class="brush:cpp;toolbar:false" >&nbsp; //AT&nbsp;+&nbsp;MPUB&nbsp;=&nbsp;&lt;qos,&nbsp;len,&nbsp;pub&gt;&lt;CR&gt; #define&nbsp;AT_MQTT_PUB_SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/property/post&quot; #define&nbsp;AT_MQTT_PUB_ALARM_SET&nbsp;&quot;AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/GasAlarm/post&quot; #define&nbsp;JSON_DATA_PACK_ALARM&nbsp;&nbsp;&quot;{\&quot;id\&quot;:\&quot;110\&quot;,\&quot;version\&quot;:\&quot;1.0\&quot;,\&quot;method\&quot;:\&quot;thing.event.GasAlarm.post\&quot;,\&quot;params\&quot;:{\&quot;GasDetector\&quot;:%d}}\r&quot; #define&nbsp;JSON_DATA_PACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;{\&quot;id\&quot;:\&quot;100\&quot;,\&quot;version\&quot;:\&quot;1.0\&quot;,\&quot;method\&quot;:\&quot;thing.event.property.post\&quot;,\&quot;params\&quot;:{\&quot;RoomTemp\&quot;:%d.%02d,\&quot;AC\&quot;:%d,\&quot;Fan\&quot;:%d,\&quot;Buzzer\&quot;:%d,\&quot;GasDetector\&quot;:%d}}\r&quot; #define&nbsp;JSON_DATA_PACK_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;{\&quot;id\&quot;:\&quot;110\&quot;,\&quot;version\&quot;:\&quot;1.0\&quot;,\&quot;method\&quot;:\&quot;thing.event.property.post\&quot;,\&quot;params\&quot;:{\&quot;LightDetector\&quot;:%d,\&quot;Curtain\&quot;:%d,\&quot;Light\&quot;:%d,\&quot;SoilHumi\&quot;:%d,\&quot;Pump\&quot;:%d,\&quot;eCO2\&quot;:%d,\&quot;TVOC\&quot;:%d}}\r&quot; &nbsp; #define&nbsp;&nbsp;AT_MQTT_PUB_DATA&nbsp;&quot;AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/property/post&quot; #define&nbsp;AT_MQTT_PUB_DATA_SUCC&nbsp;&quot;+MQTTEVENT:PUBLISH,SUCCESS&quot;</code></p><p>具体的代码为:<a href="https://pan.baidu.com/s/1SB73eJ9yjzYch9KsOD6Klg" target="_blank" >https://pan.baidu.com/s/1SB73eJ9yjzYch9KsOD6Klg</a></p>
1 回复