Моя паяльная станция

Valdr
Offline
Зарегистрирован: 03.09.2015

VitaliyDF пишет:

 int setSolderTemp = map(analogRead(pinSolderIn), 0, 1023, 0, 450);
  int solderTCouple = map(analogRead(pinSolderTCouple), 0, 780, 0, 480);
С такими параметрами регулировка стала точной, правда пришлось урезать температуру до 450, т.к. термопару определяет до 459.
Мне впринципе 480 и ненужно)


Я подбирал параметры для паяльника с терморезистором и оставил себе диапазон регулировки температуры от 200 до 350 градусов. Ниже 200 паять нечего, а выше 300 уже незгораемое жало выгорает.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Цитата:
Ниже 200 паять нечего, а выше 300 уже незгораемое жало выгорает.

Вниз я сделал до 100, мало ли, каким-нибудь сплавом Розе приспичит попаять ))
Т.е. паяльник может работать в диапазоне от 100 до 350 град., фен от 50 до 450 град.

Снял переходные характеристики для фена и паяльника для разных температур -

Фен

 

Паяльник


 

Вот такая коробочка получилась -

Дисплей что-то засвечивает...

 

Valdr
Offline
Зарегистрирован: 03.09.2015

Это та же схема, только переделал на кнопки?
Вижу кнопки: Паяльник и фен, а так же "+", "-" и применить, а скорость вентилятора фена не регулируется?
Что означает "Паяльник 4"?
Сплавом розе разве что лудить плату, но это лучше делать в кипяченной воде)) Впринципе, опустить ниже можно, может нужно будет паяльником что погреть))

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Valdr пишет:
Это та же схема, только переделал на кнопки?

Нет, всё своё - и схема и прошивка.

Цитата:
Вижу кнопки: ... а скорость вентилятора фена не регулируется?

Центральная кнопка - выбор того, что регулируем, по кольцу. Знак ">" указывает на текущий параметр.
Кнопки "больше"-"меньше" - непосредственно регулировка.
Крайние кнопки - вкл/выкл паяльника/фена.

Цитата:
Что означает "Паяльник 4"?

Типа, что он включен и что до окончания его работы осталось ещё 4 минуты. В это место выводится счётчик или индикация работы защиты. Фен на данный момент был выключен, а потому в то место ничего не выводится.

Цитата:
Сплавом розе разве что лудить плату, но это лучше делать в кипяченной воде

Когда-то давно, мы с товарищем делали ультразвуковой эхолот. Излучателем служила пластина титаната бария и, кроме как, сплавом Розе припаяться было невозможно - покрытие сторон горело.
Ну и мало ли, что-то подобное приспичит припаять, а оно раз - возможность то и имеется )))

 

Vln
Offline
Зарегистрирован: 17.12.2015

OlegK, Valdr

посмотрите сообщение №244

http://arduino.ru/forum/proekty/moya-payalnaya-stantsiya?page=4#comment-168566

помогите прикрутить реле защиты

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Vln пишет:
помогите прикрутить реле защиты

Я особо долго поможить на смогу - послу нуля часов паровоз у меня.
А вообще, в принципе, вы и сами вполне верно определили, куда вставить -
 

 if (solderTCouple > 481) {
    setSolderTemp = 0;
  }

Смысл, вкратце, такой -
1. Определяете свободную ногу, куда повесить реле.
2. Заводите глобальную логическую переменную, которая содержит срабатывание защиты и "опрокидываете" её в  лог. единицу при срабатывании. В коде проверяете - если она равна true, то отключаете выход на реле, которое, соответственно отключит нагрузку. Ну и работу разрешать только если - включен выключатель и температура не аварийная (или эту переменную проверять). А что бы само ничего не включалось, можно переменную сбрасывать в setup, т.е. что бы защиту деактивировать, нужно отключить и снова включить станцию. Ну или, как вариант - включится само, только когда остынет до определённой температуры.
Плюс можно, что бы реле дольше прослужило (не подгорали контакты) -включать его ДО начала работы, т.е. регулирования температуры, а выключать ПОСЛЕ закрытия регулирующего элемента.

Vln
Offline
Зарегистрирован: 17.12.2015

OlegK, спасибо за подсказки, будем пробовать

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Vln пишет:
OlegK, спасибо за подсказки, будем пробовать

Пробуйте, там сложного ничего нет. Через недельку приеду, подсоблю, если к тому времени не получится...

