ngoctruongns gửi vào
- 10753 lượt xem
Mô Tả Dự Án
Mình có một máy hàn khò Yihua 858D bị hỏng, khi kiểm tra thì máy bị chết mất con chíp điều khiển trong khi mọi bộ phần khác vẫn còn OK
Bỏ đi thì cũng phí nên mình thử tìm cách thay thế con IC này bằng Arduino Pro mini xem sao . Sau một thời gian vọc vạch thì máy cũng chạy khá ổn, sai số nhiệt độ quanh điểm đặt tầm +-5*C, có thể điều chỉnh hệ số PID để nhiệt độ chính xác hơn. Vì vậy mình chia sẻ trên đây để bạn nào chung cảnh ngộ có thể dựa vào đó để phát triển hoàn thiện hơn.
I. Phần Cứng
- Đầu tiên thì tất nhiên là ta cần có một bệ hàn Yihua 858D hoặc các loại tương đương
- Modun Arduino Pro mini loại 5V , 16Mhz và mạch sạc
- Dây điện để nối Arduino với bo mạch máy hàn
II. Sơ đồ nguyên lý và cách đấu dây
Sơ đồ câu dây cho Arduino với các chân của IC cũ ( tham khảo chi tiết thêm trong phần khai báo pin của code bên dưới ) .
Các bạn đối chiếu với bệ hàn thực tế của mình để chỉnh sửa vị trí các chân cho phù hợp.
III. Lập Trình
Bạn cần chuẩn bị thư viện sau:
+ Thư viện cho LED 7 thanh : https://github.com/sparkfun/SevSeg
+ Thư viện EEPROM để lưu giá trị cài đặt của nhiệt độ : https://github.com/PaulStoffregen/EEPROM
+ Thư viện PID : https://github.com/br3ttb/Arduino-PID-Library
A. Các chế độ hoạt động của Bệ hàn
1. Chế độ khởi động
Khi bật máy lên, máy sẽ hiển thị nhiệt độ được cài đặt ( lưu trong EEPROM ) sau đó kiểm tra xem tay khò có nằm trên giá đặt hay không
Thao tác này là để tránh trường hợp tay khò để ở những vị trí có thể gây cháy hay hỏng các đồ vật khác.
- Nếu tay khò không nằm trên giá đặt, Led sẽ thông báo lỗi : "Err"
- Nếu tay khò nằm trên giá thì máy sẽ kiểm tra nhiệt độ của tay khò :
- Nhiệt độ nhỏ hơn nhiệt độ an toàn : Máy vào chế độ sleep
- Nhiệt độ cao hơn nhiệt độ an toàn : Bật quạt gió và không gia nhiệt để giảm nhiệt tay khò
2. Chế độ hoạt động
Sau phần khởi động, máy sẽ chuyển sang chế độ hoạt động:
- Nếu người dùng cầm tay khò, máy sẽ gia nhiệt đến nhiệt độ cài đặt trong EEPROM và giữ nhiệt độ khò quanh giá trị đó bằng thuật toán PID
- Nếu người dùng khò xong và đặt tay khò lên giá thì máy sẽ ngừng gia nhiệt nhưng vẫn giữ gió để giảm nhiệt độ tay khò tránh hiện tượng om nhiệt
Sau một thời gian nếu người dùng không tiếp tục sử dụng, tay khò sẽ được làm mát đến nhiệt độ an toàn ( mình đặt là 60*C) rồi máy vào chế độ sleep
3. Chế độ Sleep
Đây là chế độ chờ khi tay khò nằm trên giá đỡ, máy sẽ tắt gió và tắt gia nhiệt đồng thời màn hình hiển thị "SLP" trong một giây rồi hiển thị " ---"
4. Chế độ cài đặt
Ngay sau khi khởi động máy, ta có thể cài đặt nhiệt độ khò cho máy bằng cách ấn hai nút Up/ Down
Màn hình sẽ hiển thị giá trí được cài đặt sau khi ấn nút, sau đó giá trị này được lưu vào EEPROM để nhớ cho những lần sau.
B. Code Arduino
/* Chương trình cho máy hàn khò Yihua 858D */ #include "SevSeg.h" // thu vien dieu khiển LED 7 thanh #include <EEPROM.h> // Thư viện EEPROM #include <PID_v1.h> // Thư viện điều khiển PID SevSeg myDisplay; //Khai bao bien va cai dat cho dieu khien PID double Setpoint, Input, Output; double Kp=7, Ki=0.15, Kd=4; // Tham số PID, có thể thay đổi cho phù hợp PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); // khai bao cac pin const int REED = A2; // cam bien từ xac nhan tay kho có đặt trên bệ hay không const int TEMP = A0; // cam bien nhiet do mo kho const int TEMP_COM = 11; // chan quet nut const int TEMP_UP = 10; // phím tang nhiet do, chung chân với segF const int TEMP_DN = 9 ; // phím giam nhiet do , chung chân với segB const int FAN = 4; // dieu khien bat tat quat gio const int HEAT = 5 ; // dieu khien day mai so gia nhiet bằng PWM //Các chân điều khiển LED 7 thanh // máy có 3 LED 7 thanh dạng Anot chung int digit1 = 2; //led 1 int digit2 = 1; //led 2 int digit3 = 3; //led 3 int digit4 = 13; //dự phòng //Các chân Catot int segA = 8; //Pin 8 int segB = 9; //Pin 9 int segC = 7; //Pin 7 int segD = A5; //Pin A5 int segE = 6; //Pin 6 int segF = 10; //Pin 10 int segG = A3; //Pin A3 int segDP= A4; //Pin A4 //Create global variables char set_status =0; // bien xac dinh trang thai co cai dat hay khong char sleep_status =0 ; // bien xac dinh trang thai Sleep int Temp_val;// gia tri do nhiet do duoc int Temp_set; // gia tri nhiet do duoc dat boi nguoi dung, int Temp_eep; // gia tri nhiet do duoc ghi trong eeprom char LED_DISP[4]; // ham hien thi len led 7 thanh // bien cho eeprom //EEPROM MAP: addr : 0 & 1 // val : TEMP_SET int address = 0; // bien dia chi eeprom int PWM_OUT ; // gia tri xuat PWM // ham hien thi len led 7 thanh void hien_thi(int data) { char ht[4]; ht[0] = data/100; ht[1] = (data%100)/10; ht[2] = (data%10) ; myDisplay.DisplayString(ht, 0); } void setup() { // cai dat vao ra cac chan pinMode(REED,INPUT_PULLUP); // cong tac lưỡi gà cảm ứng từ xác định tay khò trên bệ hàn pinMode(TEMP_COM,OUTPUT); // kiem tra nút ấn tăng / giảm nhiệt độ digitalWrite(TEMP_COM,HIGH); // dau ra cao // tat quat digitalWrite(FAN,HIGH); // tắt quạt gió ( HIGH: OFF, LOW : ON ) pinMode(FAN,OUTPUT); // định dạng Output // nhiet do analogWrite(HEAT,255); // khong gia nhiet ( 255 : OFF; 0 : Max nhiệt ) // cai dat cho led 7 thanh int displayType = COMMON_ANODE; // Định dạng Led 7 thanh là Anode chung int numberOfDigits = 3; //số lượng LED 7 thanh là 3 myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3,digit4,segA, segB, segC, segD, segE, segF, segG, segDP); // dat do sang cho led, 1 chu ky quet mac dinh la 2ms, tuc la quet led voi tan so 500Hz : #define FRAMEPERIOD 2000 ns myDisplay.SetBrightness(100); //Set the display to 100% brightness level // chuong trinh khoi dau // 1. doc gia tri nhiet do cai dat trong eeprom va hien thi address =0; EEPROM.get(address,Temp_eep); // doc gia tri trong eeprom for(int i =0;i<100;i++) { hien_thi(Temp_eep); // hien thi nhiet do cai dat delay(10); } //2. kiem tra cong tac từ xem tay khò có trên bệ hàn hay không if( digitalRead(REED) == 0) // tay kho dang dat tren be { digitalWrite(FAN,LOW); // bat quat khi tay khò trên bệ hàn } else // Nếu tay khò không có trên bệ hàn { while(digitalRead(REED) == HIGH) { LED_DISP[0] = 'E'; // hien thi thong bao loi " Err" LED_DISP[1] = 'r'; LED_DISP[2] = 'r'; for(int i =0;i<50;i++) { myDisplay.DisplayString(LED_DISP, 0); //hien thi thong bao lỗi Err đến khi có tay khò trên bệ hàn delay(10); } } digitalWrite(FAN,LOW); // bat quat } // 3. cai dat PID Input = map(analogRead(TEMP),0,1023,0,800);// gia tri nhiet do doc vao Setpoint = Temp_eep;// nhiet do cai dat // output là giá trị PWM //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { // Doc gia tri nhiet do cai dat trong eeprom address = 0 ; // dia chi ghi gia tri Temp_set EEPROM.get(address,Temp_set); // Kiem tra nut an dieu chinh nhiet do Up, Dn digitalWrite(TEMP_COM,LOW); // dau ra thap de quet nut ấn tăng / giảm nhiệt độ pinMode(TEMP_UP,INPUT_PULLUP); // phim tang nhiet do pinMode(TEMP_DN,INPUT_PULLUP); // phim giam nhiet if( digitalRead(TEMP_UP) == 0) { Temp_set +=1; Temp_set = constrain(Temp_set, 80, 480); set_status = 1; } else if( digitalRead(TEMP_DN) == 0) { Temp_set -=1; Temp_set = constrain(Temp_set, 80, 480); set_status =2; } else set_status =0; // kiem tra xong thi de lai dang dau ra va hien thi pinMode(TEMP_UP,OUTPUT); // tra lai dang ra pinMode(TEMP_DN,OUTPUT); // tra lai dang ra //digitalWrite(TEMP_COM,HIGH); // dau ra cao dung quet if(set_status >0) { // khi co nút được ấn // Hien thi gia tri moi for(int i =0;i<20;i++) { hien_thi(Temp_set); // hien thi nhiet do cai dat delay(6); } // Ghi vao eeprom address =0; EEPROM.get(address,Temp_eep); // doc gia tri trong eeprom if ( Temp_set != Temp_eep) // neu gia tri trong eeprom khac voi gia tri hien tai thi ghi vao eeprom { EEPROM.put(address,Temp_set); delay(10); } } else { // kiem tra cong tac luoi ga xem mo han dat tren gia chua if( digitalRead(REED) == 0) { analogWrite(HEAT,255); // dung gia nhiet // kiem tra nhiet do mo han Temp_val = map(analogRead(TEMP),0,1023,0,800); if ((Temp_val <=60) &&(sleep_status ==0) ) // khi nhiet do mỏ khò <60 độ thì vao che do sleep { digitalWrite(FAN,HIGH); // tat quat gio LED_DISP[0] = 'S'; // hien thi thong bao sleep LED_DISP[1] = 'L'; LED_DISP[2] = 'P'; for(int i =0;i<100;i++) { myDisplay.DisplayString(LED_DISP, 0); //hien thi thong bao sleep trong 1s delay(10); } sleep_status =1;// bao da hien thi sleep } else // khi nhiet do van tren 60 độ { hien_thi(Temp_val); // hien thi nhiet do hien tai } if(sleep_status ==1) // đang trong che do sleep { LED_DISP[0] = LED_DISP[1] =LED_DISP[2] ='-'; // hien thi thong bao --- for(int i =0;i<100;i++) { myDisplay.DisplayString(LED_DISP, 0); //hien thi thong bao --- delay(10); } } } else // khi tay kho khong nam tren gia { sleep_status =0; // thoat che do sleep // cai dat va quan ly nhiet do theo gia tri cai dat tai eeprom digitalWrite(FAN,LOW); // bat quat gio Temp_val = map(analogRead(TEMP),0,1023,0,800);// doc gia tri nhiet do Input = Temp_val;// gia tri nhiet do doc vao Setpoint = Temp_set;// nhiệt độ người dùng cài đặt myPID.Compute(); // tinh gia tri dau ra Output PWM_OUT = 255- constrain(Output,0 , 255 ); // tính giá trị PWM xuất ra chân theo Output analogWrite(HEAT,PWM_OUT); // Xuất xung ra chân điều khiển dây maiso // hien thi nhiet do hien tai for(int i =0;i<10;i++) { hien_thi(Temp_val); // hien thi nhiet do hien tai delay(5); } } } }
C. Thành quả
Giờ thì chúng ta tận hưởng thành quả thôi : https://youtu.be/iu59xDQ2iPQ