Бутерброд для ЛУТ или ЛУТ без утюга на Arduino
- Войдите на сайт для отправки комментариев
Приветствую форумчане ! В этой сфере я новичек , ардуино в руке держу пару дней и за это время успел потестить часы , барометр и прочую мелочь - радуюсь как ребенок ) Так вот задумал я сотворить устройство на ардуино: диммер + термопара + тэн , хочется задавать температуру самому и чтоб по достижению выставленной температуры звучал сигнал и устройство отключалось. Хочу это все приспособить для ЛУТ , то есть ЛУТ без утюга. Будет что-то типо бутерброда в который будет закладываться текстолит с тонером ... В данный момент имею 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);
}
*/
}

Возможно то оно, возможно. А как будете обеспечивать плотность прилегания тонера к плате?
Возможно то оно, возможно. А как будете обеспечивать плотность прилегания тонера к плате?
Если код брали копипастом, а не осмысленно, то найдите библиотеку CiberLib, там очень корректно прописана работа с таким диммером. Ну и корректность схемы и показаний с операционника проверять. А остальное в общем то уже мелочи.
На данный момент мне хотя бы запустить один диммер с лампочкой в качестве нагрузки , я не могу понять как сделать управление кнопками "Прибавить" и "Убавить" яркость лампочки. Термопара с ОУ проверена , все работает (предварительно калибровал изменением сопротивления на ОУ) и на ЖК отображает. Теперь хочется отдельно поуправлять диммером. После чего потихоньку все собирать в единое целое ...
найдите библиотеку CiberLib, там очень корректно прописана работа с таким диммером.
For (i = 0; i<=255; i++) {
delay(200);
Здесь скармливаем диммеру значение i
}
Аналогично в обратную сторону. Алгоритмы по кнопкам почитайте здесь.
Пойду поизучаю Ваши советы. Ребят если есть еще у кого что-то добавить , буду признателен ! Может кто-то сможет наглядно показать кусочек кода , тоже будет не плохо , на разборе других скетчей тоже разбираться получается !
R3/R4 я использую 51кОМ
бутерброд звучит хорошо, но каким образом будет сам перенос осуществляться? просто нагреть мало, надо или придавить или прикатать
обычно прикатывают или утюгом или ламинатором, это позволяет легко добиться равномерного прижима. А вот в вариенте придавить, то есть пресс нужна будет жесткость верха и низа бутерброда и какой-то механизм управляемого прижима - технически все это сложнее прикатывания
обычно прикатывают или утюгом или ламинатором, это позволяет легко добиться равномерного прижима. А вот в вариенте придавить, то есть пресс нужна будет жесткость верха и низа бутерброда и какой-то механизм управляемого прижима - технически все это сложнее прикатывания
Было где то на Ютубе, с фольги в кипятке, через резину. Но как то скепсис вызывает в получении равномерности по всей площади плиты. ТС сказал, этого он не боится.))))
бутерброд звучит хорошо, но каким образом будет сам перенос осуществляться? просто нагреть мало, надо или придавить или прикатать
обычно прикатывают или утюгом или ламинатором, это позволяет легко добиться равномерного прижима. А вот в вариенте придавить, то есть пресс нужна будет жесткость верха и низа бутерброда и какой-то механизм управляемого прижима - технически все это сложнее прикатывания
Пойду поизучаю Ваши советы. Ребят если есть еще у кого что-то добавить , буду признателен ! Может кто-то сможет наглядно показать кусочек кода , тоже будет не плохо , на разборе других скетчей тоже разбираться получается !
Лучше начинайте делать сами и сюда выкладывать. И будете понимать, что происходит, и подправят, если потребуется. Только ради Аллаха, Будды, Кришны и прочего пантеона, не пихайте все в loop, а функциями, функциями. И отлаживать и что то изменять легче.))))
Только ради Аллаха, Будды, Кришны и прочего пантеона, не пихайте все в loop , а функциями, функциями. И отлаживать и что то изменять легче.))))
Функция - аналог подпрограммы в Бейсике, Фортране и т.п. Код разбитый на небольшие самодостаточные блоки (функции-подпрограммы) намного проще в отладке. Добились работы получения температуры в функции и можно к ней больше не возвращаться, т.к. знаем, что полученный из нее результат корректен. И так по всей программе.
понятно. судя по ссылкам равномерность прижима решается двумя вещами - минимальными размерами девайса (что означает ограничение по размеру плат) и применение толстых дюралевых листов. Имел опыт приобретения толстого дюраля, он нынче стоит столько...)) проще ламинатор купить
кстати в чем преимущество перед ламинатором?
кстати в чем преимущество перед ламинатором?
выбор ваш. я все не пробовал, я сразу купил ламинатор, потом его переделал (сделал свой контроллер с автоматическим протягиванием). Меня все устраивает. И пользоваться явно проще, чем этим прессом. Но может я что то не понимаю насчет преимуществ...
Можно не прикатывать а просто придавить резиновой прокладкой, есть способ simpletronic: смешать ацетон и спирт в пропорции примерно 3:8. Мажется на отпечаток, кладётся на чистую плату, через 15 секунд придавливается на 40-60 секунд, потом 2 минуты лежит в покое. Прокладку при этом надо снять, чтобы раствор испарился. Сдирается обычным способом.
Можно не прикатывать а просто придавить резиновой прокладкой, есть способ simpletronic: смешать ацетон и спирт в пропорции примерно 3:8. Мажется на отпечаток, кладётся на чистую плату, через 15 секунд придавливается на 40-60 секунд, потом 2 минуты лежит в покое. Прокладку при этом надо снять, чтобы раствор испарился. Сдирается обычным способом.
В общем запустил диммер без кнопок , пока задал в цикле вот это :
void loop() { dimming = 128; delay(100); dimming = 75; delay(100); dimming = 25; delay(100); }Работает , а это главное , пошел читать и изучать дальше !
В общем запустил диммер без кнопок , пока задал в цикле вот это :
void loop() { dimming = 128; delay(100); dimming = 75; delay(100); dimming = 25; delay(100); }Работает , а это главное , пошел читать и изучать дальше !
Ну а for мой чем не ко двору пришелся? ((((
Ну а 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); }На for-е более понятна будет плавность. Я на киберлибе их гоняю, но там отслеживают и фронт и спад, насколько плавный ваш алгоритм, неизвестно.
Вот таким вышел диммер :
И вот таким ОУ для термопары :
Вы таки какую мощу им гонять собрались? Вроде киловатты для этой задачи не требуются.
А вот ОУ в колодке, думаю лишнее. ИМХО.
Вы таки какую мощу им гонять собрались? Вроде киловатты для этой задачи не требуются.
В принципе BTшки в ТО-220 полкиловатта и так тянут спокойно.
В принципе BTшки в ТО-220 полкиловатта и так тянут спокойно.
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
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 }Думаю это примерно то о чем Вы говорили ?!
вполне нормальный вариант который вы нашли
просто если использовать delay внутри обработчика прерываний то по мере увеличения размера скетча вы можете попасть в ситуацию когда сначала перестанет работать код внутри loop (будет непрерывное срабатывание прерываний), а потом и прерывания не будут вовремя срабатывать
в общем хорошая практика это когда обработчик прерываний делает свою работу максимально быстро, если нужно сделать что-то длительное, то в рбработчике выставляется переменная-флаг и само действие делается уже в loop
Спасибо , я постараюсь это учесть. Нужно больше об этом читать , практика это хорошо , но без теории никуда. Сейчас потыкаюсь , нужно вникнуть. Спасибо еще раз !
p.s. и если будете обращаться на ТЫ , мне будет комфортнее )
вполне нормальный вариант который вы нашли
Вот тут эта статья , а там и схема и скетч , возможно этот скетч переделать под мой диммер без "ZeroCross" ?
Неужели так трудно было либу и описание найти? В первом схема, потом по ссылке на многоканальный, там либа и код.
Кстати, попытался соотнести вашу схему с вашей хотелкой. Так вы собираетесь управлять этим куском фольги напрямую или все таки через разделительный трансформатор?
Только сейчас увидел что этот скетч мне не подойдет , он написан под диммер в котором оптосимистор с контролем нуля или как там его "ZeroCross" , а у меня без этого самого "ZeroCross". Замкнутый круг )
где вы такое увидели? Там в коде явно указывается на определение момента открытия симистора, а это уже значит, что там оптосимистор без детектора нуля. Кстати при наличии хоть какой-то тепловой инерции вместо фазо импульсного регулирования можно применять пропуск полупериодов. В этом случае без разницы есть датчик нуля или нет
Кстати, попытался соотнести вашу схему с вашей хотелкой. Так вы собираетесь управлять этим куском фольги напрямую или все таки через разделительный трансформатор?
Там в коде явно указывается на определение момента открытия симистора, а это уже значит, что там оптосимистор без детектора нуля. Кстати при наличии хоть какой-то тепловой инерции вместо фазо импульсного регулирования можно применять пропуск полупериодов. В этом случае без разницы есть датчик нуля или нет
Воспользовался пока этим скетчем , для первоначального как основа вполне подходит , проверил все работает. Тем времени всем спасибо , задача выполнена . Тонкости добью !
#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); }Уважаемый TarLink, подскажи плиз, твой проект работает, доработки были или все исправно по последнему коду? Мне нужна примерно такая же схема, только заместо утюга планирую подключить стеклокерамическую плиту (1 элемент).. потянет?
:)