ЗЫ. Уставку защиты можно сделать "плавающую" -  заданная+30..50 град. Тогда защита не даст раскочегарить
нагреватель до предела.
 

 

pter
Offline
Зарегистрирован: 15.02.2016

OlegK выложите пожалуйста схему и скетч,если это не сектрет,заранее благодарю

gug
Offline
Зарегистрирован: 07.04.2015

Поддерживаю предыдущего оратора ))

Будьте так любезны!!!!

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

pter, gug. Создал тему, всё там.

xaos577
Offline
Зарегистрирован: 24.02.2016

Привет всем! почему неработает на атмеги8-16 одни квадратики на дисплее прошивал через ардуино уно и sinaProg

VitaliyDF
Offline
Зарегистрирован: 02.02.2016

Может контрастность?

 

VitaliyDF
Offline
Зарегистрирован: 02.02.2016

Не пользовался станцией неделю. Включил, термопара фена начала неадекватно мерять. Меряет только до 180 и очень медленно набирает температуру. Соответственно фен перегревается. Может обвязка ОУ? У меня стоят танталы на 1мкФ. Может из-за них?  

Vln
Offline
Зарегистрирован: 17.12.2015

VitaliyDF пишет:

У меня стоят танталы на 1мкФ. Может из-за них?  

Я посмотрел другие схемы и поставил на ОУ те что были - 0,15 мкф смд по входам и выходам и один по питанию, вроде нормально работает.

VitaliyDF
Offline
Зарегистрирован: 02.02.2016

Поменял конденсатор все заработало)

 

Vln
Offline
Зарегистрирован: 17.12.2015

"Подсмотрел" на Ютубе и добавил в прошивку показывать температуру фена при отключении, пока не остынет.

/*
 ПАЯЛЬНАЯ СТАНЦИЯ ver. 0.5 fen24v

 Дата создания 2015
 Автор Олег Андреев
 d-serviss@inbox.lv
 http://www.d-serviss.lv

 */

#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);  // Выходы для дисплея 1602

int pinSolderOut = 5;  // Выход для паяльника
int pinSolderIn = A4;  // Потенциометр паяльника
int pinSolderTCouple = A3;  // Термопара паяльника
int pinSolderButton = 2;  // Кнопка вкл. и выкл. паяльника

int pinHotAirOut = 6;  // Выход для фена
int pinHotAirIn = A2;  // Потенциометр фена
int pinHotAirTCouple = A1;  // Термопара фена
int pinHotAirCoolerOut = 3;  // Выход для вентилятора фена ( PWM )
int pinHotAirCoolerIn = A0;  // Потенциометр вентилятора фена
int pinHotAirButton = 4;  // Кнопка вкл.и выкл. фена
int pinRele = 7; //На управление реле(13я нога меги)

uint8_t char_cel[8] = {
  B00111, B00101, B00111, B00000, B00000, B00000, B00000
};

void setup()
{
  TCCR2B = TCCR2B & 0b11111000 | 0x02; // Частота ШИМ 11 и 3 для фена 24v
  pinMode(pinSolderOut, OUTPUT);
  pinMode(pinSolderButton, INPUT);
  pinMode(pinHotAirOut, OUTPUT);
  pinMode(pinHotAirButton, INPUT);
  pinMode(pinRele, OUTPUT);
  lcd.begin(16, 2);
  lcd.createChar(1, char_cel);

  // Вывод приветствия
  lcd.setCursor(0, 0);
  lcd.print("SOLDER STATION");
  lcd.setCursor(0, 1);
  lcd.print("ver. 0.5 fen24v");
  // задержка
  delay (750);
  lcd.clear();
}

