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