Бутерброд для ЛУТ или ЛУТ без утюга на Arduino

TarLink
Offline
Зарегистрирован: 18.02.2016

Приветствую форумчане ! В этой сфере я новичек , ардуино в руке держу пару дней и за это время успел потестить часы , барометр и прочую мелочь - радуюсь как ребенок ) Так вот задумал я сотворить устройство на ардуино: диммер + термопара + тэн , хочется задавать температуру самому и чтоб по достижению выставленной температуры звучал сигнал и устройство отключалось. Хочу это все приспособить для ЛУТ , то есть ЛУТ без утюга. Будет что-то типо бутерброда в который будет закладываться текстолит с тонером ... В данный момент имею UNO , на днях должна приехать NANO , примерно "нарисовал" как я это вижу . Хочу знать это возможно ? Слишком это сложно в плане написания кода ? Вот картинка коммутации , посмотрите пожалуйста что не так ?! Помогите по возможности добавить управление с кнопок ! 

p.s. то что я художник от Бога можете не упомянать , я в курсе )))

Диммер уже собран , осталось только воткнуть MOC 3052 , операционник собран и проверен ! По всей сети перерыл кучу информации и собрал вот такую часть кода , LCD прописал в код сам , пока мало понимаю что к чему , но на экране температуру с термопары уже отображает :

#include <LCD_1602_RUS.h> 
// Задаем адрес LCD экрана 0x27, 16 символов, 2 строки 
LCD_1602_RUS lcd(0x27, 16, 2); 
int incomingByte = 0; // for incoming serial data 
int AC_LOAD = 3; // Output to Opto Triac pin 
volatile int dimming = 117; // Dimming level (0-128) 0 = ON, 128 = OFF 
int temp_PIN=0; // Порт датчика температуры 

void setup() 
{ 
lcd.init(); // Инициализируем экран 
// Включаем подсветку экрана 
lcd.backlight(); 
pinMode(AC_LOAD, OUTPUT); // Set the AC Load as output 
attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above 
Serial.begin(9600); 
} 

void zero_crosss_int() // function to be fired at the zero crossing to dim the light 
{ 
// Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle) 
// (10000us - 10us) / 128 = 75 (Approx) 
int dimtime = (75*dimming); 
delayMicroseconds(dimtime); // Off cycle 
digitalWrite(AC_LOAD, HIGH); // triac firing 
delayMicroseconds(10); // triac On propogation delay 
digitalWrite(AC_LOAD, LOW); // triac Off 
} 

void loop() 
{ 
/* 
Управления с клавиатуры 
if (Serial.available() > 0) { 
// read the incoming byte: 

int x=map(Serial.read(),49,57,128,10); 
if(x>9&&x<129) 
dimming= x; 
} 
*/ 


// Управления термопарой 
int temp = map(analogRead(temp_PIN),0,40,10,116); 
if(temp>9&&temp<117) 
dimming=temp; 
Serial.println(analogRead(temp_PIN)); 
// Данные паяльника на дисплей 
lcd.print(L"TEMПEPATУPA:"); 
lcd.setCursor(12, 0); 
lcd.print(analogRead(temp_PIN)); 
lcd.print("\C "); // Символ после температуры 
lcd.setCursor(0, 0); 
delay(100); 


/* Управление в цикле 
for (int i = 2; i <= 117; i++){ 
dimming = i; 
delay(20); 
} 

for (int i = 117; i >= 2; i--){ 
dimming = i; 
delay(20); 
} 
*/ 

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

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

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

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

Это уже другой вопрос , в сети есть несколько подобных конструкций где используется пористая резина или что-то еще подобное , но меня больше интересует в данный момент именно электронная часть и программная ! 

bwn
Offline
Зарегистрирован: 25.08.2014

Если код брали копипастом, а не осмысленно, то найдите библиотеку CiberLib, там очень корректно прописана работа с таким диммером. Ну и корректность схемы и показаний с операционника проверять. А остальное в общем то уже мелочи.

TarLink
Offline
Зарегистрирован: 18.02.2016

На данный момент мне хотя бы запустить один диммер с лампочкой в качестве нагрузки , я не могу понять как сделать управление кнопками "Прибавить" и "Убавить" яркость лампочки. Термопара с ОУ проверена , все работает (предварительно калибровал изменением сопротивления на ОУ) и на ЖК отображает. Теперь хочется отдельно поуправлять диммером. После чего потихоньку все собирать в единое целое ... 

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

найдите библиотеку CiberLib, там очень корректно прописана работа с таким диммером.

Спасибо за совет , обязательно посмотрю !

bwn
Offline
Зарегистрирован: 25.08.2014

For (i = 0; i<=255; i++) {

delay(200);
Здесь скармливаем диммеру значение i

}
Аналогично в обратную сторону. Алгоритмы по кнопкам почитайте здесь.
 

TarLink
Offline
Зарегистрирован: 18.02.2016

Пойду поизучаю Ваши советы. Ребят если есть еще у кого что-то добавить , буду признателен ! Может кто-то сможет наглядно показать кусочек кода , тоже будет не плохо , на разборе других скетчей тоже разбираться получается ! 

axill
Offline
Зарегистрирован: 05.09.2011

R3/R4 я использую 51кОМ

бутерброд звучит хорошо, но каким образом будет сам перенос осуществляться? просто нагреть мало, надо или придавить или прикатать

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

bwn
Offline
Зарегистрирован: 25.08.2014

axill пишет:

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

Было где то на Ютубе, с фольги в кипятке, через резину. Но как то скепсис вызывает в получении равномерности по всей площади плиты. ТС сказал, этого он не боится.))))