void loop()
{
  // Преобразовываем значения
  int setSolderTemp = map(analogRead(pinSolderIn), 0, 1023, 0, 480);
  int solderTCouple = map(analogRead(pinSolderTCouple), 0, 750, 10, 490);
  int setHotAirTemp = map(analogRead(pinHotAirIn), 0, 1023, 0, 480);
  int hotAirTCouple = map(analogRead(pinHotAirTCouple), 0, 750, 10, 490);
  int setHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 130, 255);
  int displayHotAirCooler = map(analogRead(pinHotAirCoolerIn), 0, 1023, 1, 99);

  // Защита, если не работает термопара
  if (solderTCouple > 481) {
    setSolderTemp = 0;
  }
  if (hotAirTCouple > 481) {
    digitalWrite(pinRele, LOW);
	setHotAirTemp = 0;
    }
    else if (digitalRead(pinHotAirButton) == HIGH) {
      digitalWrite(pinRele, HIGH);
    }

  // Поддержка установленной температуры паяльника
  if (setSolderTemp >= solderTCouple && digitalRead(pinSolderButton) == HIGH)
  {
    digitalWrite(pinSolderOut, LOW);
    // delay(100);
    digitalWrite(pinSolderOut, HIGH);
  }
  else {
    digitalWrite(pinSolderOut, LOW);
  }

  // Поддержка установленной температуры фена
  if (setHotAirTemp >= hotAirTCouple && digitalRead(pinHotAirButton) == HIGH)
  {
    digitalWrite(pinHotAirOut, HIGH);
    delay(99);
    digitalWrite(pinHotAirOut, LOW);
  }
  else {
    digitalWrite(pinHotAirOut, LOW);
  }

  // Установка оборотов вентилятора фена
  if (hotAirTCouple < 80 && digitalRead(pinHotAirButton) == LOW) {
    analogWrite(pinHotAirCoolerOut, 0);
  }
  else {
    analogWrite(pinHotAirCoolerOut, setHotAirCooler);
  }

  // Убираем прыганье цифр
  if ((setSolderTemp + 3) > solderTCouple && (setSolderTemp - 3) < solderTCouple) {
    solderTCouple = setSolderTemp;
  }
  if ((setHotAirTemp + 7) > hotAirTCouple && (setHotAirTemp - 7) < hotAirTCouple) {
    hotAirTCouple = setHotAirTemp;
  }

  // Данные паяльника на дисплей
  lcd.clear();
  lcd.print("Solder:");
  lcd.setCursor(7, 0);
  if (digitalRead(pinSolderButton) == HIGH) {
    if (solderTCouple < 485) {
      lcd.print(setSolderTemp);
      lcd.print("\1");
      lcd.setCursor(12, 0);
      lcd.print(solderTCouple);
      lcd.print("\1");
    }
    else {
     lcd.print(" Warning!");
    }
  }
  else {
    lcd.print(" Off");
  }

  // Данные фена на дисплей
  lcd.setCursor(0, 1);
  lcd.print("Smd:");
  lcd.setCursor(4, 1);
  if (hotAirTCouple < 485) {
	 if (digitalRead(pinHotAirButton) == HIGH) {
        lcd.print(setHotAirTemp);
        lcd.print("\1");
	 }
	 else {
       lcd.print(" Off");
     }
	 if (hotAirTCouple > 74 || digitalRead(pinHotAirButton) == HIGH) {
	   lcd.setCursor(9, 1);
	   lcd.print(hotAirTCouple);
	   lcd.print("\1");
	   // Вентилятор фена на дисплей
	   lcd.setCursor(14, 1);
	   lcd.print(displayHotAirCooler);
	 }
  }
  else {
    lcd.print(" Warning!");
  }
    
  delay(99);
}

 

6441bm3
Offline
Зарегистрирован: 16.01.2016

сделайте пожалуйста скетч что б при выключении фена вентилятор выходил на максимальные обороты продувки(я в этом деле 0)

Vln
Offline
Зарегистрирован: 17.12.2015

я сам copy-paste :)

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

6441bm3 пишет:
сделайте пожалуйста скетч что б при выключении фена вентилятор выходил на максимальные обороты продувки(я в этом деле 0)

Примерно так -
 

"нужноохладить" - глобальная переменная


Если фенвключен {
        analogWrite(pinFanPwm, map(обороты, 30, 100, 80, 255)); // Выставляем заданные для работы обороты
         //и регулируем нагрев
    } else { 
        //Выключаем нагрев;
        //и охлаждаем
        if (температура >= 50 && нужноохладить) {
            analogWrite(pinFanPwm, 255); //полные обороты
        } else {
            analogWrite(pinFanPwm, 0);  //вырубаем совсем
            нужноохладить = false;
        }
    }

В итоге - при работе вентилятор имеет заданные обороты, при отключении нагреватель продувается до 50 градусов полным потоком и отключается.

6441bm3
Offline
Зарегистрирован: 16.01.2016

да, для меня это тёмный лес немогли б Вы зделать и выложить готовый скетч

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Дык, куда ещё готовее то...
Ну в моей теме (сообщение 261) полностью готовый скетч с продувкой фена.
Если ещё более "готовое" нужно, то вам в тему заказов.

Miamin
Offline
Зарегистрирован: 29.02.2016


