【ESP8266点焊机】基于 ESP8266 for Arduino

本项目由负熵生之光大佬提供。

B站链接:ESP8266 点焊机 3.0 / 开源自制

OSHWHub:ESP8266 点焊机 3.0

由于大佬提供了 V3.0 和 V2.0 版本,本着追新不追旧的原则,还是研究 V3.0 项目是怎么实现的!

项目预览:

上板与中板通过四根排针相连接,底板就是普通底板,无实际作用。


点焊机原理

点焊机两极点瞬间放点,因接触点的接触电阻比较大,在电流通过的瞬间产生大量的能力而产生热熔接,形成熔核进而达到焊接目的。

本项目是由电容来提供瞬间大电流的。


放电电路

通过控制 MOS 管的通断,来达到瞬间导通、瞬间放电的效果。

放电电容采用外接方式!接在CN1接口。


控制电路

主控周边

电平设置部分就是一堆上拉、下拉电阻。设置端口为上拉/下拉。

2.54排针是和中板(放电板)相连控制的接口。

杂项目

电压采集 30V 是什么意思呢?是电压输入限制在了 30V 。

照明电路是给两电极提供照明的。

电源部分

过流过压保护此VCC由中板提供!这是控制板的电源来源。但是,这个保险选定不行吧!

ME3116是降压稳压器,采用PWM控制模式。

SX1308升压芯片:2V到24V的宽输入电压范围。VIN通过 +5V or BAT 提供电源。

外部接口

板载CH340,不必要吧。还自动下载电路。确实这样方便了。

TP4054 单颗锂电池充电管理芯片。

显示部分

采用的 0.42 OLED 进行显示。

中板控制电路

采用 TC4427 驱动芯片对MOS管进行驱动。

焊件检测问题:如果电容/供电电压达到较高值,那么 VDD 不就相当直接接到高电位了,这样大概不合适吧?


程序

代码比较简单。只几百行。

做了必要的注释!

经过验证,代码可编译!!

#include <Arduino.h>
#include <EEPROM.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

byte k1 = 0  ;              // +按键,低调平有效
byte k2 = 2  ;              // -按键,低电平有效
byte k3 = 13 ;              // 模式按键,低电平有效

byte g1  = 14;              // 焊件检测  
byte ADC = A0;              // 电池电压检测 
byte mos = 12;              // MOS 控制 

float V = 0;                // 电池电压v
int hms;                    // 焊接延时
int yms;                    // 延时焊接
volatile byte ms = 0;       // 模式,这里其实用不到 volatile 吧,总共就0~4 

/* 中断程序,执行模式切换 */
ICACHE_RAM_ATTR void zd1()
{ 
  ms++;
}

/*  调参函数,参数,参数上限 */
void key(int &a , int b)
{   
   if(digitalRead(k1) !=  digitalRead(k2))    // KEY1&KEY2 不在同一电平状态
   {  
      long int t =  millis();                 // 记录当前时间
      if(digitalRead(k1) == LOW)              // KEY1 按下
      { 
        a++;                                  // 参数增加
        while(digitalRead(k1) == LOW)         // 长按情况
        {
           if(millis() - t > 1200)            // 长按大于 1200ms
           {     
              a = a + 10;                     // 增加步长为 10
           }
           if(a > b)                          // 大于参数上限
               a = b ;           
           delay(10);                        
           oled(a);                           // 显示参数 a
        }   
      }
      else                                    // KEY2 按下
      {
        a--;                                  // KEY2 按下分析过程同 KEY1 按下
        while(digitalRead(k2) == LOW)
        {
           if(millis() - t > 1200)
           { 
              a = a - 10;   
           }
           if(a < 0){  a = 0 ; }
           delay(10);
           oled(a);
        }  
      }
      sjx(hms, yms);                          // EEPROM写入数据
   }
   oled(a);
}

/* 写入Flash数据,焊接延时,延时焊接 */
void sjx(int a, int b){
  EEPROM.begin(1024);
  EEPROM.put(0, a);  
  delay(10);
  EEPROM.put(4, b);  
  delay(10);
  EEPROM.commit(); //保存更改的数据
}

