- 综合讨论区
- 帖子详情
置顶
我的智慧小屋搭建
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 <SoftwareSerial.h>//模拟串口模块
#include <Wire.h>//I2C连接库
#include "Adafruit_CCS811.h"//CCS811模块库</code></p><p><em><strong>定义虚拟串口引脚,将2和3作为虚拟串口,并在网络通信时通过虚拟串口输出,硬件串口输出各种信息以便于调试:</strong></em></p><p><code class="brush:cpp;toolbar:false" >//wifi模块虚拟串口引脚
#define WIFI_RX 2
#define WIFI_TX 3
SoftwareSerial WifiSerial(WIFI_RX, WIFI_TX); // 软串口对象RX, 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 SH 5
#define ST 6
#define DS 7
//74HC595的8个脚位的数值
int HCPinVal[8] = { 0,0,0,0,0,0,0,0 };
//74HC595的8个脚位代表的数值
#define LightRPin HCPinVal[5]
#define LightGPin HCPinVal[6]
#define LightBPin HCPinVal[7]
#define FanPin HCPinVal[2]
#define PumpPin HCPinVal[1]
//刷新74HC595的8个脚位
void Update74HC595() {
digitalWrite(ST, LOW);
for (int i = 7; i >-1; --i) {
digitalWrite(SH, LOW);
digitalWrite(DS, HCPinVal[i]);
digitalWrite(SH, HIGH);
}
digitalWrite(ST, HIGH);
}
//控制灯泡
void light(int state) {
LightRPin = state;
LightGPin = state;
LightBPin = state;
Update74HC595();}
//控制风扇
void fan(int state) {
FanPin = state;
Update74HC595();}
//控制水泵
void pump(int state) {
PumpPin = state;
Update74HC595();
}</code></p><p><em><strong>定义步进电机控制程序,我的步进电机是直接通过对4个脚位交替接地实现转动的,对应驱动板上的4个脚位要分别给与高电平:</strong></em></p><p><code class="brush:cpp;toolbar:false" >//开关窗帘需转动的圈数
#define CurtainTurns 800
//窗帘转速,值越小,转越快
#define CurTarinDelayTime 10
int CurtainMotorPin[5] = {11 ,8,9,10,11 };
//控制窗帘电机
void curtain(int state){
CurtainMotorPin[4];
if (state==ON)
{
for (int i = 0; i < CurtainTurns; ++i) {
for (int i = 0; i < 4; ++i) {
digitalWrite(CurtainMotorPin[i], LOW);
digitalWrite(CurtainMotorPin[i + 1], LOW);
delay(CurTarinDelayTime);
}
}
}
else
{
for (int i = 0; i < CurtainTurns; ++i) {
for (int i = 4; i >0; ++i) {
digitalWrite(CurtainMotorPin[i], LOW);
digitalWrite(CurtainMotorPin[i - 1], LOW);
delay(CurTarinDelayTime);
}
}
}
}</code></p><p><strong><em>定义AT指令格式,需根据模块修改成对应的AT指令,同时对应的上传步骤也需更改:</em></strong></p><p><code class="brush:cpp;toolbar:false" >
//AT + MPUB = <qos, len, pub><CR>
#define AT_MQTT_PUB_SET "AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/property/post"
#define AT_MQTT_PUB_ALARM_SET "AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/GasAlarm/post"
#define JSON_DATA_PACK_ALARM "{\"id\":\"110\",\"version\":\"1.0\",\"method\":\"thing.event.GasAlarm.post\",\"params\":{\"GasDetector\":%d}}\r"
#define JSON_DATA_PACK "{\"id\":\"100\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"RoomTemp\":%d.%02d,\"AC\":%d,\"Fan\":%d,\"Buzzer\":%d,\"GasDetector\":%d}}\r"
#define JSON_DATA_PACK_2 "{\"id\":\"110\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":{\"LightDetector\":%d,\"Curtain\":%d,\"Light\":%d,\"SoilHumi\":%d,\"Pump\":%d,\"eCO2\":%d,\"TVOC\":%d}}\r"
#define AT_MQTT_PUB_DATA "AT+MPUB=QOS1,%d,/sys/%s/%s/thing/event/property/post"
#define AT_MQTT_PUB_DATA_SUCC "+MQTTEVENT:PUBLISH,SUCCESS"</code></p><p>具体的代码为:<a href="https://pan.baidu.com/s/1SB73eJ9yjzYch9KsOD6Klg" target="_blank" >https://pan.baidu.com/s/1SB73eJ9yjzYch9KsOD6Klg</a></p>
1
回复