boulen FAN = true;
if (HotAirTCouple > 70 && digitalRead(pinHotAirButton) == LOW && FAN) 
	  { 
		analogWrite(pinHotAirCoolerOut, 255);
	  } 
	  else if (HotAirTCouple <= 70 && digitalRead(pinHotAirButton) == LOW && FAN) 
			{
			  analogWrite(pinHotAirCoolerOut, 0);
			  FAN = false;
			}
	  else if (HotAirTCouple < 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
		  {
			analogWrite(pinHotAirCoolerOut, 0);
		  } 
	  else if (HotAirTCouple > 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
			{
			   FAN  = true;
			 analogWrite(pinHotAirCoolerOut, 255);         
			}
	  else    
  	  {
      		analogWrite(pinHotAirCoolerOut, setHotAirCooler);
      		FAN = true;
  		}

 

 

Miamin
Offline
Зарегистрирован: 29.02.2016

Обдув на полную как тока выключии фен, после как температура добралась до 70 выключается. При выключенном фене ,если температрура начинает расти до 90, снова включится вен на полный обдув пока не дойдет до 70.

6441bm3
Offline
Зарегистрирован: 16.01.2016

для меня это тёмный лес,я даже не представляю как это вставить(((

Miamin
Offline
Зарегистрирован: 29.02.2016

Там где прокаментировано управление феном, выделяешь и вставляешь.)))

6441bm3
Offline
Зарегистрирован: 16.01.2016

Так я и делал,выдаёт ошибку уже задолбался:-) .

Miamin
Offline
Зарегистрирован: 29.02.2016

Что за ошибка? и переменную boolean FAN обьяви в начале скетча, где описываются переменные.

6441bm3
Offline
Зарегистрирован: 16.01.2016

Ок, буду дальше пробовать

Vln
Offline
Зарегистрирован: 17.12.2015
boolean FAN = true; // вставить перед void setup()

переменная hotAirTCouple с маленькой буквы

if (hotAirTCouple > 70 && digitalRead(pinHotAirButton) == LOW && FAN)
      {analogWrite(pinHotAirCoolerOut, 255);
      }
      else if (hotAirTCouple <= 70 && digitalRead(pinHotAirButton) == LOW && FAN)
            {
              analogWrite(pinHotAirCoolerOut, 0);
              FAN = false;
            }
      else if (hotAirTCouple < 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
          {
            analogWrite(pinHotAirCoolerOut, 0);
          }
      else if (hotAirTCouple > 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
            {
               FAN  = true;
             analogWrite(pinHotAirCoolerOut, 255);        
            }
      else   
      {
            analogWrite(pinHotAirCoolerOut, setHotAirCooler);
            FAN = true;
        }

Так код работает, но инерционность нагревателя большая, тут ничего не сделашь, даже с вилкой 60-90 три раза включается

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

А зачем такие сложности? Из практики (у меня) - отключаем нагрев, "сдуваем" температуру до 50 град и отключаем обдув. После отключение обдува, температура начинает расти до ~80-90 градусов, затем остывает самостоятельно. Т.е. охлаждаем только единожды. При этом, 80-90 град - температура не критичная для фена или возникновения пожара, обжечься тоже не велик риск (остывает само достаточно шустро до безопасных 60-70 град) и "дерготни" вентилятора не происходит. Сперва я тоже сделал примерно как у вас, попроще малость, но не понравилось периодическое включение-выключение вентилятора.

Vln
Offline
Зарегистрирован: 17.12.2015

OlegK, Согласен, так действительно проще.

Только в if фенвключен нужно добавить строку нужноохладить = true; , иначе второй раз не сработает? 

boolean NeedFANcd = true;  // вставить перед void setup()

  // Установка оборотов вентилятора фена
  if (digitalRead(pinHotAirButton) == HIGH) {
    analogWrite(pinHotAirCoolerOut, setHotAirCooler);
	NeedFANcd = true;
  }
  else {
    if (hotAirTCouple >= 50 && NeedFANcd) {
            analogWrite(pinHotAirCoolerOut, 255); //полные обороты
      } 
	  else {
        analogWrite(pinHotAirCoolerOut, 0);  //выключаем
        NeedFANcd = false;
      }
  }

И, согласен, в if фенвключен  логично "засунуть" поддержку установленной температуры фена

Miamin
Offline
Зарегистрирован: 29.02.2016

Я так сделал если в друг начнет расти температура при выключенном фене для подстраховки. Всякое бывает. А пароги срабатывания температуры каждый может выбрать для себя подходящий.

Miamin
Offline
Зарегистрирован: 29.02.2016

Подскажите как подключить геркон фена? В фене общий минус гнерконаи термопары.  Как обычную кнопку с подяжкой на минус не полусчится.  Как можно?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Vln пишет:
Только в if фенвключен нужно добавить строку нужноохладить = true; , иначе второй раз не сработает?

У меня такой флаг "взводится" при включении, но если опрос включенности идёт в цикле, то туда и добавить.

Цитата:
И, согласен, в if фенвключен  логично "засунуть" поддержку установленной температуры фена

Ага, логично.

Miamin пишет:
Я так сделал если в друг начнет расти температура при выключенном фене для подстраховки. Всякое бывает.

Для этого я и добавил ещё и защитное реле - при неконтролируемом росте температуры при работе отключится и силовой элемент и реле (по защите), ну а если в отключенном состоянии, случится великое чудо и симистор пробьёт, то реле то - разомкнуто.

 

Цитата:
Подскажите как подключить геркон фена? В фене общий минус гнеркона и термопары.  Как обычную кнопку с подяжкой на минус не полусчится.  Как можно?

Подтягиваете пин к + через внешний или встроенный резистор, к пину - кнопку, второй конец кнопки - на земле.
Получаете - в отпущенном состоянии на пине лог 1, при нажатии - 0.
 

 

 

Valdr
Offline
Зарегистрирован: 03.09.2015

OlegK пишет:

Цитата:
Подскажите как подключить геркон фена? В фене общий минус гнеркона и термопары.  Как обычную кнопку с подяжкой на минус не полусчится.  Как можно?

Подтягиваете пин к + через внешний или встроенный резистор, к пину - кнопку, второй конец кнопки - на земле.
Получаете - в отпущенном состоянии на пине лог 1, при нажатии - 0.

Пока не селен в ардуино.
Я правильно понимаю: Сейчас пин через резистор на землю и кнопкой на плюс, нужно этот резюк перепаять вторым концом на +, а кнопку на землю. В коде по этой кнопке поменять местами True и False?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Valdr пишет:
Пока не сИлен в ардуино.

Схемка -

Или не ставите резистор, а используете внутренний, имеющийся в контроллере. Как сделать - читать про подтягивающие резисторы - http://arduino.ru/Tutorial/DigitalPins

Вместо кнопки у вас - геркон, снятый с подставки фен (геркон разомкнут) - на пине 1 (true), положили фен (геркон замкнут) - на пине 0 (false).

Valdr
Offline
Зарегистрирован: 03.09.2015

Вот, если на данной схеме, то должно быть так?
Геркон поставить в разрыв выключателю.
Получается если фен включен и снят, то будет работать, если не включен или на базе, то выключен. Минимальная переделка.

Хотя можно и отдельно, задействовать еще пин для геркона, чтоб когда фен включен, то все показывало на экране, но стоит снять с базы - фен включается.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Valdr пишет:

Геркон поставить в разрыв выключателю.
Получается если фен включен и снят, то будет работать, если не включен или на базе, то выключен.

Не получится - ваш фен будет работать только при включенном выключателе и лёжа на подставке (геркон - нормально разомкнутый). Снимите с подставки - вырубится.

Цитата:
Хотя можно и отдельно, задействовать еще пин для геркона

Не можно, а нужно. Только придётся добавить в код условие для геркона -
 

 если (выключатель включен и гекон разомкнут){
    греем
    } иначе {
    не греем
    }

Или меняйте геркон на нормально замкнутый, тогда с последовательно включённым выключателем фена он будет работать.

Valdr
Offline
Зарегистрирован: 03.09.2015

Да, правильно, знаю об этом, но вылетело из головы. А точнее уже думал об такой реализации только в фене геркон перепаять, чтоб он был не на массу.
Можно выключатель переключить чтоб было фен включен, когда выключатель разомкнут.
Тогда при такой переделке и в оригинальном коде менять ничего не нужно.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

А если забудете выключателем отключить, а фен, типа выключен, но на подставке - не получится его случайно смахнуть (дети, животные или сам, мало ли) и он, включившись, что-то (или сам себя) испортит/сожжёт?

Да и удобно ли пользоваться будет - положил на пару секунд взять инструмент или плату перехватить, а он уже температуру согнал?

Valdr
Offline
Зарегистрирован: 03.09.2015

Это да. Тогда нужно точно отдельно и использовать таймер, чтоб при постановке на базу не сразу отключался, но сбавить немного скорость вентилятора (соответственно МК должен уменьшить нагрев спирали, не уменьшая температуры, фен будет меньше охлаждать ее), чтоб тише работал.
В общем, код нужно допиливать, но предварительно продумать алгоритм постановки на базу.

Miamin
Offline
Зарегистрирован: 29.02.2016

2

3

4

5

 

Собрал вот такое чудо!

pter
Offline
Зарегистрирован: 15.02.2016

Miamin подскажите,что изменилось по сравнению с оригиналом от автора и выложите изменения заранее благодарю и для чего вы ввели кнопку.

Miamin
Offline
Зарегистрирован: 29.02.2016

Изменил управление феном, температура управляется по принцепу диммира  https://www.youtube.com/watch?v=-YyuncOGa1U , а все остальное как у оригинала. Плату брал https://www.drive2.ru/b/2635779/

Про какую кнопку идет речь?

pter
Offline
Зарегистрирован: 15.02.2016

Или это индикатор,что включена паяльная станция и можно выложить скетч.

Valdr
Offline
Зарегистрирован: 03.09.2015

Похоже про большую красную кнопку питания))
Лицевая панель многое пережила)))

