Chế Arduino cho máy hàn khò Yihua 858D bị hỏng IC điều khiển

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 cryingcryingcrying

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 smiley. 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 laughlaughlaughhttps://youtu.be/iu59xDQ2iPQ

Youtube: 
lên
4 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results