TarLink
Offline
Зарегистрирован: 18.02.2016

axill пишет:

бутерброд звучит хорошо, но каким образом будет сам перенос осуществляться? просто нагреть мало, надо или придавить или прикатать

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

Это выглядит примерно так: http://oldoctober.com/ru/thermal_transfer/ , https://geektimes.ru/post/255370/ , http://ru-radio-electr.livejournal.com/811770.html?thread=14082810

bwn
Offline
Зарегистрирован: 25.08.2014

TarLink пишет:

Пойду поизучаю Ваши советы. Ребят если есть еще у кого что-то добавить , буду признателен ! Может кто-то сможет наглядно показать кусочек кода , тоже будет не плохо , на разборе других скетчей тоже разбираться получается ! 

Лучше начинайте делать сами и сюда выкладывать. И будете понимать, что происходит, и подправят, если потребуется. Только ради Аллаха, Будды, Кришны и прочего пантеона, не пихайте все в loop, а функциями, функциями. И отлаживать и что то изменять легче.))))

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

Только ради Аллаха, Будды, Кришны и прочего пантеона, не пихайте все в loop , а функциями, функциями. И отлаживать и что то изменять легче.))))

Тоже люблю хороший юмор , но пока Ваши слова заскочили в мои уши как жесткая брань , ибо я слабо пока понимаю термины "loop" и прочее ))) Надеюсь это временно ! 

bwn
Offline
Зарегистрирован: 25.08.2014

Функция - аналог подпрограммы в Бейсике, Фортране и т.п. Код разбитый на небольшие самодостаточные блоки (функции-подпрограммы) намного проще в отладке. Добились работы получения температуры в функции и можно к ней больше не возвращаться, т.к. знаем, что полученный из нее результат корректен. И так по всей программе.

axill
Offline
Зарегистрирован: 05.09.2011

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

кстати в чем преимущество перед ламинатором?

TarLink
Offline
Зарегистрирован: 18.02.2016

axill пишет:

кстати в чем преимущество перед ламинатором?

Не знаю , я не пользвался ламинатором , я делал утюгом и часто получал брак. А вообще никаких веских причин нет , просто мне хочется попрбовать и все. Люди вон вообще на газу греют http://ru-radio-electr.livejournal.com/811770.html?thread=14082810 , а вы говорите дюраль )))

axill
Offline
Зарегистрирован: 05.09.2011

выбор ваш. я все не пробовал, я сразу купил ламинатор, потом его переделал (сделал свой контроллер с автоматическим протягиванием). Меня все устраивает. И пользоваться явно проще, чем этим прессом. Но может я что то не понимаю насчет преимуществ...

std
Offline
Зарегистрирован: 05.01.2012

TarLink пишет:
делал утюгом и часто получал брак