Miamin
Offline
Зарегистрирован: 29.02.2016

Дизайн пока не прорабатывал, в будущем все будет! Скетч выложу по позже. Красная кнопка это включения станции.

Miamin
Offline
Зарегистрирован: 29.02.2016
/*
  пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ ver. 0.5.1


*/

#include <LiquidCrystal.h>
#include <CyberLib.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);  // пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ 1602

int pinSolderOut = 5;  // пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
int pinSolderPotenciom = A4;  // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
int pinSolderTermopara = A3;  // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
int pinSolderButton = 7;  // пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ. пїЅ пїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
int setSolderTemp = 0; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ (+ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ)
int ZCpin = 2;
int ZCstate = 0; 

int pinHotAirOut = 6;  // пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ
int pinHotAirIn = A2;  // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ
int pinHotAirTCouple = A1;  // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ
int pinHotAirCoolerOut = 3;  // пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ ( PWM )
int pinHotAirCoolerIn = A0;  // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ
int pinHotAirButton = 4;  // пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ.пїЅ пїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅ
int setHotAirTemp = 0; //пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅsetпїЅпїЅпїЅAirTempsetпїЅпїЅпїЅAirTemp
int solderTCouple=0;
int PwmSolderTCouple = 0;
int HotAirTCouple = 0;
int PwmHotAirTCouple = 0;
int displayHotAirCooler = 0;
int setHotAirCooler = 0;
volatile uint16_t ots = 9990;
float HAPower = 0.0;
#define Kp 1.0
#define Ki 0.005 //0.008 //0.0035
int integral = 0;

