DIY烤肉加热台,了解一下?
#故事起源#
????最近想要吃烤肉,可是沒(méi)有烤爐怎么辦呢,家里有個(gè)破電熨斗,改改也許可以,拿來(lái)試試吧
????不,故事不是這樣的,重新再來(lái),最近旺仔爸爸設(shè)計(jì)的一個(gè)作品《斜視矯正器》,該作品是將所有電路做在一個(gè)眼鏡中的,對(duì)電路的體積要求比較高,雖然已經(jīng)完成了,但作為強(qiáng)迫癥的我來(lái)說(shuō),還是想改進(jìn)一下,要改進(jìn)眼鏡的電路部分這就需要按照需求重新設(shè)計(jì)PCB板啦,于是旺仔爸爸先設(shè)計(jì)一塊小型電路板練手,以便將丟失已久PCB設(shè)計(jì)知識(shí)重新拾起來(lái),PCB板設(shè)計(jì)好了,可是沒(méi)有貼片機(jī),又不想手工焊,怎么辦呢,很早之前在油管上看到一位大佬用電熨斗做的回流焊加熱臺(tái)非常的好用,家里正好有電熨斗,那就改造一個(gè)微型回流焊熱臺(tái)吧,以表達(dá)我對(duì)大佬的敬意和感謝,我給它起名Micro reflow welder,先來(lái)欣賞一下它的制作視頻
#方案介紹#
????聲明:本次分享的是一個(gè)模擬回流焊加工工藝的DIY作品,并非工業(yè)級(jí)的回流焊設(shè)備
????首先科普一下回流焊焊接工藝
????電子焊接技術(shù)廣泛應(yīng)用在電子制造領(lǐng)域,隨著更小封裝體積的貼片元件的出現(xiàn),讓電子產(chǎn)品更新?lián)Q代的速度變得越來(lái)越快、越來(lái)越智能,PCB電路板的集成度也變得越來(lái)越高,而為了滿(mǎn)足各種貼片元件的焊接,回流焊工藝技術(shù)就應(yīng)運(yùn)而生了,目前幾乎在所有電子產(chǎn)品領(lǐng)域都已得到應(yīng)用,我們的電腦,手機(jī)內(nèi)使用的各種電子元件都是通過(guò)這種工藝焊接到電路板上的
????綜上所述就是,選擇貼片回流焊的焊接工藝可以設(shè)計(jì)制作體積更加小巧的PCB電路板
????這種焊接設(shè)備的內(nèi)部有加熱平臺(tái),焊接時(shí)需要在PCB電路板的焊盤(pán)上刷錫膏,接著將各種貼片元件正確放置在焊盤(pán)上,當(dāng)加熱到足夠錫膏融化的溫度時(shí),電子元件就會(huì)與PCB電路板牢固的貼合在一起了
而我們本次使用一種DIY的方法制作一個(gè)微型的回流焊加熱臺(tái)
加熱平臺(tái)選擇了電熨斗的加熱板
電熨斗有自動(dòng)加熱斷電、溫度調(diào)節(jié)的功能,這么低廉的價(jià)格能把這些功能都做進(jìn)去太佩服我國(guó)的制造業(yè)水平了,我們來(lái)看下電熨斗拆開(kāi)后的樣子
中間旋鈕部分通過(guò)物理方式來(lái)調(diào)節(jié)溫度,電熨斗自帶過(guò)載保護(hù)電路,在拆解下來(lái)的電熨斗中我們只需要加熱平臺(tái)的部分
因?yàn)槲覀円龌亓骱讣訜崞脚_(tái),它需要具備:溫度調(diào)節(jié)、加熱功率調(diào)節(jié)、冷卻降溫、電路保護(hù)等功能,接下來(lái)我們對(duì)這些功能進(jìn)行介紹
溫度調(diào)節(jié)
????在回流焊焊接的過(guò)程中,溫度控制是非常關(guān)鍵的一個(gè)環(huán)節(jié),整個(gè)過(guò)程大致分為四個(gè)階段,預(yù)熱區(qū),溫度保持區(qū),回流區(qū),冷卻區(qū),每個(gè)階段的溫度都需要精確控制,而溫度檢測(cè)功能對(duì)于回流焊設(shè)備來(lái)說(shuō)就顯得尤為重要了
????回流焊焊接工藝中的峰值溫度不宜超過(guò)250℃,溫度太高容易損壞元器件,所以我們使用測(cè)溫范圍較大的MAX6675熱電偶作為溫度檢測(cè)模塊,測(cè)溫范圍在0-1024℃,溫度分辨率0.25℃
加熱功率調(diào)節(jié)
????接著就是根據(jù)檢測(cè)到的溫度來(lái)調(diào)節(jié)加熱功率,
我們使用一個(gè)可以直接輸出220V交流電的可控硅模塊來(lái)調(diào)節(jié)加熱功率,由于可控硅模塊自身的缺陷問(wèn)題,不能完全降壓到0v,也就是不能讓電熨斗完全停止工作,于是我們需要在電路中增加一個(gè)繼電器,這樣可以通過(guò)繼電器讓加熱平臺(tái)停止工作,也起到了安全保護(hù)的作用
冷卻降溫
箱體中我們使用一個(gè)5V的靜音風(fēng)扇,目的是讓各種電子元件不至于過(guò)熱
而為了快速降低加熱平臺(tái)的溫度,我們使用一個(gè)8000r/min的暴力風(fēng)扇
控制風(fēng)扇必不可少的就是電機(jī)驅(qū)動(dòng),這次我們本著有什么用什么的原則,使用了一個(gè)L298N型號(hào)的電機(jī)驅(qū)動(dòng)
使用一個(gè)電位器來(lái)設(shè)定加熱的目標(biāo)溫度,用一個(gè)按鍵作為是否開(kāi)始工作的按鈕
最后我們將所有檢測(cè)到數(shù)據(jù)顯示在0.96寸的OLED屏幕中即可
因?yàn)楸敬巫髌分薪尤肓?20v交流電,我們只需要再找了一塊手機(jī)充電頭里的電路板,就可以將220V的電源經(jīng)過(guò)轉(zhuǎn)換給控制器供電了,這里需要強(qiáng)調(diào)的是,由于用到了強(qiáng)電,在制作和調(diào)試的過(guò)程中一定要注意安全
各種器材確定后,我們就可以開(kāi)始制作了
#設(shè)計(jì)制作#
本次我們制作的Micro reflow welder,用到的材料清單如下:
#硬件清單#
arduino nano控制器+擴(kuò)展板*1
MAX6675熱電偶模塊*1
可控硅模塊*1
數(shù)字按鍵*1
電位器*1
0.96寸OLED屏幕*1
L298N電機(jī)驅(qū)動(dòng)*1
手機(jī)充電電路板*1
5v散熱風(fēng)扇*2
開(kāi)關(guān)*1
AC接口*1
電熨斗加熱平臺(tái)*1
萬(wàn)向臂*1
五金杜邦線(xiàn)若干
3mm奧松板40*60一塊
#圖紙?jiān)O(shè)計(jì)#
使用Fusion360計(jì)算機(jī)輔助設(shè)計(jì)軟件設(shè)計(jì)3維模型
利用lasermaker軟件處理圖紙并使用激光切割機(jī)把它加工出來(lái),材料選擇3mm的奧松板
加工完成后的結(jié)構(gòu)如下圖
#電路設(shè)計(jì)#
接著我們進(jìn)行電路設(shè)計(jì)
Micro reflow welder用到的電子器件會(huì)稍微有點(diǎn)多,需要仔細(xì)按照接線(xiàn)圖接線(xiàn)
主控我們選擇最普通的arduino nano,為了給控制器提供5v電壓,這里拆解了一個(gè)手機(jī)充電器中的電路板來(lái)將200v電源轉(zhuǎn)換為5v電源給控制器供電,在風(fēng)扇接線(xiàn)時(shí)一定要注意正負(fù)極,正負(fù)極反接是不會(huì)工作的,還有可能損壞風(fēng)扇
電路接線(xiàn)如下圖所示
#組裝#
Micro reflow welder的組裝非常的簡(jiǎn)單,只需幾步即可完成
1.將所有電子器件安裝在底板、前面板和左右側(cè)板上
開(kāi)關(guān)、OLED屏幕、電位器和按鍵安裝在前面板上
靜音風(fēng)扇和交流電源接口安裝在右側(cè)板上
暴力風(fēng)扇的電線(xiàn)穿過(guò)萬(wàn)向臂然后將萬(wàn)向臂安裝在左側(cè)板上,
2.電子器件安裝完成后,將4塊側(cè)板拼裝在一起,然后將拼裝好的4塊側(cè)板與底板安裝在一起
3.結(jié)構(gòu)件安裝完畢后按照前文中的電路圖連接內(nèi)部電路
4.將電熨斗加熱平臺(tái)安裝在頂板上,并與前面已經(jīng)安裝好的部分拼裝在一起
安裝完畢后的效果如下圖
別忘記將測(cè)溫電路和加熱電路從頂板穿出與加熱平臺(tái)連接
最后就是程序設(shè)計(jì)了,開(kāi)始程序設(shè)計(jì)前,我們需要先捋一下Micro reflow welder的運(yùn)作方式
#程序設(shè)計(jì)#
這是Micro reflow welder的工作流程
????本次作品程序編寫(xiě)我們使用Arduino IDE編程環(huán)境,關(guān)于Arduino IDE 編程環(huán)境的下載安裝,可以在<mixly.org>官網(wǎng)下載到最新版本的mixly軟件,自帶的Arduino IDE 編程環(huán)境做好了各種配置,省去了我們?nèi)ヅ渲酶鞣N控制板的過(guò)程,大大提高了效率
編程環(huán)境配置好后下面我們從最簡(jiǎn)單的溫度測(cè)量開(kāi)始掌握
溫度測(cè)量
????從前文中我們知道本次我們使用MAX6675熱電偶模塊來(lái)檢測(cè)溫度,電路正確連接后,我們進(jìn)行測(cè)試
第一步添加庫(kù)文件,我們打開(kāi)Arduino IDE編程環(huán)境,選擇<庫(kù)管理>,搜索欄輸入“MAX6675”關(guān)鍵詞,找到<MAX6675_Thermocouple>庫(kù)文件并安裝
打開(kāi)如下示例程序,設(shè)定好引腳編號(hào),選擇正確的板卡和串口后下載并運(yùn)行
????下載完成,打開(kāi)串口監(jiān)視器,如果看到了3種不同單位的溫度數(shù)值,說(shuō)明我們運(yùn)行成功了,這一步非常的關(guān)鍵,意味著我們已經(jīng)可以用MAX6675來(lái)測(cè)量溫度,接著只需要將程序攝氏度℃單位的溫度數(shù)據(jù)保留,其他刪除即可
(K)為國(guó)際單位熱力學(xué)溫標(biāo),華氏溫標(biāo)(°F)是另一種國(guó)際上用得較多的溫標(biāo)
認(rèn)真閱讀上面的示例程序,我們可以知道,溫度數(shù)據(jù)是通過(guò)<delay(500)>這條指令實(shí)現(xiàn)每隔0.5s檢測(cè)一次的,而本次項(xiàng)目程序運(yùn)行過(guò)程中如果每次刷新都需要延時(shí)等待0.5s的話(huà),顯然效率有點(diǎn)太低了,假設(shè)我們把這個(gè)等待時(shí)間刪除,或者改成0.05s,這時(shí)候你會(huì)發(fā)現(xiàn)由于刷新速度太快溫度數(shù)據(jù)檢測(cè)不到了,該如何解決這個(gè)問(wèn)題呢,這時(shí)候我們可以引入一個(gè)定時(shí)器每隔0.3s檢測(cè)一次溫度數(shù)據(jù),這樣也就再也不會(huì)影響主程序的運(yùn)行了
什么是定時(shí)器呢,我們可以簡(jiǎn)單理解為一個(gè)單獨(dú)運(yùn)行的鬧鐘,每隔一段時(shí)間就去執(zhí)行設(shè)定好的事情,對(duì)主程序不產(chǎn)生任何影響
接下來(lái)我們來(lái)看一下定時(shí)器的使用方法
定時(shí)器的用法
我們編寫(xiě)如下程序,下載后查看運(yùn)行效果
打開(kāi)串口監(jiān)視器,我們會(huì)看到,溫度數(shù)據(jù)每隔0.3s打印輸出一次,字符串"Micro reflow welder"每隔0.6s打印輸出一次,相互之間不影響
從程序中,我們不難發(fā)現(xiàn)
要使用定時(shí)器需要先導(dǎo)入#include <MsTimer2.h>定時(shí)器庫(kù)文件
然后使用如下的指令就可以讓<?temp_data>?函數(shù)每隔0.3s執(zhí)行一次
MsTimer2::set(300, temp_data); MsTimer2::start();而<?temp_data> 函數(shù)的作用正是前文中我們提到的溫度檢測(cè)的程序,不過(guò)旺仔爸爸發(fā)現(xiàn),<MsTimer2.h>定時(shí)器使用時(shí)會(huì)和3號(hào)數(shù)字引腳沖突,所以要盡量避開(kāi)
溫度檢測(cè)和定時(shí)器的功能掌握后,我們來(lái)了解數(shù)字信號(hào)的處理,首先是數(shù)字輸入信號(hào)
數(shù)字輸入信號(hào)
????在本次項(xiàng)目中,我們使用一個(gè)按鍵作為開(kāi)始按鈕,而這個(gè)按鍵的作用就是典型的數(shù)字輸入信號(hào),我們定義11號(hào)數(shù)字管腳為按鍵輸入,接著我們下載下面的程序看一下效果
#define button 11 //按鍵引腳 void setup() {Serial.begin(9600); } void loop() {int start_button = digitalRead(button);//存儲(chǔ)按鍵狀態(tài)if(start_button == 0){Serial.print("down!\n\r");} }從運(yùn)行結(jié)果中可以看出,當(dāng)我們按下一次按鍵時(shí)<start_button == 0>,也就是低電平時(shí),會(huì)在串口監(jiān)視器中打印很多字符串“down”
為什么按了一次會(huì)打印很多個(gè)字符串出來(lái)呢,那是因?yàn)榭刂破鞯乃⑿骂l率非常快,它誤以為我們按了很多次按鍵,所以會(huì)打印多個(gè)字符串,理論上如果我們的手速足夠快是可以做到按下一次打印一次的,但那樣好像并不太現(xiàn)實(shí),有沒(méi)有其他方法能做到每按一次就打印一個(gè)字符串呢,這里就涉及到了我們常用的消抖技巧了
我們對(duì)上面的程序進(jìn)行修改,一起來(lái)看程序
#define button 11 //按鍵引腳 void setup() {Serial.begin(9600); } void loop() {int start_button = digitalRead(button);//存儲(chǔ)按鍵狀態(tài)if(start_button == 0)//兩次檢測(cè)按鍵的狀態(tài){delay(1000); if ( digitalRead(button) == 0){Serial.print("start! \n\r");} } }這時(shí)候我們?cè)诔绦蛑性O(shè)置對(duì)按鍵的狀態(tài)進(jìn)行了兩次檢測(cè)
當(dāng)我們按下按鍵時(shí)長(zhǎng)超過(guò)1s會(huì)在串口監(jiān)視器打印一個(gè)“start”字符串,而誤觸按鍵是不會(huì)起到任何作用的
數(shù)字輸入信號(hào)的知識(shí)掌握后,我們來(lái)看一下數(shù)字輸出信號(hào)如何處理
數(shù)字輸出信號(hào)
????本次作品用到的繼電器模塊就是典型的數(shù)字輸出信號(hào)的應(yīng)用,通常繼電器有常閉和常開(kāi)兩種接線(xiàn)端子可以用來(lái)連接電路,當(dāng)我們使用常開(kāi)引腳接線(xiàn)時(shí),數(shù)字引腳輸出高電平<HIGH>時(shí)繼電器導(dǎo)通,數(shù)字引腳輸出低電平<LOW>時(shí)繼電器斷開(kāi),指令如下:
digitalWrite(relay,LOW); digitalWrite(relay,HIGH);接著我們將繼電器的控制與按鍵程序結(jié)合,改進(jìn)后的程序如下
#define button 11 //按鍵引腳 #define relay 12 //繼電器引腳 void setup() {Serial.begin(9600);pinMode(relay, OUTPUT);//繼電器 } void loop() {int start_button = digitalRead(button);//存儲(chǔ)按鍵狀態(tài)if(start_button == 0)//兩次檢測(cè)按鍵的狀態(tài){delay(1000); if ( digitalRead(button) == 0){digitalWrite(relay,HIGH);Serial.print("start! \n\r");} }else{digitalWrite(relay,LOW);} }程序中,我們?cè)黾恿?2號(hào)數(shù)字引腳為繼電器控制引腳,這里需要注意的是在<void setup()>初始化的程序中需要將繼電器的引腳設(shè)置為輸出狀態(tài)<pinMode(relay, OUTPUT)>,然后就可以在數(shù)字按鍵檢測(cè)程序的基礎(chǔ)上增加繼電器控制了,程序下載后可以看到的運(yùn)行結(jié)果是,當(dāng)按鍵按下時(shí)長(zhǎng)超過(guò)1s繼電器導(dǎo)通,松開(kāi)后繼電器斷開(kāi)
數(shù)字輸入和數(shù)字輸出引腳掌握后,我來(lái)學(xué)習(xí)模擬信號(hào)的處理
模擬輸入信號(hào)
在此次作品中用來(lái)調(diào)節(jié)溫度的電位器是典型的模擬輸入信號(hào)
我們將電位器連接主控板的A0引腳,編寫(xiě)如下程序
void setup() {Serial.begin(9600); } void loop() {Serial.println( analogRead(A0));delay(1000); }運(yùn)行程序,調(diào)節(jié)電位器可以在串口監(jiān)視器中看到模擬信號(hào)在0-1023之間變化
由于回流焊的峰值溫度不宜超過(guò)230℃,我們可以利用<map>函數(shù)將電位器的模擬信號(hào)做一次映射,這樣就可以將原本0-1023的范圍縮小到0-230了,我們需要將上面的程序做如下改動(dòng)即可
void setup() {Serial.begin(9600); } void loop() {int temp_target = analogRead(A0);temp_target = map(temp_target, 0, 1023, 0, 230);Serial.println( temp_target);delay(1000); }從串口監(jiān)視器中的結(jié)果中我們可以發(fā)現(xiàn),數(shù)據(jù)由原來(lái)的0-1023變成了0-230
其實(shí),我們還可以將程序做如下調(diào)整,把映射后的整數(shù)類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成字符串類(lèi)型,這樣就可以方便的顯示在OLED屏幕中了
temp_target = analogRead(A0); temp_target = map(temp_target, 0, 1023, 0, 230); temp_target_str = String(temp_target);//將整數(shù)類(lèi)型轉(zhuǎn)換為字符串類(lèi)型 Serial.print("temp_now:\n\r"); Serial.print( temp_target_str);模擬輸入信號(hào)的處理告一段落,下面我們來(lái)了解模擬輸出信號(hào)
模擬輸出信號(hào)處理
????在我們本次的作品中,用來(lái)調(diào)節(jié)平臺(tái)加熱功率的數(shù)據(jù)是典型的模擬輸出信號(hào),即PWM脈沖寬度調(diào)制信號(hào),在Arduino uno或者nano等類(lèi)型的主控中有6個(gè)PWM信號(hào)引腳,分別是3、5、6、9、10、11,每個(gè)引腳的模擬信號(hào)數(shù)值范圍是0-255,這次我們使用10號(hào)引腳作為模擬輸出來(lái)調(diào)節(jié)加熱功率
在程序中,我們可以定義變量<PWM_PIN>為10號(hào)引腳,通過(guò)代碼<analogWrite(PWM_PIN,255)>就可以調(diào)節(jié)加熱功率了
#define PWM_PIN 10 //可控硅功率調(diào)節(jié) void setup() {Serial.begin(9600);pinMode(PWM_PIN, OUTPUT);//可控硅功率調(diào)節(jié) } void loop() {analogWrite(PWM_PIN,255);//范圍是0-255delay(1000); }在回流焊焊接的過(guò)程中,功率調(diào)節(jié)遍布于4個(gè)不同的階段,我們可以將加熱功率的程序封裝成一個(gè)函數(shù),這樣就可以很方便的調(diào)用,在函數(shù)中還可以順便把前文中講到的繼電器的控制指令加進(jìn)去,調(diào)節(jié)加熱功率的函數(shù)如下:
加熱功率調(diào)節(jié)
#define PWRFULL 230//滿(mǎn)加熱功率 #define PWM_PIN 10 //可控硅功率調(diào)節(jié) #define relay 12 //繼電器引腳 //加熱功率函數(shù) void setup() {pinMode(relay, OUTPUT);//繼電器pinMode(PWM_PIN, OUTPUT);//可控硅功率調(diào)節(jié) } void set_heat(int PWR_HEAT) {if (PWR_HEAT == 0){digitalWrite(relay,LOW);//繼電器斷開(kāi)analogWrite(PWM_PIN,0);}else{digitalWrite(relay,HIGH);//設(shè)置功率PWR = PWRFULL*PWR_HEAT/100; //PWRFUL為滿(mǎn)加熱功率hot = String(PWR_HEAT);//轉(zhuǎn)換成字符串類(lèi)型,方便屏幕顯示analogWrite(PWM_PIN,PWR);} }現(xiàn)在我們已經(jīng)掌握了調(diào)節(jié)加熱功率的函數(shù),那么都有哪些階段需要調(diào)節(jié)加熱功率呢,我們一起來(lái)了解一下
加熱功率的劃分
首先我們需要知道回流焊焊接工藝的溫度曲線(xiàn)
根據(jù)上圖,我們解讀一下每個(gè)階段的作用
預(yù)熱階段:其目的是將電路板及元件的溫度從室溫提升到錫膏內(nèi)助焊劑發(fā)揮作用所需的活性溫度135℃,加熱速率應(yīng)控制在每秒 1~3℃,溫度升得太快會(huì)引起元件損壞
溫度保持階段:其目的是將電路板及元件維持在某個(gè)特定溫度范圍并持續(xù)一段時(shí)間,使各個(gè)區(qū)域的元器件溫度相同,減少他們的相對(duì)溫差,并使錫膏內(nèi)部的助焊劑充分的發(fā)揮作用,一般普遍的活性溫度范圍是 135-170℃,時(shí)間設(shè)定在 60-90 秒。時(shí)間設(shè)定的過(guò)長(zhǎng)會(huì)使錫膏內(nèi)的助焊劑過(guò)度揮發(fā),致使在焊接時(shí)焊點(diǎn)易氧化,時(shí)間太短則參與焊接的助焊劑過(guò)多,可能會(huì)出現(xiàn)錫球,錫珠等焊接不良的情況
回流階段:其目的是使電路板的溫度提升到錫膏的熔點(diǎn)溫度以上并維持一定的焊接時(shí)間,完成元器件引腳與焊盤(pán)的焊接。該區(qū)的溫度設(shè)定在 183℃以上,時(shí)間為 30-90秒,峰值不宜超過(guò) 230℃,如果溫度低于183℃將無(wú)法形成合金實(shí)現(xiàn)不了焊接,若高于 230℃會(huì)對(duì)元器件帶來(lái)?yè)p害,如果時(shí)間不足會(huì)使合金層較薄,焊點(diǎn)的強(qiáng)度不夠,時(shí)間較長(zhǎng)則合金層較厚使焊點(diǎn)較脆。
冷卻階段:其目的是使電路板降溫,通常設(shè)定為每秒 3-4℃。如速率過(guò)高會(huì)使焊點(diǎn)出現(xiàn)龜裂現(xiàn)象,過(guò)慢則會(huì)加劇焊點(diǎn)氧化。理想的冷卻曲線(xiàn)應(yīng)該是和回流階段曲線(xiàn)成鏡像關(guān)系
我們從回流焊的溫度曲線(xiàn)可以知道,完成一次回流焊的過(guò)程對(duì)時(shí)間和溫度的把控要求非常高,靈活的控制溫度是本次編寫(xiě)程序的核心,旺仔爸爸將本次作品溫度控制的每個(gè)階段進(jìn)行了劃分,我們需要按照每個(gè)階段的溫度要求來(lái)編寫(xiě)程序
這里解讀部分代碼給大家做進(jìn)一步了解,我們查看如下程序,程序中<PRE>表示預(yù)熱階段,<KEEP>表示溫度保持階段,<FAST>表示溫度快速爬升階段,我們通過(guò)幾組條件判斷語(yǔ)句比較當(dāng)前溫度和目標(biāo)溫度的大小來(lái)切換進(jìn)入不同的階段
控制降溫風(fēng)扇
為了控制兩個(gè)降溫風(fēng)扇,我們需要掌握電機(jī)驅(qū)動(dòng)的編程方法
普通的直流電機(jī)控制無(wú)外乎正反轉(zhuǎn)和速度這兩方面
通過(guò)調(diào)節(jié)數(shù)字引腳的高低電平實(shí)現(xiàn)電機(jī)正反轉(zhuǎn)
通過(guò)調(diào)節(jié)PWM引腳的數(shù)值實(shí)現(xiàn)電機(jī)調(diào)速
下面我們來(lái)看一個(gè)例子
#define dirpin 7 //方向引腳 #define speedpin 6 //速度引腳 digitalWrite(dirpin, LOW);//HIGH正轉(zhuǎn),LOW反轉(zhuǎn) analogWrite(speedpin, 200);我們定義7號(hào)數(shù)字引腳來(lái)控制直流電機(jī)正反轉(zhuǎn),高電平正轉(zhuǎn),低電平反轉(zhuǎn),定義6號(hào)PWM引腳來(lái)控制直流電機(jī)的轉(zhuǎn)速,速度范圍是0-255
因?yàn)槲覀冇袃蓚€(gè)風(fēng)扇,需要用到兩個(gè)數(shù)字引腳和兩個(gè)PWM引腳,為了調(diào)用起來(lái)更加方便我們可以封裝一個(gè)函數(shù)
//控制電機(jī)函數(shù) void setMotor(int speedpin, int dirpin, int speed) {if (speed == 0){digitalWrite(dirpin, LOW);analogWrite(speedpin, 0);}else if (speed > 0){digitalWrite(dirpin, LOW);analogWrite(speedpin, speed);}else{digitalWrite(dirpin, HIGH);analogWrite(speedpin, 255 + speed);} }使用時(shí)只需要修改引腳號(hào)和速度值就可以實(shí)現(xiàn)對(duì)兩個(gè)風(fēng)扇的任意控制了
最后是OLED屏幕的使用方法
下面我們從屏幕顯示最基礎(chǔ)的方法開(kāi)始介紹
OLED屏幕顯示
????OLED其實(shí)就是一個(gè)M x N 的像素點(diǎn)陣,想顯示什么內(nèi)容就得把具體位置的像素點(diǎn)亮起來(lái)。我們用坐標(biāo)系來(lái)表示每一個(gè)像素點(diǎn),
在坐標(biāo)系中,左上角是原點(diǎn),向右是X軸,向下是Y軸。
對(duì)OLED有了基本了解后,我們開(kāi)始編寫(xiě)程序
第一步添加庫(kù)文件,在Arduino ide編程環(huán)境中選擇<庫(kù)管理>,搜索欄輸入“U8g2”關(guān)鍵詞,找到<U8g2>庫(kù)文件并安裝
為什么要用U8g2庫(kù)?主要考慮幾個(gè)方面:
U8g2庫(kù)支持絕大部分Arduino開(kāi)發(fā)板和市面上絕大多數(shù)型號(hào)的OLED屏幕;
U8g2庫(kù) API眾多,特別支持了中文,支持了不同字體,這對(duì)于一個(gè)開(kāi)發(fā)者來(lái)說(shuō)是福音,可以大大減小工作量。
U8g2庫(kù)安裝完畢,測(cè)試一下庫(kù)是否安裝成功:
#include <U8g2lib.h> void setup() {// put your setup code here, to run once: } void loop() {// put your main code here, to run repeatedly: }如果編譯成功,沒(méi)有報(bào)錯(cuò),說(shuō)明U8g2庫(kù)文件已經(jīng)可以使用了,我們編寫(xiě)下面的程序,查看效果
#include <U8g2lib.h>//顯示屏頭文件 #include <Wire.h>//i2c頭文件 //顯示屏定義 U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); //oled屏幕顯示函數(shù) void page1() {//設(shè)置字體,字號(hào),字形u8g2.setFont(u8g2_font_timR10_tf);u8g2.setFontPosTop();//設(shè)置光標(biāo)位置u8g2.setCursor(0,20);u8g2.print("Micro reflow welder"); } void setup(){//初始化,設(shè)置I2C地址u8g2.setI2CAddress(0x3C*2);u8g2.begin();//啟用 UTF8打印,我們的中文字符就是UTF8;u8g2.enableUTF8Print(); } void loop(){u8g2.firstPage();do{page1();}while(u8g2.nextPage()); }運(yùn)行后,我們可以在屏幕中看到顯示了一行字符串“Micro reflow welder”,效果如下圖
其中設(shè)置字體,字號(hào),字形用到了下面的語(yǔ)句
u8g2.setFont(u8g2_font_timB08_tf);在指令<timB08>中<tim>為字體類(lèi)型,除了這個(gè)字體類(lèi)型外,還有<u8g2_font_helvB08_tf>
<u8g2_font_ncenB08_tf>
<u8g2_font_courB08_tf>
等字體供我們選選擇,
指令<timB08>中<B>為字體加粗類(lèi)型,常規(guī)類(lèi)型為<R>,數(shù)字<08>為字體大小,字體大小可以在08、10、12、14、18、24中選擇
接著我們來(lái)設(shè)置顯示的坐標(biāo)位置
/** * 設(shè)置繪制光標(biāo)位置(x,y) * 關(guān)聯(lián)方法 print */void U8G2::setCursor(u8g2_uint_t x, u8g2_uint_t y) u8g2.setCursor(0,20);示例:在坐標(biāo)(0,15)的位置顯示“Hello,Worldf”
u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.setCursor(0, 15); u8g2.print("Hello World!");其中<u8g2.print("Hello World!")>來(lái)設(shè)置顯示的內(nèi)容
/** * 繪制內(nèi)容 * 關(guān)聯(lián)方法 setFont setCursor enableUTF8Print */void U8G2::print(...)如果顯示的內(nèi)容比較多,刷新比較頻繁的話(huà)還可以封裝成一個(gè)函數(shù),這樣可以提高效率
我們本次要顯示的內(nèi)容相對(duì)比較固定,所以就不封裝函數(shù)了
屏幕劃線(xiàn)
????OLED可以顯示的內(nèi)容是比較豐富的,比如可以顯示中文、英文、各種圖形以及取模后的圖片,對(duì)于我們本次作品來(lái)說(shuō),只需要在屏幕中繪制一個(gè)表格并顯示幾個(gè)簡(jiǎn)單的英文單詞就足夠了,我們這里介紹一個(gè)劃線(xiàn)的方法,用來(lái)在OLED屏幕中繪制一個(gè)表格,至于其他圖形和圖片的顯示方法,以后有機(jī)會(huì)再給大家展開(kāi)介紹了
關(guān)于OLED屏幕劃線(xiàn)的方法有兩種
第一種:u8g2.drawHLine() —— 繪制水平線(xiàn)
**
* 繪制水平線(xiàn)
* x 左上角的x坐標(biāo)
* y 左上角的y坐標(biāo)
* pw 水平線(xiàn)的長(zhǎng)度
* 關(guān)聯(lián)方法 setDrawColor
*/
void U8G2::drawHLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w)
我們?cè)谇拔闹蠴LED屏幕顯示字符的程序中增加下面的代碼
u8g2.drawHLine(0,40,128);//在(0,40)位置繪制一條長(zhǎng)度為128的橫線(xiàn)程序運(yùn)行后,我們會(huì)在屏幕上看到在原來(lái)字符串的下方繪制了一條橫線(xiàn)
第二種:u8g2.drawLine() —— 兩點(diǎn)之間繪制線(xiàn)
/**
* 繪制線(xiàn),從坐標(biāo)(x0,y0) 到(x1,y1)
* x0 端點(diǎn)0的x坐標(biāo)
* y0 端點(diǎn)0的y坐標(biāo)
* x1 端點(diǎn)1的x坐標(biāo)
* y1 端點(diǎn)1的y坐標(biāo)
* setDrawColor
*/
void U8G2::drawLine(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1)
接著我們繼續(xù)在上面的程序中增加如下代碼
u8g2.drawLine(0,0,0,64);//在(0,0)點(diǎn)和(0,64)點(diǎn)之間繪制一條直線(xiàn)運(yùn)行后,會(huì)看到在屏幕中多出了一條豎線(xiàn),效果如下
最后我們綜合使用介紹過(guò)的顯示方法就可以設(shè)計(jì)本次作品的顯示界面了
至此,Micro reflow welder的所有程序功能都已介紹完畢
最后奉上完整代碼,有興趣的伙伴可以根據(jù)自己的喜好修改
#include <Thermocouple.h> #include <MAX6675_Thermocouple.h>//熱電偶頭文件 #include <U8g2lib.h>//顯示屏頭文件 #include <Wire.h>//i2c頭文件 #include <MsTimer2.h> //熱電偶接口聲明 #define SCK_PIN 8 #define CS_PIN 9 #define SO_PIN 2 #define PWM_PIN 10//可控硅功率調(diào)節(jié) #define fan_small 7//小風(fēng)扇引腳 #define fan_small_speed 6 #define fan_big 4//大風(fēng)扇引腳 #define fan_big_speed 5 #define button 11 //按鍵引腳 #define relay 12 //繼電器引腳 #define PWRFULL 230//滿(mǎn)加熱功率 #define PRE 0 //預(yù)熱階段 #define KEEP 1 //保持階段 #define FAST 2 //快速加熱階段 bool is_working = false;//工作中的標(biāo)志變量 bool is_free = true;//空閑的標(biāo)志變量 bool is_cooling = false;//冷卻的標(biāo)志變量 bool is_preheat = false;//預(yù)熱的標(biāo)志變量 char MODEL; //模式 int i=0;//屏幕中顯示模式的索引 int count;//計(jì)時(shí)的變量 int count_keep=0;//保溫計(jì)數(shù)器 int count_fast=0;//快速加熱計(jì)數(shù)器 int count_cooling=0;//冷卻計(jì)數(shù)器 int nowtime;//存儲(chǔ)時(shí)間變量 double temp_now = 0;//當(dāng)前溫度 String time_sec_str;//屏幕顯示秒數(shù) int temp_target,PWR=0;//溫度設(shè)定,加熱功率調(diào)節(jié)0-255 int start_button;//開(kāi)始按鍵 String temp_target_str,hot,temp_now_str;//目標(biāo)溫度,轉(zhuǎn)換后的加熱功率0-100,當(dāng)前溫度字符串 //顯示屏定義 U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); //熱電偶定義 Thermocouple* thermocouple; //oled屏幕顯示函數(shù) void page1() {u8g2.setFont(u8g2_font_ncenR10_tf);u8g2.setFontPosTop();//當(dāng)前溫度u8g2.setCursor(3,2);u8g2.print("Now :");u8g2.setCursor(3,15);u8g2.print(temp_now_str+" C");//目標(biāo)溫度u8g2.setCursor(78,2);u8g2.print("Target:");u8g2.setCursor(80,15);u8g2.print(temp_target_str+" C");//加熱功率u8g2.drawHLine(0,0,128);//在(0,0)位置繪制一條長(zhǎng)度為128的橫線(xiàn)u8g2.drawHLine(0,30,128);//在(0,30)位置繪制一條長(zhǎng)度為128的橫線(xiàn)//u8g2.drawHLine(0,46,128);u8g2.drawHLine(0,63,128);//在(0,30)位置繪制一條長(zhǎng)度為128的橫線(xiàn)u8g2.drawLine(0,0,0,64);//在(0,0)點(diǎn)和(0,64)點(diǎn)之間繪制一條直線(xiàn)u8g2.drawLine(127,0,127,64);//在(127,0)點(diǎn)和(127,64)點(diǎn)之間繪制一條直線(xiàn)u8g2.drawLine(76,0,76,64);//在(76,0)點(diǎn)和(76,64)點(diǎn)之間繪制一條直線(xiàn)u8g2.setCursor(3,32);u8g2.print("PWR:"+hot+"%");//運(yùn)行時(shí)間u8g2.setCursor(3,49);u8g2.print("Time:"+time_sec_str+"S");//模式u8g2.setCursor(78,30);u8g2.print("Model:");u8g2.setCursor(80,49);switch (i){case 0:u8g2.print("FREE");break;case 1:u8g2.print("PRE");break;case 2:u8g2.print("KEEP");break;case 3:u8g2.print("FAST");break;case 4:u8g2.print("cooling");break;} } //初始化 void setup(){Serial.begin(9600);u8g2.begin();//啟用 UTF8打印,我們的中文字符就是UTF8;u8g2.enableUTF8Print();thermocouple = new MAX6675_Thermocouple(SCK_PIN, CS_PIN, SO_PIN);pinMode(button, INPUT);//start按鍵pinMode(relay, OUTPUT);//繼電器pinMode(PWM_PIN, OUTPUT);//可控硅功率調(diào)節(jié)pinMode(fan_small_speed, OUTPUT);//small風(fēng)扇速度pinMode(fan_small, OUTPUT);//small風(fēng)扇方向digitalWrite(fan_small_speed, LOW);//digitalWrite(fan_small, LOW);//pinMode(fan_big_speed, OUTPUT);//big風(fēng)扇速度pinMode(fan_big, OUTPUT);//big風(fēng)扇方向digitalWrite(fan_big_speed, LOW);//digitalWrite(fan_big, LOW);// MsTimer2::set(300, temp_data);//定時(shí)器MsTimer2::start(); } void temp_data() {//獲取當(dāng)前溫度temp_now = thermocouple->readCelsius();temp_now_str = String(temp_now);//調(diào)節(jié)溫度temp_target = analogRead(A0);temp_target = map(temp_target, 0, 1023, 0, 230);temp_target_str = String(temp_target);//計(jì)時(shí)程序count+=3;if(count%9==0) {nowtime++;}time_sec_str = nowtime; } void loop() {//屏幕顯示u8g2.firstPage();do{page1();}while(u8g2.nextPage());//====================等待開(kāi)始===================if(start_button == 1 && digitalRead(button) == 0)//兩次檢測(cè)按鍵的狀態(tài){delay(1000);if ( digitalRead(button) == 0 && is_free == true) //且設(shè)備處于空閑狀態(tài)進(jìn)入工作模式{count=0;is_free = false;is_working = true;if (temp_now < temp_target) //加熱模式{is_preheat = true;is_cooling = false;Serial.print("preheat! \n\r");}else//冷卻模式{is_preheat = false;is_cooling = true;Serial.print("cooling! \n\r");} }else if( digitalRead(button) == 0 && is_free == false)//工作中再次按下按鍵進(jìn)入冷卻模式{is_preheat = false;is_cooling = true;Serial.print("cooling2! \n\r");}}start_button = digitalRead(button);//存儲(chǔ)按鍵狀態(tài)//==============加熱工作模式=================if(is_free == false && is_working == true && is_preheat == true && is_cooling == false){if(temp_now < temp_target && temp_now <130) { MODEL = PRE; count_keep = 0;i=1;} //溫度小于140℃,預(yù)熱狀態(tài)else if(temp_now < temp_target && temp_now >=130 && count_keep < 450) { MODEL = KEEP;i=2; } //溫度大于140℃,進(jìn)入保持狀態(tài),計(jì)數(shù)開(kāi)始else if(temp_now < temp_target && temp_now >=130 && count_keep >= 450) { MODEL = FAST;i=3; } //保持結(jié)束,進(jìn)入爬升狀態(tài) if(MODEL == PRE && temp_now <= 110)//預(yù)熱狀態(tài),高功率升到140度{//設(shè)置功率set_heat(60);Serial.print("heat60-1! \n\r");}if(MODEL == PRE && temp_now > 110) //預(yù)熱狀態(tài),高功率升到140度 {//設(shè)置功率set_heat(40);Serial.print("heat40! \n\r");}else if(MODEL == KEEP) //保持狀態(tài),延時(shí)計(jì)數(shù),過(guò)溫?cái)嚯妠if(temp_now >= 155) set_heat(1); //高于155℃就斷電,否則就低功率else if(temp_now <= 140 ) set_heat(40);//130-140加熱的功率40else{ set_heat(30); }//140-150加熱功率25delay(10);Serial.print("fast! \n\r");Serial.println(count_keep);count_keep ++;}else if(MODEL == FAST) //進(jìn)入溫度爬升階段,大功率,當(dāng)溫度達(dá)到設(shè)定值減偏移量后,斷電,將保持計(jì)數(shù)器清零,進(jìn)入冷卻狀態(tài){if(temp_now < temp_target - 20) {//設(shè)置功率set_heat(60);Serial.print("heat60-2! \n\r");}else if(temp_now >= temp_target - 20) //此處假定溫度不降下去,否則會(huì)出現(xiàn)重復(fù)加溫的情況{is_preheat = false;is_cooling = true;count_keep = 0;set_heat(0);}}}//==============冷卻工作模式=================else if(is_free == false && is_working == true && is_preheat == false && is_cooling == true) //冷卻狀態(tài){set_heat(0);i = 4;if(count_cooling < 50){ Serial.print("fan starting! \n\r");Serial.println(count_cooling);count_cooling++ ;delay (10);}else if(temp_now >= 190) //當(dāng)溫度高于190度,用小風(fēng)量降溫{setMotor(fan_big_speed, fan_big, 240);}else if(temp_now >= 55 && temp_now < 190) //低于190度,大風(fēng)降溫{setMotor(fan_big_speed, fan_big, 255);}else if(temp_now < 55) //溫度低于55度,進(jìn)入idle狀態(tài),記得計(jì)數(shù)器清零{is_working = false;is_preheat = false;is_cooling = false;is_free = true;count_cooling = 0; }}//空閑狀態(tài),恢復(fù)各個(gè)狀態(tài)寄存器,并且將系統(tǒng)降溫到40度以下else if(is_free == true && is_working == false && is_preheat == false && is_cooling == false) //空閑狀態(tài){set_heat(0);i = 0;if(temp_now > 50) setMotor(fan_big_speed, fan_big, 255);else setMotor(fan_big_speed, fan_big, 0);}else{Serial.print("System State Erro! Default idle state recovered !\n \r"); //其它所有狀態(tài)均為錯(cuò)誤狀態(tài),恢復(fù)系統(tǒng)初始狀態(tài)i = 0;set_heat(0);is_free = true;is_working = false;is_preheat = false;is_cooling = false;}setMotor(fan_small_speed, fan_small, 150);//內(nèi)部散熱風(fēng)扇 } //控制電機(jī)函數(shù) void setMotor(int speedpin, int dirpin, int speed) {if (speed == 0){digitalWrite(dirpin, LOW);analogWrite(speedpin, 0);}else if (speed > 0){digitalWrite(dirpin, LOW);analogWrite(speedpin, speed);}else{digitalWrite(dirpin, HIGH);analogWrite(speedpin, 255 + speed);} } //加熱功率函數(shù) void set_heat(int PWR_HEAT) {if (PWR_HEAT == 0){digitalWrite(relay,LOW);hot = String(PWR_HEAT);analogWrite(PWM_PIN,0);}else{digitalWrite(relay,HIGH);//設(shè)置功率PWR = PWRFULL*PWR_HEAT/100;hot = String(PWR_HEAT);analogWrite(PWM_PIN,PWR);} }首次試機(jī),焊接效果還是可以的
#總結(jié)#
本次Micro reflow welder微型回流焊機(jī)的設(shè)計(jì),總結(jié)一下,我們掌握了數(shù)字、模擬信號(hào)的原理,學(xué)會(huì)使用U8g2庫(kù)在OLED屏幕上顯示數(shù)字,定時(shí)器的使用方法,學(xué)會(huì)了使用熱電偶模塊測(cè)量溫度,以及通過(guò)可控硅控制加熱平臺(tái)的技巧
總體評(píng)價(jià),這是一個(gè)玩家DIY的作品,使用了各種廉價(jià)的器件,驗(yàn)證了基本功能對(duì)于想要深入學(xué)習(xí)各種硬件、運(yùn)用各種學(xué)科知識(shí)完成綜合項(xiàng)目的伙伴會(huì)有一定幫助,但多數(shù)電子硬件都沒(méi)有經(jīng)過(guò)耐久性測(cè)試,所以它并不是一個(gè)成熟的產(chǎn)品,不能作為產(chǎn)品去推廣,有興趣的伙伴可以去嘗試并改進(jìn)方案,期待一起交流
接下來(lái)旺仔爸爸將會(huì)使用Micro reflow welde加工一些PCB電路板,我們一起期待
造物讓生活更美好,我們下期再見(jiàn)!
總結(jié)
以上是生活随笔為你收集整理的DIY烤肉加热台,了解一下?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【PC工具】U盘数据加密工具,windo
- 下一篇: 【Android工具】远程登录会话工具免