/* 读取Flash数据,焊接延时,延时焊接 */
void sjd(){
 EEPROM.begin(64);
 EEPROM.get(0, hms);
 delay(10);
 EEPROM.get(4, yms);
}

/* 供电电压读取 */
void BAT(){
  V = map(analogRead(A0),0,1023,0,1000);
  V = V*31.3/1000;
}

/* 0.420 LED 显示 */
void OLED(){
  u8g2.clearBuffer();                   //清除内存中数据缓冲区         
  u8g2.setFont(u8g2_font_ncenB12_tr);   //设置字体

  u8g2.setCursor( 0, 12);
  u8g2.print(V);                     

  u8g2.setCursor(48, 12);
  u8g2.print("V");

  u8g2.setCursor(62, 12);
  u8g2.print(ms);

  u8g2.setCursor( 0, 26);
  u8g2.print(hms);                     

  u8g2.setCursor(48, 26);
  u8g2.print("ms");

  u8g2.setCursor( 0, 40);
  u8g2.print(yms);                     

  u8g2.setCursor(48, 40);
  u8g2.print("ms");

  u8g2.sendBuffer();                    //绘制缓冲区的内容   
}


/* 调参界面显示 */
void oled(int a)
{
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB12_tr);
  u8g2.clearBuffer();
  u8g2.setCursor(0, 14);
  if(ms == 3){                // 焊接等待时间调参
    u8g2.print("weld ms");    // 焊接等待时间
  }else{                      // 等待焊接时间调参
    u8g2.print("wait ms");    // 等待焊接时间
  }
  u8g2.setCursor(0, 40);
  u8g2.print(a);
  u8g2.sendBuffer();  
}


/* 延时函数(ms) */
void sj(int a)
{
  long int i = millis();
  while((millis() - i) < a) 
      OLED(); 
}

/* 自动模式 */
void zdhj()
{
  if(digitalRead(g1) == HIGH)    // 检测是否有焊件
  {
    sj(yms);                     // 延时函数充电(ms)
    digitalWrite(mos,HIGH);      // 导通MOS放电
    sj(hms);                     // 延时放电时间
    digitalWrite(mos,LOW);       // 关闭MOS
  }
}

/* 手动模式 */
void sddh()
{
  if(digitalRead(g1) == HIGH)    // 检测是否有焊件
  {
    if(digitalRead(k1) == LOW || digitalRead(k2) == LOW )    // KEY1/KEY2按下
    {  
       sj(yms);                  // 延时函数充电(ms)
       digitalWrite(mos,HIGH);   // 导通MOS放电
       sj(hms);                  // 延时放电时间
       digitalWrite(mos,LOW);    // 关闭MOS
    }
  }
}

/* 调节焊接延时时间 */
void hjms()
{ 
  key(hms, 1000);
}

/* 调节延时焊接时间 */
void ysms()
{ 
  key(yms, 3000);
}

void setup()
{
  u8g2.begin();
  pinMode(k1 ,INPUT_PULLUP); 
  pinMode(k2 ,INPUT_PULLUP); 
  pinMode(k3 ,INPUT_PULLUP);      
  pinMode(g1 ,INPUT);
  pinMode(mos ,OUTPUT);

  digitalWrite(mos,LOW);
  /* 中断函数 */
  attachInterrupt(k3, zd1, RISING);     // 上升沿触发,按键松开触发
  
  sjd();    // 读取Flash数据 
  
}

void loop()
{
  BAT();
  switch(ms)
  {
    case 0 : OLED();   
    break;
    
    case 1 : zdhj();    // 自动模式
             OLED();
    break;
   
    case 2 : sddh();    // 手动模式
             OLED();
    break; 

    case 3 : hjms();    // 焊接时间调参
    break; 

    case 4 : ysms();    // 延时焊接调参
    break; 

    default: ms = 0;    // 超出置0
    break;
  }
}

参考:

U8g2库的详细使用

项目资料:

链接:https://pan.baidu.com/s/1cm7Nr6hIkZjasgeOpbPCCQ
提取码:k7d3


总结

给以后做点焊机提供了思路,是一个好项目!值得学习!

感谢开源!

猜你喜欢

转载自blog.csdn.net/qq_41650023/article/details/125909339