int TempACPSoldArray[6] = {30,70,210,330,460,560}; //50,100,200,300,400,480
int TempACPAirArray[6] = {80,149,312,476,630,760}; //50,100,200,300,400,480

boolean FAN = true;

unsigned long prevWorkMillis = 0;
unsigned long prevDisplayMillis = 0;
#define sKp 20




uint8_t char_cel[8] = {
  B00111, B00101, B00111, B00000, B00000, B00000, B00000
};

void setup()
{
  TCCR2B = TCCR2B & 0b11111000 | 0x05; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ 11 пїЅ 3
  TCCR0B = TCCR0B & 0b11111000 | 0x01;
  pinMode(ZCpin,INPUT_PULLUP); //Zero cross pin
 // pinMode(pinSolderOut, OUTPUT); //5
  pinMode(pinSolderButton, INPUT); //1
 // pinMode(pinHotAirOut, OUTPUT); //6
  pinMode(pinHotAirButton, INPUT); //4
  
    D5_Out; //pinSolderOut
    //D5_Low;
    D6_Out; //pinHotAir
    D6_Low;
   
  
  lcd.begin(16, 2);
  lcd.createChar(1, char_cel);  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SOLDER STATION");
  lcd.setCursor(0, 1);
  lcd.print("ver. 0.5.2");
  delay_ms(1000);
   
  attachInterrupt(0, ZC, RISING);
 }