Можно не прикатывать а просто придавить резиновой прокладкой, есть способ simpletronic: смешать ацетон и спирт в пропорции примерно 3:8. Мажется на отпечаток, кладётся на чистую плату, через 15 секунд придавливается на 40-60 секунд, потом 2 минуты лежит в покое. Прокладку при этом надо снять, чтобы раствор испарился. Сдирается обычным способом.

TarLink
Offline
Зарегистрирован: 18.02.2016

std пишет:

Можно не прикатывать а просто придавить резиновой прокладкой, есть способ simpletronic: смешать ацетон и спирт в пропорции примерно 3:8. Мажется на отпечаток, кладётся на чистую плату, через 15 секунд придавливается на 40-60 секунд, потом 2 минуты лежит в покое. Прокладку при этом надо снять, чтобы раствор испарился. Сдирается обычным способом.

Да спасибо , я знаю этот способ , сам не пробовал но впечатляет !  Так называемый "Холодный ЛУТ" ...

TarLink
Offline
Зарегистрирован: 18.02.2016

В общем запустил диммер без кнопок , пока задал в цикле вот это :

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);
}

Работает , а это главное , пошел читать и изучать дальше ! 

bwn
Offline
Зарегистрирован: 25.08.2014

TarLink пишет:

В общем запустил диммер без кнопок , пока задал в цикле вот это :

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);
}

Работает , а это главное , пошел читать и изучать дальше ! 

Ну а for мой чем не ко двору пришелся? ((((

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

Ну а for мой чем не ко двору пришелся? ((((

Просто взял без всяких дисплеев и кнопок проверил чисто работу диммера с лампочкой в нагрузке и все. Для начала нужно понять каждый кусок кода , а потом уже его объеденять , поэтому и пошел по такому пути , а полный скетч чисто для диммера вот:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);	      // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

На for-е более понятна будет плавность. Я на киберлибе их гоняю, но там отслеживают и фронт и спад, насколько плавный ваш алгоритм, неизвестно.

TarLink
Offline
Зарегистрирован: 18.02.2016

Вот таким вышел диммер :

TarLink
Offline
Зарегистрирован: 18.02.2016

И вот таким ОУ для термопары :

bwn
Offline
Зарегистрирован: 25.08.2014

Вы таки какую мощу им гонять собрались? Вроде киловатты для этой задачи не требуются.

bwn
Offline
Зарегистрирован: 25.08.2014

А вот ОУ в колодке, думаю лишнее. ИМХО.

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

Вы таки какую мощу им гонять собрались? Вроде киловатты для этой задачи не требуются.

Пока это неизвестно , время и опыты покажут ! 

bwn
Offline
Зарегистрирован: 25.08.2014

В принципе BTшки в ТО-220 полкиловатта и так тянут спокойно.

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

В принципе BTшки в ТО-220 полкиловатта и так тянут спокойно.

Я так - то сюда изначально пришел за помощью по коду и так сказать делам ардуинским , а даташиты и тех. характеристики я читал по железкам ))) 

axill
Offline
Зарегистрирован: 05.09.2011

TarLink пишет:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);	      // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

delay из тела обработчика прерываний нужно убирать и переделывать логику на два обработчика - один по пину, второе по таймеру. Проще всего наверно библиотеку  прикрутить http://playground.arduino.cc/Main/MsTimer2

TarLink
Offline
Зарегистрирован: 18.02.2016


axill пишет:

delay из тела обработчика прерываний нужно убирать и переделывать логику на два обработчика - один по пину, второе по таймеру. Проще всего наверно библиотеку  прикрутить http://playground.arduino.cc/Main/MsTimer2

К сожалению мне пока мало что об этом говорит , я нашел на зарубежном источнике случайно статью , так вот так имеется типо такого же диммера , скетч там выглядит вот так :


#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/
#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m3 (22.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds for 50Hz (change the value in 65 for 60Hz)

 
void setup() {  // Begin setup
  Serial.begin(9600);   
  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

void zero_cross_detect() {    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}                                 

// Turn on the TRIAC at the appropriate time
void dim_check() {                   
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH);  // turn on light       
      i=0;  // reset time step counter                         
      zero_cross=false;    // reset zero cross detection
    } 
    else {
      i++;  // increment time step counter                     
    }                                
  }    
}                                      

void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
  
 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128;
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    
           

  dim2 = 255-2*dim;
  if (dim2<0)
  {
    dim2 = 0;
  }

  Serial.print("dim=");
  Serial.print(dim);

  Serial.print("     dim2=");
  Serial.print(dim2);
  Serial.print("     dim1=");
  Serial.print(2*dim);
  Serial.print('\n');
  delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100-100*(255-dim2)/255);
 lcd.print("%    "); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("dim. level="); // print a text
 lcd.print(dim);
 lcd.print("  "); // print a text
}

