【涂鴉智能】 基于Arduino智能除濕工控器
#d=====( ̄▽ ̄*)b
#前排首先感謝金主,提供的這個學習的機會,學習的平臺
#一、設計概況
1、濕度過高,自動開啟除濕。適用于大型滑冰場的大型除濕機、北方澡堂子、家庭浴室、浴霸等。(之前公司有個項目就是給的一個大型除濕機廠家開發控制系統)。同理可做加濕功能。解決大型工控行業設備聯網問題。
[涂鴉平臺MCU產品開發]()
2、本方案基于Arduino-UNO,開發門檻低,程序燒錄方便。
![mcu.png](//image.lceda.cn/pullimage/pGsXiDmbYHMPFN1SS5ZLcif1fxA0OclaAmDZXdvw.png)
3、電源部分采用了AC-DC模塊得到5V電源供給MCU,再經由AMS1117-33得到3.3V的電源供給WiFi模組。
![電源.png](//image.lceda.cn/pullimage/4rBli0WnqAHLf5MNqk96kKk6jq95YgoqDQCFkby5.png)
4、一直以來繼電器外圍電路就要考慮太多的器件了,這里選擇了一個NUD3105,內部集成了許多外圍,可以直接控制繼電器,不必再考慮繼電器反向感應電、上拉(下拉、限流)電阻等,可以說是非常方便的。(上一次訓練營得到的經驗)
![繼電器.png](//image.lceda.cn/pullimage/tt9w2f9RhVaAV3UiK7XnaCtneL7mQW77wDOHyB5e.png)
5、Wifi模組是選用了涂鴉的WB3S(通用固件版),3.3V供電,串口通訊,通訊十分方便,外圍電路僅需要電源+穩壓電容,簡直不要太簡單。
貼一下規格書鏈接:[涂鴉Wi-Fi+BLE雙協議模組WB3S規格書](),電路如下圖:
![wifi.png](//image.lceda.cn/pullimage/S1ZG3vKmy76j1wK63d036K2jNsqlfh5Y8op41Uij.png)
開發資料是我用過的平臺最詳細的,連PID這類密鑰類的都已經寫入了案例代碼,僅加入自己的MCU的功能代碼即可完美調用,如下圖:
![資料.png](//image.lceda.cn/pullimage/JS5mFmTcn3odCGrGfEzSJaki5n4QiOlSbJeToE9z.png)
6、電平轉換:由于Arduino-UNO平臺IO是5V的電平,和Wifi模組是3.3V(如下圖)
![IO口電平.png](//image.lceda.cn/pullimage/B6xlhnguwTeznCXhFAie7EodXhZzSSLizsFFCXMQ.png)
Arduino-UNO和Wifi通訊時候必須要經過電平轉換。如下圖:
![電平轉換.png](//image.lceda.cn/pullimage/zh98ioZXcgJwmzbxnG44MKn8KrFtVTcA3w1eXCrM.png)
#二、公模外殼及PCB二三事
1、在設計一款板子前最好能轄一個合適的外殼,根據外殼的尺寸來進行PCB的設計,這樣后續能很好的安裝,如果只是開發版、實驗版那就請隨意。
2、剛好公司有這個外殼,公模的比較好買。隨手就拿了一個來量了尺寸。制作PCB設計。(為了怕淘寶店鋪鏈接失效,這里就不放鏈接了,大家可以在淘寶搜索“溫濕度外殼”,按照價格低到高排序,找幾下就能發現一模一樣的外殼了)
![尺寸.png](//image.lceda.cn/pullimage/JpV8DldPFxzYdeGNeVxxvdvcUNflQmujQczPSGDO.png)
按照搜索到的尺寸,規劃好邊框、螺絲孔,然后鎖定
![畫好邊框.png](//image.lceda.cn/pullimage/bQw3k0cJI8D7eqJZ3OTYVPgKcZqiz80vQxUofry8.png)
3、殼子選小了點,不好放呀。單面估計是放不下了
![頂層放不下.png](//image.lceda.cn/pullimage/4sI6CgL2hxKxX87XXPeve02nLyDrYcytEPa2NMQf.png)
4、只好放到背面一些了,矮一些的器件放到底層去了,熬到了凌晨,完工
![平面圖.jpg](//image.lceda.cn/pullimage/CtWV0dfdzcnlYGOVLqZxBUcdLzegJtV8BYTKDgku.jpeg)
5、一些注意事項
(1)強電區域用了比較粗的線寬2mm,并轉換為焊盤了,后期可以多焊一些錫去加厚銅箔,增加功率。
![轉換焊盤.png](//image.lceda.cn/pullimage/r40oKsSrJHJ2UEHR4LhGDffaAWjKtg7QMRWyUKVq.png)
(2)強電區域,不能鋪銅。因為要防止強電爬電到內部微電路,十分危險。可用實心填充工具,繪制完區域后在屬性欄設置為無填充。如下設置:
![無填充.png](//image.lceda.cn/pullimage/MSBmM3xc7z8F8EFEEIkvLbzvqaipiuihvI0PJsrR.png)
![強電不鋪銅.png](//image.lceda.cn/pullimage/6qePfOK8JvB2hDhcXlpgk7wXkAshCxAUuJQ5MFsy.png)
(3)溫濕度傳感器位置要盡量靠邊,有條件的可以加微小的風扇。傳感器要遠離內部發熱的組件(如:電源芯片、電源模組、降壓芯片等)。本案放置在頂部邊角。
![溫濕度傳感器位置.png](//image.lceda.cn/pullimage/AYkUG3hs1crzLZPUs7IExkc8lbRT3vlEDD66faqx.png)
#三、焊接成品
1、方法多種多樣,目前筆者是采用的“鐵板燒”,先涂抹錫膏,貼上去,然后用“呼呼機”加熱。
2、完成了之后,AC-DC模塊、繼電器先不焊(焊了不方便調試),調試完成后再補上。~~~~
***注意:先檢查VCC(5V3.3VUSB)和GND是否為短路狀態,再插電前一點要確認好,短路切勿插電。***
![貼片焊接的.png](//image.lceda.cn/pullimage/07R2lcb8c0l9LBI8YAzfHfG1FjBTYYZqIpz9N6r8.png)
#四、軟件代碼部分
1、下載的MCU_SDK文件,打開來,放到一文件夾里。“.c”改為“.cpp”后,IDE就可以打開了。細節可以看[涂鴉平臺提供的移植MCUSDK教程]()
2、總之就是要多看文檔,這個代碼每個人的PID、功能等都不一樣,我貼上了Arduino的主程序代碼,如果你和我的功能一樣,大家可以自行下載代碼,并修改自己的PID等地方。當然功能不同的,只能自己看著修改了
```language
#include"wifi.h"
#include"Adafruit_SHT31.h"
#include
#include
#include
SoftwareSerialmySerial(5,6);//RX,TX
#define_SS_MAX_RX_BUFF300
#definerelay10
Adafruit_SHT31sht31=Adafruit_SHT31();
inttime_cnt=0,cnt=0,init_flag=0;
intTEM,HUM,TEM_Past,HUM_Past;
uniondata
{
inta;
byteb[4];
};
dataHUMUPPR;
dataHUMLOWER;
voidsetup(){
pinMode(relay,OUTPUT);//繼電器I/O初始化
digitalWrite(relay,LOW);
pinMode(3,INPUT_PULLUP);//重置Wi-Fi按鍵初始化
pinMode(13,OUTPUT);//Wi-Fi狀態指示燈初始化
mySerial.begin(9600);//軟件串口初始化
//mySerial.println("myserialinitsuccessful!");
Serial.begin(9600);//PA3RXPA2TX
Serial.println("serialinitsuccessful!");
sht31.begin(0x44);//SHT地址0x44
wifi_protocol_init();
for(intn=0;n<4;n++)//濕度上限讀取
HUMUPPR.b[n]=EEPROM.read(n);
for(intn=0;n<4;n++)//濕度下限讀取,下限起始地址在4
HUMLOWER.b[n]=EEPROM.read(n+4);
}
voidloop(){
if(init_flag==0){
time_cnt++;
if(time_cnt%6000==0){
time_cnt=0;
cnt++;
}
wifi_stat_led(&cnt);//Wi-Fi狀態處理
}
wifi_uart_service();
myserialEvent();//串口接收處理
key_scan();//重置配網按鍵檢測
aotocontrol();//自動控制
}
/***********完整代碼詳見附件*******************/
```
3、設備的濕度上限下限由于是報警值,不能在程序中定義初值,否則一旦調電重啟就會丟失設置的值,我這里是方式是把設定的閾值存儲在單片機的ROM中(Arduino的EEPROM),這樣進程到來時讀取一次,下發設置值時寫入。這樣掉~~~~電也不會丟失數據了
```
uniondata
{
inta;
byteb[4];
};
dataHUMUPPR;
dataHUMLOWER;
for(intn=0;n<4;n++)//濕度上限讀取EEPROM
HUMUPPR.b[n]=EEPROM.read(n);
for(intn=0;n<4;n++)//濕度下限讀取EEPROM,下限起始地址在4
HUMLOWER.b[n]=EEPROM.read(n+4);
```
```
uniondata
{
inta;
byteb[4];
};
dataHUMUPPR;
dataHUMLOWER;
/**********放置到上限值設置函數dp_download_maxhum_set_handle中*******/
HUMUPPR.a=(int)maxhum_set;
for(intn=0;n<4;n++)//寫入濕度上限到EEPROM,上限起始地址是0
EEPROM.write(n,HUMUPPR.b[n]);
/**********放置到下限值設置函數dp_download_minihum_set_handle中*******/
HUMLOWER.a=(int)minihum_set;
for(intn=0;n<4;n++)
EEPROM.write(n+4,HUMLOWER.b[n]);//寫入濕度下限到EEPROM,下限起始地址是4
```
#避坑指南:
#####(1)掉電丟失濕度閾值:
一定要用ROM來承接設置值,這樣可以掉電保存;之前我寫的程序久忘記了,一掉電就丟失之前設置好的值。
#####(2)始終無法進入配網模式:
SHT的底層庫有500ms延時,在循環里調用讀取時,我實測要7s才能返回給wifi模塊心跳,始終連不上網,也無法進去配網模式,然后我就改了底層的延遲,問題就解決了;(可能還有其他解決的方式,我暫時還沒有發現)
```language
booleanAdafruit_SHT31::readTempHum(void){
uint8_treadbuffer[6];
writeCommand(SHT31_MEAS_HIGHREP);
delay(500);/**********我把這里改成了100*************/
Wire.requestFrom(_i2caddr,(uint8_t)6);
if(Wire.available()!=6)
returnfalse;
for(uint8_ti=0;i<6;i++){
readbuffer[i]=Wire.read();
//Serial.print("0x");Serial.println(readbuffer[i],HEX);
}
```
#####(3)Wif模塊下盡量不要走線:
之前涂鴉的工程師說wifi模塊下面最好不要走線,我的1.1版本走了,所有又畫了1.2的PCB(心急已經提前打了1.1的板子),但是從目前測試來看,**V1.1**已經是**成功**了。所以小伙伴可以自行選擇。
#####(4)繼電器有點高:
繼電器選擇的時候尺寸沒有注意,忘記算板子厚度了,有點高,超了1mm左右,蓋子蓋不上,還好我機智的用熱熔膠給它倆黏住了。
#####(5)僅供學習參考:~~~~
完全復制有風險,代碼、走線、布局等等被坑的別怪UP哦,后果自擔啦
#成功的喜悅(實測演示):