void loop()
{
 
  int PwnSetSolderTemp = getOversampled(pinSolderPotenciom);
  int setTempMassSolder = map(PwnSetSolderTemp, 0, 1023, 0, 46);
  PwmSolderTCouple = getOversampled(pinSolderTermopara);
  //int solderTCouple = map(PwmSolderTCouple, 50, 760, 50, 480); //760
  solderTCouple = getTemp(PwmSolderTCouple,TempACPSoldArray[0],TempACPSoldArray[1],TempACPSoldArray[2],TempACPSoldArray[3],TempACPSoldArray[4],TempACPSoldArray[5]);
  int MassTempSolder[] = {200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280,
                          285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365,
                          370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430};
  setSolderTemp = MassTempSolder[setTempMassSolder];


 
  int PwmSetHotAirTemp = getOversampled(pinHotAirIn);
  int setTempMassAir = map(PwmSetHotAirTemp, 0, 1023, 0, 81);
  PwmHotAirTCouple = getOversampled(pinHotAirTCouple);
  HotAirTCouple = getTemp(PwmHotAirTCouple,TempACPAirArray[0],TempACPAirArray[1],TempACPAirArray[2],TempACPAirArray[3],TempACPAirArray[4],TempACPAirArray[5]);
  int MassTempAir[] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145,
                       150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230,
                       235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315,
                       320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400,
                       405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455};
  setHotAirTemp = MassTempAir[setTempMassAir];
  setHotAirCooler = map(getOversampled(pinHotAirCoolerIn), 0, 1023, 130, 255);
  displayHotAirCooler = map(getOversampled(pinHotAirCoolerIn), 0, 1023, 0, 99);


  if (solderTCouple > 460) { //480
    setSolderTemp = 0;
  }
  if (HotAirTCouple > 465) { //460
    setHotAirTemp = 0;
  }



 //Air(setHotAirTemp,HotAirTCouple);
 //Solder(setSolderTemp,solderTCouple);
// HA_PI();
 //AirCoole();
 //Solder(setSolderTemp,solderTCouple);
 
 if ( digitalRead(ZCpin) == HIGH)
  {ZCstate = 1; }
 else {ZCstate = 0;}
  
unsigned long currWorkMillis = millis();
    if (currWorkMillis - prevWorkMillis > 50) {
        prevWorkMillis = currWorkMillis;
        Solder(setSolderTemp,solderTCouple);
		    HA_PI();
        AirCoole();
    }


 unsigned long currDisplayMillis = millis();
    if (currDisplayMillis - prevDisplayMillis > 100)
    {
        prevDisplayMillis = currDisplayMillis;
        DispU();
    }
    
 
}

int getOversampled(int sensorPin) {      // пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
  unsigned long int res = 0;
 for (int i = 0; i < 64; i++) res += analogRead(sensorPin);
  return res >> 6; // divide result by 64.
}

//uint16_t getOversampled(uint16_t ADC_value) {
//	unsigned long int result = 0;
//	for (byte z = 0; z < 64; z++) result += ADC_value;
//	return result >> 6;
//} 

int getTemp( int PWM, int getx, int gety, int getcc, int getz, int gete,int geteb){
  if (PWM < getx) {return map(PWM,0,getx,0,50);}
  if (PWM >= getx && PWM <gety) {return map(PWM,getx,gety,50,100);}
  if (PWM >= gety && PWM <getcc) {return map(PWM,gety,getcc,100,200);}
  if (PWM >= getcc && PWM <getz) {return map(PWM,getcc,getz,200,300);}
  if (PWM >= getz && PWM <gete) {return map(PWM,getz,gete,300,400);}
  if (PWM >= gete) {return map(PWM,gete,geteb,400,480);}
}


void Solder(int setTemp,int TemCouple) {
  
if ( digitalRead(pinSolderButton) == HIGH ) 
	  {
		int err = setTemp - TemCouple;
		int TempPower = sKp * err;
		uint16_t SPower = constrain(TempPower, 0, 255);
		analogWrite(pinSolderOut, SPower);
      }
	else {analogWrite(pinSolderOut, 0);}
}