Думаю это примерно то о чем Вы говорили ?! 

axill
Offline
Зарегистрирован: 05.09.2011

вполне нормальный вариант который вы нашли

просто если использовать delay внутри обработчика прерываний то по мере увеличения размера скетча вы можете попасть в ситуацию когда сначала перестанет работать код внутри loop (будет непрерывное срабатывание прерываний), а потом и прерывания не будут вовремя срабатывать

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

TarLink
Offline
Зарегистрирован: 18.02.2016

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

p.s. и если будете обращаться на ТЫ , мне будет комфортнее )

TarLink
Offline
Зарегистрирован: 18.02.2016

axill пишет:

вполне нормальный вариант который вы нашли

Только сейчас увидел что этот скетч мне не подойдет , он написан под диммер в котором оптосимистор с контролем нуля или как там его "ZeroCross" , а у меня без этого самого "ZeroCross". Замкнутый круг ) 

TarLink
Offline
Зарегистрирован: 18.02.2016

Вот тут эта статья   , а там и схема и скетч , возможно этот скетч переделать под мой диммер без "ZeroCross" ? 

bwn
Offline
Зарегистрирован: 25.08.2014

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

axill
Offline
Зарегистрирован: 05.09.2011

TarLink пишет:

Только сейчас увидел что этот скетч мне не подойдет , он написан под диммер в котором оптосимистор с контролем нуля или как там его "ZeroCross" , а у меня без этого самого "ZeroCross". Замкнутый круг ) 

где вы такое увидели? Там в коде явно указывается на определение момента открытия симистора, а это уже значит, что там оптосимистор без детектора нуля. Кстати при наличии хоть какой-то тепловой инерции вместо фазо импульсного регулирования можно применять пропуск полупериодов. В этом случае без разницы есть датчик нуля или нет

TarLink
Offline
Зарегистрирован: 18.02.2016

bwn пишет:

Кстати, попытался соотнести вашу схему с вашей хотелкой. Так вы собираетесь управлять этим куском фольги напрямую или все таки через разделительный трансформатор?

Какой еще фольги ? Ссылки те что я дал это обычный пример , никакой фольгой я управлять не собираюсь. Вот видео где человек именно такой схемой управляет лампой около 1.5 киловатта спокойно. У него это ИК паяльная станция на нескольких таких лампах как видно из видео и работает у него это именно так как мне нужно. Вы меня тут расцениваете как специалиста мне кажется , а я зашел и сам объявил статус новичка в этом деле. В любом случае спасибо вам за попытки помочь ! А я тем временем ушел учить матчасть и надоедать вам больше не буду ! 

TarLink
Offline
Зарегистрирован: 18.02.2016

axill пишет:

Там в коде явно указывается на определение момента открытия симистора, а это уже значит, что там оптосимистор без детектора нуля. Кстати при наличии хоть какой-то тепловой инерции вместо фазо импульсного регулирования можно применять пропуск полупериодов. В этом случае без разницы есть датчик нуля или нет

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

TarLink
Offline
Зарегистрирован: 18.02.2016

Воспользовался пока этим скетчем , для первоначального как основа вполне подходит , проверил все работает. Тем времени всем спасибо , задача выполнена . Тонкости добью ! 



#include <LCD_1602_RUS.h>
#include <TimerOne.h>           

