Добрый день всем. Планируется заказ печатных плат на производстве. За основу взята плата от Руслана, вынесен модуль усилителя и причёсана платка под заводское изготовление. Платы планируются с металлизацией, маской. Текстолит 1,6-2мм. На одном куске размещены основная плата и модули усилителя под термопару и терморезистор.
Примерная стоимость составит примерно 350р. за комплект. Пробная партия будет заказываться через неделю. 5 комплектов. Возможно большее число комплектов. Один оставляю себе, второй другу. Если кому еще надо, обращайтесь.
При включении паяла иногда появляется небольшой косячёк. При включении паяльника температура растет, немного забегает за установленную, тут же снижается, и вместо того, чтобы пикнуть пару раз и перейти в режим поддержки температуры, паяльник отключается с ошибкой i6. Если его сразу опять включить с кнопки, то дальше работает как ни в чем не бывало. Паяльник китаец прислал с термопарой. Фен тоже с термопарой, но на нем все нормально работает. Каналы усилителя идентичны, только номиналы резисторов немного отличаются. Связывался с автором на Ютубе, посоветовал уменьшить коэффициент #define sKp 50. Пробовал и уменьшать и увеличивать. Не помогает. Прошивка 2.2 от Руслана, сравнивал с оригинальной автора, разница только в выводе информации на дисплей. Кто что думает по этому поводу?
паяльник отключается с ошибкой i6. Если его сразу опять включить с кнопки, то дальше работает как ни в чем не бывало.
Это дополнительная защита, срабатывает по условию "если до момента стабилизации, температура падает или не изменяется в течении 5 сек". Можно попробовать увеличить время if (t_cnt == 5) в функции SDoProtect() до 7-10 сек.
А вообще, если что, доп. защиты можно деактивировать закомментив дефайн S_ADV_PROT_ON
Цитата:
#define sKp 50. Пробовал и уменьшать и увеличивать. Не помогает.
До какой величины уменьшали? Увеличивать точно не стоит - могут возникнуть автоколебания. Уменьшая коэфф. несколько увеличивается время выхода на заданную температуру, но уменьшается и перерегулирование. Можно снять график набора температуры - нагляднее будет.
Добрый вечер, Олег, sKp 50 уменьшал как вы и советовали до 20-ти, при 40-ка немного стабильнее, но один фиг ошибки бывали, при 60-ти кстати ошибки вылетали реже чем при 40-ка и 50-ти. Вообще может быть проблема в ОУ? Просто операционники я заказывал естественно из поднебесной, у нас в городе не было в дип корпусах. Из 10-ти штук 4 были битые, да ещё китаёза прислал LM358P вместо LM358. Я вот тоже кстати подумывал об увеличении времени, но не знал как это сделать. В программировании я не силён. У паяльника инерция намного больше чем у фена. Да и качество китайских паяльников и фенов по ходу с каждым днём все хуже и хуже...
Всё заработало как надо после увеличения времени до 10 секунд. Ещё раз спасибо за данную разработку! Кстати, заказаны пять комплектов плат, по цене вышло 340р. за штуку. Кому надо, обращайтесь.
Мне просто некогда сейчас подбирать, поставил сразу 10 секунд, заработало. Поосвобожусь, подберу поменьше. Да и паяльник заменить хочу, китаец прислал откровенное фуфло, он уже разваливается. Платы придут, соберу всё по нормальному, пока у меня на самодельной плате, а они у меня никогда нормально не получались...
Привет, у меня тоже проблема. Я хочу переделать станцию сращивания, я сделал печатную плату, я загрузил программу в ардуин, но у меня есть только оригинальный писатель, чтобы не писать мне все. Так что из Словакии так переведено на переводчика, я не знаю, как переводить, я пытаюсь отправить фотографию, загрузите на этот дисплей 2004A.
Напишите на alexfree78@yandex.ru Платы уже якобы отправлены, думаю недели через 2-3 будут у меня. Проверю, спаяю свой экземпляр и буду рассылать желающим. Цена вышла 350р. за штуку, плюс стоимость пересылки.
Вопрос к автору. Я запихал в ручку паяльника геркон, как в фене. Что нужно изменить в коде, чтобы таймер начинал отсчет только когда паяльник на подставке, и канал паяльника вырубался по истечении времени таймера. А когда паяльник не на подставке чтоб никаких таймеров и работал постоянно.
Насколько я понял - Вы включаете фен, он не нагревается и на дисплей выводится защита №6?
В таком случае всё верно - нет нагрева, поэтому и ошибка.
Фен может не нагреваться по двум причинам -
1. Не работает симисторный узел.
2. Не работает узел контроля 0 сети.
Как проверить и то и другое уже описывалось в теме.
alex1978 пишет:
Что нужно изменить в коде, чтобы таймер начинал отсчет только когда паяльник на подставке, и канал паяльника вырубался по истечении времени таймера.
Скетч с возможностью выбора поведения таймера паяльника под спойлером.
Для включения режима "отсчёт таймера выключения паяльника только на подставке" нужно
раскомментировать #define SOLDER_TIMER_ON_STAND
/* * * * * * * * * * * * * * * * * * */
/* Soldering Station v 1.6 */
/* coded by OlegK */
/* arduino.ru/forumy/proekty */
/* * * * * * * * * * * * * * * * * * */
#include <EEPROM.h>
#include <CyberLib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>
#include <avr/io.h>
#include <avr/interrupt.h>
/* it's fuckin' magic! */
#if 1
__asm volatile ("nop");
#endif
/* Options */
/* if you need to create themperature diagramm then uncomment it */
//#define NEED_GRAPH
/* if used not rail-to-rail OPA, then uncomment it */
//#define LM358
/* if used passive busser, then uncomment it */
//#define PASSIVE_BUZZER
/* if you want deactivate additional protection, then COMMENT it */
#define HA_ADV_PROT_ON
#define S_ADV_PROT_ON
/* if used LCD 1602, then uncomment it */
//#define LCD_1602
/* Soldering iron - if you want to remove the digit jumps, then uncomment it */
//#define SOLDER_DIGIT_JUMPS_REMOVE
/* Hot Air - if you want to remove the digit jumps, then uncomment it */
//#define HOTAIR_DIGIT_JUMPS_REMOVE
/* if you want soldering iron soft start, then uncomment it */
//#define SOLDER_SOFT_START
/* if you want to activate soldering iron off-timer only on stand, then uncomment it */
//#define SOLDER_TIMER_ON_STAND
/* End options */
#define FIRMWARE_VERSION "1.6"
#ifdef LCD_1602
LiquidCrystal_I2C lcd(0x27, 16, 2);
#else
LiquidCrystal_I2C lcd(0x27, 20, 4);
#endif
/* Degree symbol */
uint8_t degree[8] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000
};
/* Arrow symbol */
uint8_t arrow[8] = {
B00000,
B00100,
B00010,
B11111,
B00010,
B00100,
B00000,
B00000
};
/* mode selector */
#define modeSolder 1
#define modeHotAir 2
#define modeFanPWM 3
boolean need_S_countdown = false;
byte selected_Mode = modeSolder;
byte HA_countdown = 1;
byte S_countdown = 1;
uint16_t HA_sleeptime = 10;
uint16_t S_sleeptime = 10;
uint16_t Graph_count = 0;
uint32_t UPbuttonPressTime = 0;
uint32_t DWNbuttonPressTime = 0;
uint32_t SONbuttonPressTime = 0;
uint32_t HAONbuttonPressTime = 0;
boolean UPbuttonState, DWNbuttonState, SONbuttonState, HAONbuttonState;
byte Count;
uint16_t Duration, Interval;
char bspace[ ] = " ";
#define pinBuzzer 12
#define pinFanPwm 6
#define pinSolderPwm 5
#define min_solder_temp 100
#define max_solder_temp 400
#define min_hotair_temp 20
#define max_hotair_temp 450
#define min_rpm 30
#define max_rpm 100
#define default_temp 280
#define default_rpm 50
/* Buttons */
#define sw_HA 10
#define sw_S 9
#define bt_SON 13
#define bt_HAON 14
#define bt_Sel 15
#define bt_Up 16
#define bt_Dwn 17
/* Bounce killers */
Bounce swHotAir = Bounce();
Bounce swSolder = Bounce();
Bounce SolderOnButton = Bounce();
Bounce HotAirOnButton = Bounce();
Bounce SelButton = Bounce();
Bounce UpButton = Bounce();
Bounce DwnButton = Bounce();
/* Hot Air */
/* states */
#define st_stop 0
#define st_work 1
#define st_pause 2
#define st_protection 3
//#define st_lowpower 4
byte hotair_state = st_stop;
volatile uint16_t ots = 9990;
volatile float HAPower = 0.0;
uint16_t GetHotAirT = 0;
uint16_t SetHotAirT = 100;
byte SetHotAirRPM = 100;
boolean HA_temp_stable = false;
boolean need_Cooling = true;
boolean scr_blink = false;
byte ha_error = 0;
boolean HA_prot_beep = false;
boolean ha_f1 = false;
boolean ha_f2 = false;
uint32_t prevHAcontrol;
/* HA PI regulator */
#define Kp 1.0
#define Ki 0.007 //0.003 //0.005 //0.05
int integral = 0;
/* Soldering iron */
uint16_t GetSolderT = 0;
uint16_t SetSolderT = 100;
boolean S_temp_stable = false;
boolean SolderON = false;
boolean SolderProtect = false;
int SPower = 0;
//byte solder_state = st_stop;
byte s_error = 0;
uint32_t prevScontrol;
boolean S_prot_beep = false;
boolean s_f1 = false;
boolean s_f2 = false;
/* Solder P regulator */
#define sKp 50
uint16_t last_HotAirT, last_SolderT;
byte last_RPM;
/********************************************* MAIN PROCEDURES *********************************************/
void setup() {
//ADC speedup
//ADCSRA &= ~(1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0); // reset 128
//ADCSRA |= 1 <<ADPS2; // set to 16 (1MHz)
pinMode(3, INPUT_PULLUP); //Zero cross pin
D5_Out; //pinSolder
D5_Low;
D4_Out; //pinSolderProt
D4_Low;
D7_Out; //pinHotAirProt
D7_Low;
D8_Out; //pinHotAir
D8_Low;
D12_Out; //pinBuzzer
D12_Low;
ButtonsSetup();
#ifdef NEED_GRAPH
Serial.begin(9600);
#endif
Serial.begin(9600);
lcd.begin();
lcd.backlight();
lcd.createChar(0, degree);
lcd.createChar(1, arrow);
Splash();
MemRead();
delay_ms(2000);
initDisplay();
attachInterrupt(1, ZC, FALLING);
}
void loop() {
ScanButtons();
/* Off-timer for HotAir, countdown with 1 min */
static uint32_t prevHAmillis = millis();
if (hotair_state == st_pause) {
if (millis() - prevHAmillis > 60000) {
prevHAmillis = millis();
if (HA_countdown > 1) {
HA_countdown--;
if (HA_countdown == 1) {
Beep(100); //Beep, if 1 minute left
}
} else {
hotair_state = st_stop;
Beep(200);
}
}
} else {
prevHAmillis = millis();
}
/* Off-timer for Solder, countdown with 1 min */
static uint32_t prevSmillis = millis();
if (need_S_countdown) {
if (millis() - prevSmillis > 60000) {
if (S_countdown > 1) {
S_countdown--;
if (S_countdown == 1) {
Beep(100); //Beep, if 1 minute left
}
} else {
MemSolder();
need_S_countdown = false;
SolderON = false;
Beep(200);
}
prevSmillis = millis();
}
} else {
prevSmillis = millis();
}
/* Update LCD with 500ms interval */
static uint32_t prevDisplayMillis = millis();
if (millis() - prevDisplayMillis > 500) {
scr_blink = ! scr_blink;
prevDisplayMillis = millis();
DisplayUpdate();
/* Send data to Serial port */
#ifdef NEED_GRAPH
if (SolderON || hotair_state == st_work) {
Graph_count++;
//Serial.print(Graph_count);
//Serial.print(";");
} else {
Graph_count = 0;
}
if (SolderON && hotair_state != st_work) {
Serial.println(GetSolderT);
} else if (!SolderON && hotair_state == st_work) {
Serial.println(GetHotAirT);
}
#endif
}
WorkWithHotAir();
WorkWithSolder();
}
/* HotAir working procedure */
void WorkWithHotAir() {
/* Read the thermocouple value */
//GetHotAirT = A7_Read >> 1;
#ifdef LM358
GetHotAirT = getOversampled_HA();
#else
GetHotAirT = getOversampled_HA() >> 1;
#endif
switch (hotair_state) {
case st_stop: {
HotAirOff();
Cooling();
break;
}
case st_work: {
/* Set the cooler rpm (convert from 30-100% to 80-255 PWM) */
analogWrite(pinFanPwm, map(SetHotAirRPM, min_rpm, max_rpm, 80, 255));
ha_error = HADoProtect();
/* Turn ON protection relay */
if (ha_error == 0) D7_High;
/* Themperature PI regulator */
HA_PI();
/* If themperature was stable for 100 times (+/-2 degrees), then signalize about it */
int delta = ABS(SetHotAirT, GetHotAirT);
static byte HAgood;
if (!HA_temp_stable) {
if (delta < 3) {
HAgood++;
if (HAgood == 100) {
Beep(50);
delay_ms(200);
Beep(50);
HAgood = 0;
HA_temp_stable = true;
}
} else {
HAgood = 0;
}
} else {
if (delta > 5) {
HA_temp_stable = false;
}
}
break;
}
case st_pause: {
HAPower = 0.0;
HA_temp_stable = false;
CalctImpulseControl();
Cooling();
ha_error = HADoProtect();
break;
}
case st_protection: {
need_Cooling = true;
break;
}
} //switch (state)
}
/* Solder working procedure */
void WorkWithSolder() {
/* Read the thermoresistor value */
//GetSolderT = A6_Read >> 1;
#ifdef LM358
GetSolderT = getOversampled_S();
#else
GetSolderT = getOversampled_S() >> 1;
#endif
if ( SolderON ) {
s_error = SDoProtect();
/* Turn ON relay */
if (s_error == 0) D4_High;
/* themperature P regulator */
S_P();
/* If themperature was stable for 200 times loop (+/- 2 degrees) then signalize about it */
uint16_t delta = ABS(SetSolderT, GetSolderT);
static byte Sgood;
if (!S_temp_stable) {
if (delta < 3) {
Sgood++;
if (Sgood == 200) {
Beep(50);
delay_ms(200);
Beep(50);
//Sgood = 0;
S_temp_stable = true;
}
} else {
Sgood = 0;
}
} else {
if (delta > 5) {
S_temp_stable = false;
}
}
} else {
SolderOff();
need_S_countdown = false;
S_countdown = 1;
}
}
/***************************************** END OF MAIN PROCEDURES ******************************************/
/****************************************** PROTECTION & ON-OFF ********************************************/
/* HotAir protection */
byte HADoProtect() {
/* ------------------------------------------------------------------------------------------------------- */
/* Crytical protection: high overheat or thermocouple value is not valid or wire break */
if (GetHotAirT > max_hotair_temp + 20) {
HAProtectionOut();
return 1;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Crytical protection: thermocouple value is not valid or wires short circuit */
if (GetHotAirT < 10) {
HAProtectionOut();
return 2;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Overheat protection */
if (ha_f1 && GetHotAirT > SetHotAirT + 20) {
ha_f1 = false;
HAProtectionOut();
return 3;
}
if (ha_f2 && GetHotAirT < SetHotAirT + 15) {
ha_f1 = true;
ha_f2 = false;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Deviation themperature protection +/- 10 degrees */
//if (HA_temp_stable) {
//ha_f3 = true;
//}
//
//if (ha_f3) {
//if (GetHotAirT > SetHotAirT + 10) {
//HAProtectionOut();
//return 4;
//}
//
//if (GetHotAirT < SetHotAirT - 10) {
//HAProtectionOut();
//return 5;
//}
//}
/* ------------------------------------------------------------------------------------------------------- */
#ifdef HA_ADV_PROT_ON
/* Advanced protection: the themperature falls down/not changed & power > 0 */
/* & */
/* Advanced protection: the themperature rise up & power < 0 */
static byte t_cnt = 0;
static byte t_cnt2 = 0;
static boolean ha_ctrl = true;
if (!HA_temp_stable) {
static uint16_t prev_t;
if (ha_ctrl) {
prev_t = GetHotAirT;
ha_ctrl = false;
prevHAcontrol = millis();
}
if (!ha_ctrl && millis() - prevHAcontrol > 1000) {
ha_ctrl = true;
if (HAPower > 0.0) {
/* themperature falls or not changed */
if (prev_t >= GetHotAirT && GetHotAirT < SetHotAirT) {
t_cnt++;
if (t_cnt == 5) {
HAProtectionOut();
t_cnt = 0;
return 6;
}
} else t_cnt = 0;
} else { //HAPower == 0.0
/* themperature rise */
if (prev_t < GetHotAirT && GetHotAirT > SetHotAirT) {
t_cnt2++;
if (t_cnt2 == 5) {
HAProtectionOut();
t_cnt2 = 0;
return 7;
}
} else t_cnt2 = 0;
}
}
} else {
prevHAcontrol = millis();
t_cnt = 0;
t_cnt2 = 0;
ha_ctrl = true;
}
#endif
/* ------------------------------------------------------------------------------------------------------- */
/* if everything is OK */
return 0;
}
/* Solder protection */
byte SDoProtect() {
/* ------------------------------------------------------------------------------------------------------- */
/* Crytical protection: high overheat or thermoresistor value is not valid or wire break */
if (GetSolderT > max_solder_temp + 20) {
SProtectionOut();
return 1;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Crytical protection: thermoresistor value is not valid or wires short circuit */
if (GetSolderT < 10) {
SProtectionOut();
return 2;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Overheat protection */
if (s_f1 && GetSolderT > SetSolderT + 20) {
s_f1 = false;
SProtectionOut();
return 3;
}
if (s_f2 && GetSolderT < SetSolderT + 15) {
s_f1 = true;
s_f2 = false;
}
/* ------------------------------------------------------------------------------------------------------- */
/* Deviation themperature protection +/- 10 degrees */
//if (S_temp_stable) {
//s_f3 = true;
//}
//
//if (s_f3) {
//if (GetSolderT > SetSolderT + 10) {
//SProtectionOut();
//return 4;
//}
//Not required for soldering iron
//if (GetSolderT < SetSolderT - 10) {
//SProtectionOut();
//return 5;
//}
// }
/* ------------------------------------------------------------------------------------------------------- */
#ifdef S_ADV_PROT_ON
/* Advanced protection: the themperature falls down/not changed & power > 0 */
/* & */
/* Advanced protection: the themperature rise up & power < 0 */
static byte t_cnt = 0;
static byte t_cnt2 = 0;
static boolean s_ctrl = true;
if (!S_temp_stable) {
static uint16_t prev_t = 0;
if (s_ctrl) {
prev_t = GetSolderT;
s_ctrl = false;
prevScontrol = millis();
}
if (!s_ctrl && millis() - prevScontrol > 1000) {
s_ctrl = true;
if (SPower > 0) {
/* themperature falls or not changed */
if (prev_t >= GetSolderT && GetSolderT < SetSolderT) {
t_cnt++;
if (t_cnt == 7) {
SProtectionOut();
t_cnt = 0;
return 6;
}
} else t_cnt = 0;
} else { //SPower == 0
/* themperature rise */
if (prev_t < GetSolderT && GetSolderT > SetSolderT) {
t_cnt2++;
if (t_cnt2 == 7) {
SProtectionOut();
t_cnt2 = 0;
return 7;
}
} else t_cnt2 = 0;
}
}
} else {
prevScontrol = millis();
t_cnt = 0;
t_cnt2 = 0;
s_ctrl = true;
}
#endif
/* ------------------------------------------------------------------------------------------------------- */
/* everything is OK */
return 0;
}
/* Solder full off */
void SolderOff() {
analogWrite(pinSolderPwm, 0);
D5_Low;
D4_Low;
resetSolderStablePoint();
if (S_prot_beep) {
S_prot_beep = false;
Beep(1000);
MemSolder();
}
}
/* HotAir full off */
void HotAirOff() {
HAPower = 0.0;
D8_Low;
delay_ms(10);
D7_Low;
hotair_state = st_stop;
resetHotAirStablePoint();
if (HA_prot_beep) {
HA_prot_beep = false;
Beep(1000);
MemHotAir();
}
}
/* Cooling the heater until the temperature is below 50 degrees */
void Cooling() {
if (GetHotAirT >= 50 && need_Cooling) {
analogWrite(pinFanPwm, 255);
} else {
analogWrite(pinFanPwm, 0);
need_Cooling = false;
}
}
/* internal procedure */
void set_ha_f() {
boolean a = SetHotAirT >= GetHotAirT;
ha_f1 = a;
ha_f2 = !a;
}
/* internal procedure */
void set_s_f() {
boolean a = SetSolderT >= GetSolderT;
s_f1 = a;
s_f2 = !a;
}
/* Solder protection */
void SProtectionOut() {
SolderProtect = true;
S_prot_beep = true;
SolderON = false;
SolderOff();
}
/* HotAir protection out */
void HAProtectionOut() {
analogWrite(pinFanPwm, 255);
HA_prot_beep = true;
HotAirOff();
hotair_state = st_protection;
}
/****************************************** END OF PROTECTION & ON-OFF *************************************/
/************************************************ OTHER ROUTINES *******************************************/
/* Read integer value */
int EEPROM_int_read(int addr) {
byte raw[2];
for (byte i = 0; i < 2; i++) {
raw[i] = EEPROM.read(addr + i);
}
int &num = (int&)raw;
return num;
}
/* Write integer value */
void EEPROM_int_write(int addr, int num) {
byte raw[2];
(int&)raw = num;
for (byte i = 0; i < 2; i++) {
EEPROM.write(addr + i, raw[i]);
}
}
/* Read last parameters from memory */
void MemRead() {
SetSolderT = EEPROM_int_read(0);
if (SetSolderT < min_solder_temp || SetSolderT > max_solder_temp) {
SetSolderT = default_temp;
last_SolderT = SetSolderT;
}
SetHotAirT = EEPROM_int_read(4);
if (SetHotAirT < min_hotair_temp || SetHotAirT > max_hotair_temp) {
SetHotAirT = default_temp;
last_HotAirT = SetHotAirT;
}
SetHotAirRPM = EEPROM_int_read(8);
if (SetHotAirRPM < min_rpm || SetHotAirRPM > max_rpm) {
SetHotAirRPM = default_rpm;
last_RPM = SetHotAirRPM;
}
}
/* Write last used solder themperature to memory */
void MemSolder() {
if (last_SolderT != SetSolderT) {
EEPROM_int_write(0, SetSolderT);
last_SolderT = SetSolderT;
}
}
/* Write last used HotAir themperature and fan r.p.m. to memory */
void MemHotAir() {
if (last_HotAirT != SetHotAirT) {
EEPROM_int_write(4, SetHotAirT);
last_HotAirT = SetHotAirT;
}
if (last_RPM != SetHotAirRPM) {
EEPROM_int_write(8, SetHotAirRPM);
last_RPM = SetHotAirRPM;
}
}
/* Sound procedure */
void Beep(uint16_t duration) {
#ifdef PASSIVE_BUZZER
tone(pinBuzzer, 1000, duration);
#else
D12_High;
delay_ms(duration);
D12_Low;
#endif
}
/* HotAir oversampling function */
uint16_t getOversampled_HA() {
uint32_t tmp = 0;
for (byte z = 0; z < 64; z++) {
tmp += A7_Read;
}
return tmp >> 6;
}
/* Solder oversampling function */
uint16_t getOversampled_S() {
uint32_t tmp = 0;
for (byte z = 0; z < 64; z++) {
tmp += A6_Read;
}
return tmp >> 6;
}
/* Get absolute difference function */
uint16_t ABS(uint16_t a, uint16_t b) {
if (a > b) {
return (a - b);
}
return (b - a);
}
/****************************************** END OF OTHER ROUTINES ******************************************/
/*************************************** TRIAC CONTROL & AUTOMATHIC ****************************************/
/* Zero cross INT1 */
void ZC() {
StartTimer1(HeaterOn, ots);
RestartTimer1();
}
/* Triac open impulse */
void HeaterOn() {
if (HAPower > 0.0) {
D8_High;
delay_us(100);
}
D8_Low;
StopTimer1();
}
/* Calculate triac open delay */
void CalctImpulseControl() {
ots = (uint16_t)(acos(HAPower / 50.0 - 1.0 ) * 9900.0 / pi);
}
/* HotAir PI regulator */
void HA_PI() {
int err = SetHotAirT - GetHotAirT;
float tmp_power = ((Kp * err) + (Ki * integral));
float max_power = map(SetHotAirT, min_hotair_temp, max_hotair_temp, 10.0, 60.0);
if (tmp_power < max_power && tmp_power > 0.0) {
integral += err;
}
HAPower = constrain(tmp_power, 0.0, max_power);
CalctImpulseControl();
}
#ifdef SOLDER_SOFT_START
/* Solder P regulator with soft start */
void S_P() {
int TempPower = sKp * (SetSolderT - GetSolderT);
byte maxPower = 255;
if (GetSolderT < 100) {
maxPower = 100;
}
SPower = constrain(TempPower, 0, maxPower);
analogWrite(pinSolderPwm, SPower);
}
#else
/* Solder P regulator */
void S_P() {
int TempPower = sKp * (SetSolderT - GetSolderT);
SPower = constrain(TempPower, 0, 255);
analogWrite(pinSolderPwm, SPower);
}
#endif
/************************************* END OF TRIAC CONTROL & AUTOMATHIC ***********************************/
/**************************************** INTERFACE CONTROLS & TIMERS **************************************/
/* Scan buttons */
void ScanButtons() {
/* HotAir stand switch */
if (swHotAir.update() && hotair_state != st_stop) {
if (swHotAir.fell()) {
hotair_state = st_pause;
need_Cooling = true;
resetHotAirCountown();
} else {
if (hotair_state == st_pause) {
hotair_state = st_work;
integral = 0;
set_ha_f() ;
}
}
Beep(50);
} else if (hotair_state == st_work && D10_Read == LOW) {
D7_High;
hotair_state = st_pause;
need_Cooling = true;
resetHotAirCountown();
}
#ifdef SOLDER_TIMER_ON_STAND
/* Solder stand switch - only on stand */
swSolder.update();
if (swSolder.fell() && SolderON) {
if (!need_S_countdown) {
Activate_S_countdown();
Beep(50);
}
}
if (swSolder.rose()) {
if (need_S_countdown) {
need_S_countdown = false;
Beep(50);
}
}
#else
/* Solder stand switch simple check user activity */
if (swSolder.update() && SolderON) {
resetSolderCountdown();
Beep(50);
}
#endif // SOLDER_TIMER_ON_STAND
/* Solder "on-off" button */
if (SolderOnButton.update()) {
if (SolderOnButton.read()) {
SONbuttonState = false;
} else {
if (!SolderON) {
SolderON = true;
SolderProtect = false;
Activate_S_countdown();
Graph_count = 0;
selected_Mode = modeSolder;
resetSolderStablePoint();
set_s_f();
} else {
resetSolderCountdown();
}
SONbuttonState = true;
SONbuttonPressTime = millis();
Beep(50);
}
}
if (SONbuttonState) {
if ( millis() - SONbuttonPressTime >= 1000 ) { //long press
SONbuttonPressTime = millis();
if (SolderON) {
SolderON = false;
resetSolderStablePoint();
MemSolder();
Beep(200);
}
}
}
/* HotAir "on-off" button */
if (HotAirOnButton.update()) {
if (HotAirOnButton.read()) {
HAONbuttonState = false;
} else {
if (hotair_state != st_work) {
hotair_state = st_work;
Graph_count = 0;
selected_Mode = modeHotAir;
need_Cooling = true;
resetHotAirStablePoint();
set_ha_f();
integral = 0;
} else {
resetHotAirCountown();
}
HAONbuttonState = true;
HAONbuttonPressTime = millis();
Beep(50);
}
}
if (HAONbuttonState) {
if ( millis() - HAONbuttonPressTime >= 1000 ) { //long press
HAONbuttonPressTime = millis();
resetHotAirStablePoint();
if (hotair_state == st_work || hotair_state == st_pause) {
hotair_state = st_stop;
need_Cooling = true;
MemHotAir();
Beep(200);
}
}
}
/* Select button */
if (SelButton.update()) {
if (SelButton.fell()) {
Beep(50);
(selected_Mode < modeFanPWM) ? (selected_Mode++) : (selected_Mode = modeSolder);
}
}
/* UP button */
static boolean short_press_flag = false;
if (UpButton.update()) {
if (UpButton.rose()) {
UPbuttonState = false;
short_press_flag = false;
} else {
switch (selected_Mode) {
case modeSolder:
if (SetSolderT < max_solder_temp) {
SetSolderT += 5;
}
set_s_f();
resetSolderStablePoint();
resetSolderCountdown();
break;
case modeHotAir:
if (SetHotAirT < max_hotair_temp) {
SetHotAirT += 5;
}
break;
case modeFanPWM:
if (SetHotAirRPM < max_rpm) {
SetHotAirRPM += 5;
}
break;
}
if (selected_Mode > 1) {
set_ha_f();
resetHotAirStablePoint();
resetHotAirCountown();
}
UPbuttonState = true;
short_press_flag = true;
UPbuttonPressTime = millis();
Beep(50);
}
}
/* UP button (long press) */
if (UPbuttonState) {
if ( millis() - UPbuttonPressTime >= 500 ) {
UPbuttonPressTime = millis();
byte step = 10;
if (short_press_flag) {
step = 5;
short_press_flag = false;
}
switch (selected_Mode) {
case modeSolder:
SetSolderT += step;
if (SetSolderT > max_solder_temp) SetSolderT = max_solder_temp;
set_s_f();
resetSolderStablePoint();
resetSolderCountdown();
break;
case modeHotAir:
SetHotAirT += step;
if (SetHotAirT > max_hotair_temp) SetHotAirT = max_hotair_temp;
break;
case modeFanPWM:
SetHotAirRPM += step;
if (SetHotAirRPM > max_rpm) SetHotAirRPM = max_rpm;
break;
}
if (selected_Mode > 1) {
set_ha_f();
resetHotAirStablePoint();
resetHotAirCountown();
}
}
}
/* Down button */
if (DwnButton.update()) {
if (DwnButton.read()) {
DWNbuttonState = false;
short_press_flag = false;
} else {
switch (selected_Mode) {
case modeSolder:
if (SetSolderT > min_solder_temp) {
SetSolderT -= 5;
}
set_s_f();
resetSolderStablePoint();
resetSolderCountdown();
break;
case modeHotAir:
if (SetHotAirT > min_hotair_temp) {
SetHotAirT -= 5;
}
break;
case modeFanPWM:
if (SetHotAirRPM > min_rpm) {
SetHotAirRPM -= 5;
}
break;
}
if (selected_Mode > 1) {
set_ha_f();
resetHotAirStablePoint();
resetHotAirCountown();
}
DWNbuttonState = true;
short_press_flag = true;
DWNbuttonPressTime = millis();
Beep(50);
}
}
/* Down button (long press) */
if (DWNbuttonState) {
if ( millis() - DWNbuttonPressTime >= 500 ) {
DWNbuttonPressTime = millis();
byte step = 10;
if (short_press_flag) {
step = 5;
short_press_flag = false;
}
switch (selected_Mode) {
case modeSolder:
SetSolderT -= step;
if (SetSolderT < min_solder_temp) SetSolderT = min_solder_temp;
set_s_f();
resetSolderStablePoint();
resetSolderCountdown();
break;
case modeHotAir:
SetHotAirT -= step;
if (SetHotAirT < min_hotair_temp) SetHotAirT = min_hotair_temp;
break;
case modeFanPWM:
SetHotAirRPM -= step;
if (SetHotAirRPM < min_rpm) SetHotAirRPM = min_rpm;
break;
}
if (selected_Mode > 1) {
set_ha_f();
resetHotAirStablePoint();
resetHotAirCountown();
}
}
}
}
/* Buttons initialise */
void ButtonsSetup() {
pinMode(sw_HA, INPUT_PULLUP);
swHotAir.attach(sw_HA);
swHotAir.interval(50);
pinMode(sw_S, INPUT_PULLUP);
swSolder.attach(sw_S);
swSolder.interval(50);
pinMode(bt_SON, INPUT_PULLUP);
SolderOnButton.attach(bt_SON);
SolderOnButton.interval(5);
pinMode(bt_HAON, INPUT_PULLUP);
HotAirOnButton.attach(bt_HAON);
HotAirOnButton.interval(5);
pinMode(bt_Sel, INPUT_PULLUP);
SelButton.attach(bt_Sel);
SelButton.interval(10);
pinMode(bt_Up, INPUT_PULLUP);
UpButton.attach(bt_Up);
UpButton.interval(5);
pinMode(bt_Dwn, INPUT_PULLUP);
DwnButton.attach(bt_Dwn);
DwnButton.interval(5);
}
/* internal procedure */
void resetHotAirStablePoint() {
HA_temp_stable = false;
}
/* internal procedure */
void resetSolderStablePoint() {
S_temp_stable = false;
}
/* Reset HotAir countdown */
void resetHotAirCountown() {
HA_countdown = HA_sleeptime;
}
/* Reset Solder countdown */
void resetSolderCountdown() {
S_countdown = S_sleeptime;
}
/* Activate Solder countdown procedure */
void Activate_S_countdown() {
need_S_countdown = true;
S_countdown = S_sleeptime;
}
/**************************************** INTERFACE CONTROLS & TIMERS **************************************/
/************************************************* DISPLAY *************************************************/
/* "Hello" screen */
void Splash() {
lcd.clear();
#ifdef LCD_1602
lcd.setCursor(0, 0);
lcd.print(F("Soldering Station"));
lcd.setCursor(6, 1);
#else
lcd.setCursor(2, 1);
lcd.print(F("Soldering Station"));
lcd.setCursor(7, 2);
#endif
lcd.print(F("v "));
lcd.print(FIRMWARE_VERSION);
}
/* Set LCD design */
void initDisplay() {
lcd.clear();
#ifdef LCD_1602
#else
lcd.setCursor(11, 0);
lcd.print(F("Set"));
lcd.setCursor(16, 0);
lcd.print(F("Act"));
lcd.setCursor(0, 1);
lcd.print(F("Solder"));
lcd.setCursor(0, 2);
lcd.print(F("HotAir"));
lcd.setCursor(0, 3);
lcd.print(F("FanRPM"));
#endif
}
/* Update LCD */
void DisplayUpdate() {
#ifdef LCD_1602
lcd.setCursor(0, 0);
lcd.print(bspace);
lcd.setCursor(0, 0);
if (SolderProtect) {
lcd.print(F("!"));
lcd.print(s_error);
} else if (need_S_countdown) {
lcd.print(S_countdown);
}
lcd.setCursor(3, 0);
lcd.print(bspace);
lcd.setCursor(3, 0);
lcd.print(SetSolderT);
lcd.write((byte)0);
byte pos;
uint16_t s_view_t;
if (GetSolderT > 505) {
lcd.setCursor(8, 0);
lcd.print(F("---"));
} else {
uint16_t s_view_t;
#ifdef SOLDER_DIGIT_JUMPS_REMOVE
(S_temp_stable)? (s_view_t = SetSolderT) : (s_view_t = GetSolderT);
#else
s_view_t = GetSolderT;
#endif
pos = GetPos(s_view_t);
lcd.setCursor(8, 0);
lcd.print(bspace);
lcd.setCursor(8+pos, 0);
lcd.print(s_view_t);
}
lcd.write((byte)0);
lcd.setCursor(0, 1);
lcd.print(bspace);
lcd.setCursor(0, 1);
switch (hotair_state) {
case st_stop: {
break;
}
case st_work: {
if (HA_temp_stable) {
lcd.print(F(" *"));
} else {
lcd.print(F(" :"));
}
break;
}
case st_pause: {
lcd.print(HA_countdown);
break;
}
case st_protection: {
lcd.print(F("!"));
lcd.print(ha_error);
break;
}
}
pos = GetPos(SetHotAirT);
lcd.setCursor(3, 1);
lcd.print(bspace);
lcd.setCursor(3+pos, 1);
lcd.print(SetHotAirT);
lcd.write((byte)0);
if (GetHotAirT > 505) {
lcd.setCursor(8, 1);
lcd.print(F("---"));
} else {
uint16_t ha_view_t;
#ifdef HOTAIR_DIGIT_JUMPS_REMOVE
(HA_temp_stable)? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT);
#else
ha_view_t = GetHotAirT;
#endif
pos = GetPos(ha_view_t);
lcd.setCursor(8, 1);
lcd.print(bspace);
lcd.setCursor(8+pos, 1);
lcd.print(ha_view_t);
}
lcd.write((byte)0);
lcd.setCursor(13, 1);
lcd.print(bspace);
lcd.setCursor(13, 1);
pos = GetPos(SetHotAirRPM);
if (need_Cooling && hotair_state != st_work) {
lcd.print(F("100%"));
} else {
lcd.setCursor(13+pos, 1);
lcd.print(SetHotAirRPM);
lcd.print(F("%"));
}
lcd.setCursor(2, 0);
lcd.print(F(" "));
lcd.setCursor(2, 1);
lcd.print(F(" "));
lcd.setCursor(12, 1);
lcd.print(F(" "));
switch (selected_Mode) {
case modeSolder: {
lcd.setCursor(2, 0);
break;
}
case modeHotAir: {
lcd.setCursor(2, 1);
break;
}
case modeFanPWM: {
lcd.setCursor(12, 1);
break;
}
}
lcd.write((byte)1);
//if (hotair_state == ha_pause) {
//(scr_blink) ? (lcd.backlight()) : (lcd.noBacklight());
//} else {
//lcd.backlight();
//}
if (hotair_state == st_pause) {
lcd.setCursor(2, 1);
lcd.blink_on();
} else {
lcd.blink_off();
}
#else //LCD2004
lcd.setCursor(6, 1);
lcd.print(bspace);
lcd.setCursor(7, 1);
if (SolderProtect) {
lcd.print(F("!"));
lcd.print(s_error);
} else if (need_S_countdown) {
lcd.print(S_countdown);
}
lcd.setCursor(11, 1);
lcd.print(bspace);
lcd.setCursor(11, 1);
lcd.print(SetSolderT);
lcd.write((byte)0);
byte pos;
uint16_t s_view_t;
if (GetSolderT > 505) {
lcd.setCursor(16, 1);
lcd.print(F("---"));
} else {
uint16_t s_view_t;
#ifdef SOLDER_DIGIT_JUMPS_REMOVE
(S_temp_stable)? (s_view_t = SetSolderT) : (s_view_t = GetSolderT);
#else
s_view_t = GetSolderT;
#endif
pos = GetPos(s_view_t);
lcd.setCursor(16, 1);
lcd.print(bspace);
lcd.setCursor(16+pos, 1);
lcd.print(s_view_t);
}
lcd.write((byte)0);
lcd.setCursor(6, 2);
lcd.print(bspace);
lcd.setCursor(7, 2);
switch (hotair_state) {
case st_stop: {
break;
}
case st_work: {
if (HA_temp_stable) {
lcd.print(F(" *"));
} else {
lcd.print(F(" :"));
}
break;
}
case st_pause: {
lcd.print(HA_countdown);
break;
}
case st_protection: {
lcd.print(F("!"));
lcd.print(ha_error);
break;
}
}
pos = GetPos(SetHotAirT);
lcd.setCursor(11, 2);
lcd.print(bspace);
lcd.setCursor(11+pos, 2);
lcd.print(SetHotAirT);
lcd.write((byte)0);
if (GetHotAirT > 505) {
lcd.setCursor(16, 2);
lcd.print(F("---"));
} else {
uint16_t ha_view_t;
#ifdef HOTAIR_DIGIT_JUMPS_REMOVE
(HA_temp_stable)? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT);
#else
ha_view_t = GetHotAirT;
#endif
pos = GetPos(ha_view_t);
lcd.setCursor(16, 2);
lcd.print(bspace);
lcd.setCursor(16+pos, 2);
lcd.print(ha_view_t);
}
lcd.write((byte)0);
lcd.setCursor(11, 3);
lcd.print(bspace);
lcd.setCursor(11, 3);
pos = GetPos(SetHotAirRPM);
if (need_Cooling && hotair_state != st_work) {
lcd.print(F("100%"));
} else {
lcd.setCursor(11+pos, 3);
lcd.print(SetHotAirRPM);
lcd.print(F("%"));
}
for (byte z = 1; z < 4; z++) {
lcd.setCursor(10, z);
lcd.print(F(" "));
}
lcd.setCursor(10, selected_Mode);
//lcd.print(F(">"));
lcd.write((byte)1);
//if (hotair_state == st_pause) {
//(scr_blink) ? (lcd.backlight()) : (lcd.noBacklight());
//} else {
//lcd.backlight();
//}
if (hotair_state == st_pause) {
lcd.setCursor(6, 2);
lcd.blink_on();
} else {
lcd.blink_off();
}
#endif
}
/* Get print position */
byte GetPos(uint16_t number) {
if (number >= 100) {
return 0;
} else if (number < 10) {
return 2;
}
return 1;
}
/*********************************************** END OF DISPLAY ********************************************/
ЗЫ.
По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.
Я уже получил его, у меня был Pc817, но он не дает мне температуры, не показывает, что есть большая разница, когда я устанавливаю так, что не могу достичь температуры, как на термометре.
Здравствуйте,Olegk попробовал скетч 1.6,режим "отсчёт таймера выключения паяльника только на подставке" работает,но возник вопрос по каналу фена температура отображается теперь 100-36,раньше этой черточки небыло,это какая то задумка или случайность.
P.S.Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.
Черточка появляется,если включить станцию без фена(т.к. на дисплее отображается ---^^ и если я подключу фен будет отображаться - 18^),но если включить станцию с подключенным феном все отображается нормально,но если я выдерну фен из разъема будет отображаться ---^^ и вставлю обратно черточка уже остается.
Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.
Писка нет только при отклонении от заданной температуры на 1 градус( у меня просто всегда так) 100% заполнение потому и не пищит, дальше Шим и 490 герц ни кто не отменял. Кстати я вернул код как был, без шима у меня БП не тянет, если включаешь фен и паяльник одновременно кулер дует не стабильно.
Спасибо на найденный "косяк" )) Это, походу, в какой-то из предыдущих версий появилось.
Вроде поправил (в #1781). Посмотреть пока не могу, убегаю на смену. Попробуйте.
peterzonda пишет:
Я уже получил его, у меня был Pc817, но он не дает мне температуры, не показывает, что есть большая разница, когда я устанавливаю так, что не могу достичь температуры, как на термометре.
Я совсем ничего не понял. Вы каким переводчиком пользуетесь?
У вас фен не нагревается или показания температуры не можете настроить?
По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.
Ну вообще я сначала хотел выкинуть пин D2 и разъём под концевики сократить до трёх пинов, но потом подумал пусть торчат, вдруг автор решит на них какую полезную штуку повесить. А вот насчёт кирилицы это косячёк. Платы заказаны у китайцев и, возможно, вместо кирилицы будут крякозябры. Толщину шрифта причесал, а про кирилицу забыл. Так то пофиг, на работу не влияет...
Вопрос к автору!!! Что означает это?
/* Soldering iron - if you want to remove the digit jumps, then uncomment it */
//#define SOLDER_DIGIT_JUMPS_REMOVE
/* Hot Air - if you want to remove the digit jumps, then uncomment it */
//#define HOTAIR_DIGIT_JUMPS_REMOVE
Здравствуйте,alex1978 эти строчки в скетче отключают прыганье цифр,к примеру у меня при выставленных 250 градусах(в канале паяльника) температуру отображает 249-250,если я раскоментирую эту строчку будет всегда показывать 250.
Ага, понятно. Теперь еще один вопрос. Я взял последний скетч версии 1,6, и поменял в нем процедуру обновления экрана на процедуру из скетча 2,2 от Руслана. Теперь если паяло положить на подставку, то таймер запускается и отсчёт идет, но если снять его с подставки, то на экране остаётся цифра. Скажем положил паяльник, прошло пару минут, на экране стоит восьмерка, если паяльник снять то эта восьмёрка так и светится. Как сделать чтоб вообще цифры не было, а светилась звездочка например, как в канале фена? Скетч https://yadi.sk/d/kJK16Q8O3N2TMR
В общем вернул я назад скетч с таймерами. Пусть будут оба. Мало ли паяльник просто на столе забуду. Люди, поделитесь ссылкой кто где паяльник покупал. Мне китаец такое барахло прислал что просто пипец, кривой и уже разваливается, и провода пол метра.
Добрый день всем. Планируется заказ печатных плат на производстве. За основу взята плата от Руслана, вынесен модуль усилителя и причёсана платка под заводское изготовление. Платы планируются с металлизацией, маской. Текстолит 1,6-2мм. На одном куске размещены основная плата и модули усилителя под термопару и терморезистор.
Примерная стоимость составит примерно 350р. за комплект. Пробная партия будет заказываться через неделю. 5 комплектов. Возможно большее число комплектов. Один оставляю себе, второй другу. Если кому еще надо, обращайтесь.
Кто подскажет как картинки под спойлер прятать.
При включении паяла иногда появляется небольшой косячёк. При включении паяльника температура растет, немного забегает за установленную, тут же снижается, и вместо того, чтобы пикнуть пару раз и перейти в режим поддержки температуры, паяльник отключается с ошибкой i6. Если его сразу опять включить с кнопки, то дальше работает как ни в чем не бывало. Паяльник китаец прислал с термопарой. Фен тоже с термопарой, но на нем все нормально работает. Каналы усилителя идентичны, только номиналы резисторов немного отличаются. Связывался с автором на Ютубе, посоветовал уменьшить коэффициент #define sKp 50. Пробовал и уменьшать и увеличивать. Не помогает. Прошивка 2.2 от Руслана, сравнивал с оригинальной автора, разница только в выводе информации на дисплей. Кто что думает по этому поводу?
Это дополнительная защита, срабатывает по условию "если до момента стабилизации, температура падает или не изменяется в течении 5 сек". Можно попробовать увеличить время if (t_cnt == 5) в функции SDoProtect() до 7-10 сек.
А вообще, если что, доп. защиты можно деактивировать закомментив дефайн S_ADV_PROT_ON
До какой величины уменьшали? Увеличивать точно не стоит - могут возникнуть автоколебания. Уменьшая коэфф. несколько увеличивается время выхода на заданную температуру, но уменьшается и перерегулирование. Можно снять график набора температуры - нагляднее будет.
Добрый вечер, Олег, sKp 50 уменьшал как вы и советовали до 20-ти, при 40-ка немного стабильнее, но один фиг ошибки бывали, при 60-ти кстати ошибки вылетали реже чем при 40-ка и 50-ти. Вообще может быть проблема в ОУ? Просто операционники я заказывал естественно из поднебесной, у нас в городе не было в дип корпусах. Из 10-ти штук 4 были битые, да ещё китаёза прислал LM358P вместо LM358. Я вот тоже кстати подумывал об увеличении времени, но не знал как это сделать. В программировании я не силён. У паяльника инерция намного больше чем у фена. Да и качество китайских паяльников и фенов по ходу с каждым днём все хуже и хуже...
Кстати при 20-ти и 30-ти вообще паяло не работает, только ошибки сыпет.
Всё заработало как надо после увеличения времени до 10 секунд. Ещё раз спасибо за данную разработку! Кстати, заказаны пять комплектов плат, по цене вышло 340р. за штуку. Кому надо, обращайтесь.
У меня в текущей версии - 7, ложных срабатываний не было.
Правда и нагреватель не нихромовый, возможно, у него поменьше инерционность.
Мне просто некогда сейчас подбирать, поставил сразу 10 секунд, заработало. Поосвобожусь, подберу поменьше. Да и паяльник заменить хочу, китаец прислал откровенное фуфло, он уже разваливается. Платы придут, соберу всё по нормальному, пока у меня на самодельной плате, а они у меня никогда нормально не получались...
Привет, у меня тоже проблема. Я хочу переделать станцию сращивания, я сделал печатную плату, я загрузил программу в ардуин, но у меня есть только оригинальный писатель, чтобы не писать мне все. Так что из Словакии так переведено на переводчика, я не знаю, как переводить, я пытаюсь отправить фотографию, загрузите на этот дисплей 2004A.
peterzonda, привет.
Пару вопросов.
Библиотека для дисплея из моего архива?
Какая версия Arduino IDE?
PS. Возможно это поможет (сообщение 38).
Версия Arduino - 1,8,4, дисплей, который я точно не знаю, с какой версией я работал, я установил их для новой.
Я думаю, что у Вас старая библиотека. Попробуйте удалить её и использовать эту.
И разве вы не знаете, как я должен загрузить версию этой станции?
Спасибо, спасибо. И программное обеспечение на станции, которое сработало для меня?
Не совсем понял, о чём речь, но последнюю версию скетча и требуемые библиотеки (1.5) можно скачать здесь.
Ссылка также есть в сообщении #2 темы.
alex1978 я бы хотел преобрести плату как мне связатса с вами
Напишите на alexfree78@yandex.ru Платы уже якобы отправлены, думаю недели через 2-3 будут у меня. Проверю, спаяю свой экземпляр и буду рассылать желающим. Цена вышла 350р. за штуку, плюс стоимость пересылки.
Я хочу узнать, где присоединиться к GerKon.Fen, начнется сука и примерно через 3 секунды.
на котором булавка arduina - это GерKон?
Геркон подключается к D10.
DEL
Где я могу подключить его к этой схеме?
pin d10(13)
есть письменная CS и 4-контактный разъем
Я не хочу нагреть меня HotAir, напишите мне! 6 Разве вы не знаете, что может быть?
Вопрось к alex1978. Можно получить файл Вашей плате в формате .lay ?
Благодарю.
Конечно можно. Не жалко. https://yadi.sk/d/UTXaf4or3Mw4i2
Вопрос к автору. Я запихал в ручку паяльника геркон, как в фене. Что нужно изменить в коде, чтобы таймер начинал отсчет только когда паяльник на подставке, и канал паяльника вырубался по истечении времени таймера. А когда паяльник не на подставке чтоб никаких таймеров и работал постоянно.
Насколько я понял - Вы включаете фен, он не нагревается и на дисплей выводится защита №6?
В таком случае всё верно - нет нагрева, поэтому и ошибка.
Фен может не нагреваться по двум причинам -
1. Не работает симисторный узел.
2. Не работает узел контроля 0 сети.
Как проверить и то и другое уже описывалось в теме.
Скетч с возможностью выбора поведения таймера паяльника под спойлером.
Для включения режима "отсчёт таймера выключения паяльника только на подставке" нужно
раскомментировать #define SOLDER_TIMER_ON_STAND
ЗЫ.
По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.
Благодарю Вам alex1978 за быстрий ответ, но мне интересуеть плата которая показана в пост #1751.
Благодарю.
aleksandrov
Так в том файле она и есть, вкладки внизу смотрите - "все платы вместе"
Прошу извинения я не досмотрел. Все в порядке. Спасибо.
Я уже получил его, у меня был Pc817, но он не дает мне температуры, не показывает, что есть большая разница, когда я устанавливаю так, что не могу достичь температуры, как на термометре.
Здравствуйте,Olegk попробовал скетч 1.6,режим "отсчёт таймера выключения паяльника только на подставке" работает,но возник вопрос по каналу фена температура отображается теперь 100-36,раньше этой черточки небыло,это какая то задумка или случайность.
P.S.Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.
Черточка появляется,если включить станцию без фена(т.к. на дисплее отображается ---^^ и если я подключу фен будет отображаться - 18^),но если включить станцию с подключенным феном все отображается нормально,но если я выдерну фен из разъема будет отображаться ---^^ и вставлю обратно черточка уже остается.
Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.
Писка нет только при отклонении от заданной температуры на 1 градус( у меня просто всегда так) 100% заполнение потому и не пищит, дальше Шим и 490 герц ни кто не отменял. Кстати я вернул код как был, без шима у меня БП не тянет, если включаешь фен и паяльник одновременно кулер дует не стабильно.
Спасибо на найденный "косяк" )) Это, походу, в какой-то из предыдущих версий появилось.
Вроде поправил (в #1781). Посмотреть пока не могу, убегаю на смену. Попробуйте.
Я совсем ничего не понял. Вы каким переводчиком пользуетесь?
У вас фен не нагревается или показания температуры не можете настроить?
Olegk,протестировал скетч теперь все отображаеться правильно.
peterzonda
В чём проблема? Мала температура или совсем не настраивается?
Какой операционный усилитель установлен?
Раскомментируйте #define LM358.
Если раскомментировали и всё равно мало, то нужно увеличить резистор в цепи обратной связи ОУ.
ЗЫ.
По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.
Ну вообще я сначала хотел выкинуть пин D2 и разъём под концевики сократить до трёх пинов, но потом подумал пусть торчат, вдруг автор решит на них какую полезную штуку повесить. А вот насчёт кирилицы это косячёк. Платы заказаны у китайцев и, возможно, вместо кирилицы будут крякозябры. Толщину шрифта причесал, а про кирилицу забыл. Так то пофиг, на работу не влияет...
Вопрос к автору!!! Что означает это?
Здравствуйте,alex1978 эти строчки в скетче отключают прыганье цифр,к примеру у меня при выставленных 250 градусах(в канале паяльника) температуру отображает 249-250,если я раскоментирую эту строчку будет всегда показывать 250.
Ага, понятно. Теперь еще один вопрос. Я взял последний скетч версии 1,6, и поменял в нем процедуру обновления экрана на процедуру из скетча 2,2 от Руслана. Теперь если паяло положить на подставку, то таймер запускается и отсчёт идет, но если снять его с подставки, то на экране остаётся цифра. Скажем положил паяльник, прошло пару минут, на экране стоит восьмерка, если паяльник снять то эта восьмёрка так и светится. Как сделать чтоб вообще цифры не было, а светилась звездочка например, как в канале фена? Скетч https://yadi.sk/d/kJK16Q8O3N2TMR
А чем вас не устраивает скетч от автора,в нем же тоже можно подключить lcd1602.
У Руслана покрасивше сделано. :) Ну если ни как, то буду так юзать.
Олег подскажите пожалуйста что лучше поставить AD8552 или LM358.Ваше мнение как создателя паяльной станции.
В общем вернул я назад скетч с таймерами. Пусть будут оба. Мало ли паяльник просто на столе забуду. Люди, поделитесь ссылкой кто где паяльник покупал. Мне китаец такое барахло прислал что просто пипец, кривой и уже разваливается, и провода пол метра.