void  Air(int setAirTemp,int HotAirTemp )
{
 if (setAirTemp >= HotAirTemp && digitalRead(pinHotAirButton) == HIGH)
  {
    D6_High;
	//digitalWrite(pinHotAirOut, HIGH);
    delay_ms(120);
    //digitalWrite(pinHotAirOut, LOW);
	D6_Low;
  }
  else {
    //digitalWrite(pinHotAirOut, LOW);
	D6_Low;
  }
}




 
void DispU() 
 {
	  lcd.clear();
	  lcd.print("S:");
	  lcd.setCursor(2, 0);
	  if (digitalRead(pinSolderButton) == HIGH)
	  {
  		if (solderTCouple < 460)
    		{
    		  lcd.print(setSolderTemp);
    		  lcd.setCursor(7, 0);
    		  lcd.print(solderTCouple);
    		  lcd.setCursor(11, 0);
    		  lcd.print(PwmSolderTCouple);
    		}
  		else
    		{
    		  lcd.print("Er");
    		  lcd.setCursor(10, 0);
    		  lcd.print(PwmSolderTCouple);
    		  setSolderTemp = 0;
    		}
	  }
	  else
  	  {
    		lcd.print("Off");
    		lcd.setCursor(6, 0);
    		lcd.print(solderTCouple);
    		lcd.print("\1");
    		setSolderTemp = 0;
  	  }
//ФЕН
		  lcd.setCursor(0, 1);
		  lcd.print("A:");
		  lcd.setCursor(2, 1);
		  if (digitalRead(pinHotAirButton) == HIGH)
		  {
				if (HotAirTCouple < 465)
					{
					  lcd.print(setHotAirTemp);
					  lcd.setCursor(6, 1);
					  lcd.print(HotAirTCouple);
					  lcd.setCursor(10, 1);
					  lcd.print(ZCstate);
					  lcd.setCursor(14, 1);
					  lcd.print(displayHotAirCooler);
					  
					}
				else 
					 {
						  lcd.print("Er");
						  lcd.setCursor(7, 1);
						  lcd.print(PwmHotAirTCouple);
						  setHotAirTemp = 0;
					  }
		  }
		  else
		  {
				lcd.print("Off");
				lcd.setCursor(6, 1);
				lcd.print(HotAirTCouple);
				lcd.print("\1");
		
				lcd.setCursor(14, 1);
				lcd.print(displayHotAirCooler);
				setHotAirTemp = 0;
		   }
 
 }
 
 void AirCoole()
 {
	 if (HotAirTCouple > 70 && digitalRead(pinHotAirButton) == LOW && FAN) 
	  { 
		analogWrite(pinHotAirCoolerOut, 255);
	  } 
	  else if (HotAirTCouple <= 70 && digitalRead(pinHotAirButton) == LOW && FAN) 
			{
			  analogWrite(pinHotAirCoolerOut, 0);
			  FAN = false;
			}
	  else if (HotAirTCouple < 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
		  {
			analogWrite(pinHotAirCoolerOut, 0);
		  } 
	  else if (HotAirTCouple > 90 && digitalRead(pinHotAirButton) == LOW && FAN == false)
			{
			   FAN  = true;
			 analogWrite(pinHotAirCoolerOut, 255);         
			}
	  else    
  	  {
      		analogWrite(pinHotAirCoolerOut, setHotAirCooler);
      		FAN = true;
  		}
 
 }

 void ZC() {
    StartTimer1(HeaterOn, ots);
    RestartTimer1();
}
 
void HeaterOn() {
    if (digitalRead(pinHotAirButton) == HIGH) {
        if (HAPower > 0.0) {
            //digitalWrite(pinHotAirOut, HIGH);
            D6_High;
			      delay_us(100);
            //digitalWrite(pinHotAirOut, LOW);
			     D6_Low;
        } else {
            //digitalWrite(pinHotAirOut, LOW);
			    D6_Low;
        }
    }
    StopTimer1();
} 

    
void HA_PI() {
    int err = setHotAirTemp - HotAirTCouple;
    float TempPower = ((Kp * err) + (Ki * integral));
	if (TempPower < 100.0 && TempPower > 0.0) integral += err;
    HAPower = constrain(TempPower, 0.0, 100.0);
    CalctImpulseControl();
}

/* Calculate delay for triac */
void CalctImpulseControl() {
    ots = (uint16_t)(acos(HAPower / 50.0 - 1.0 ) * 9900.0 / pi);
}

 

Miamin
Offline
Зарегистрирован: 29.02.2016

Мой скетч, на плате изменил дорожку,кнопки включения паяльника с 2 порта(4 нога) на цифрофой порт 7 (нога 13). На 4 ногу атмеги пориходит сигнал внешнего прерывания, детекции нуля сетевого наприжения с платы димира http://arduinolab.pw/index.php/2015/12/01/setevoj-dimmer-upravlyaemyj-arduino/

Код шим паяльника и управления фена использовал  из соседней ветки http://arduino.ru/forum/proekty/ocherednaya-payalnaya-stantsiya