volatile int i=0;               // Переменная используется в роли счетчика
volatile boolean zero_cross=0;  // Детектор нуля
int temp_PIN= A0;               // Порт датчика температуры
int AC_pin = 3;                 // Выход на оптосимистр 
int buton1 = 4;                 // Кнопка на пине 4
int buton2 = 5;                 // Кнопка на пине 5
int dim2 = 0;                   // Светодиодный контроль
int dim = 128;                  // Уровень диммирования (0-128)  0 = Включен, 128 = Выключен
int pas = 8;                    // Шаг подсчета;
int freqStep = 75;              // Шаг задержки яркости в микросекундах для 50Hz ( изменить значение на 65 для 60Hz сети )


// Основные установки:

void setup() {  
  Serial.begin(9600);   
  pinMode(buton1, INPUT);                           // Режим пина кнопки 1
  pinMode(buton2, INPUT);                           // Режим пина кнопки 2
  pinMode(AC_pin, OUTPUT);                          // Режим пина с оптосимистром
  attachInterrupt(0, zero_cross_detect, RISING);    // Режим прерывания пина 2 (прерывание 0) для обнаружения пересечения нуля
  Timer1.initialize(freqStep);                      // Инициализации библиотеки "TimerOne"
  Timer1.attachInterrupt(dim_check, freqStep);      // Использование библиотеки TimerOne для прерывания
  
// Приветстивие:

 LCD_1602_RUS lcd(0x27, 16, 2);                     // Задаем адрес LCD экрана 0x27, 16 символов, 2 строки 
 lcd.init();                                        // Инициализируем экран
 lcd.backlight();                                   // Включаем подсветку экрана
 lcd.clear();                                       // Очищаем экран
 lcd.setCursor(2, 0);                               // Устанавливаем позицию начиная с которой выводится текст 
 lcd.print(L"ЗДPABCTBУЙTE");                        // Выводим текст на экран
 delay (3000);                                      // Задержка 3 секунды
 lcd.clear();                                       // Выводим текст на экран 
 lcd.setCursor(0, 1);                               // Устанавливаем позицию начиная с которой выводится текст 
 lcd.print(L" BHИMAHИE 220V");                      // Выводим текст на экран
 delay (3000);                                      // Задержка 3 секунды
 lcd.clear();                                       // Очищаем экран
}
void zero_cross_detect() {    
  zero_cross = true;                                // Оповещение о том что произошло пересечение нуля
  i=0;
  digitalWrite(AC_pin, LOW);
}                                 


// Включение симистра в определенное время:
 
void dim_check() {                   
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH);                  // Включение диммера       
      i=0;                                         // Сбрасываем время счетчика                          
      zero_cross=false;                            // Сброс обнаружение нуля
    } 
    else {
      i++;                                         // Счетчик времени и шага                     
    }                                
  }    
}                                      

void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
  
 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128;
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10);                                       // Небольшое ожидание...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10);                                       // Небольшое ожидание...    
           

  dim2 = 255-2*dim;
  if (dim2<0)
  {
    dim2 = 0;
  }

  Serial.print("dim=");
  Serial.print(dim);

  Serial.print("     dim2=");
  Serial.print(dim2);
  Serial.print("     dim1=");
  Serial.print(2*dim);
  Serial.print('\n');
  delay (100);
 LCD_1602_RUS lcd(0x27, 16, 2);                     // Задаем адрес LCD экрана 0x27, 16 символов, 2 строки
 lcd.backlight();                                   // Включаем подсветку экрана 
 Serial.println(analogRead(temp_PIN));              // Данные с пина A0
 lcd.setCursor(0, 0);        
 lcd.print(L"TEMПEPATУPA:");                        // Выводим текст на экран
  lcd.print(analogRead(temp_PIN));                  // Данные с пина A0
  lcd.print("\C  ");                                // Символ после температуры
  lcd.setCursor(0, 1);                              // Выводим текст на экран    
  lcd.print(L"MOЩHOCTЬ:");                          // Выводим текст на экран
  lcd.print(100-100*(255-dim2)/255);                // Символ после мощности
  lcd.print("%    "); 
  delay(100);

}

 

Gora123
Offline
Зарегистрирован: 20.07.2017

Уважаемый TarLink, подскажи плиз, твой проект работает, доработки были или все исправно по последнему коду? Мне нужна примерно такая же схема, только заместо утюга планирую подключить стеклокерамическую плиту (1 элемент).. потянет?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

:)