Здравствуйте, имеется ручка фена. Что нужно ещё что бы она заработала? Наворотов особых не нужно -вкл / выкл, регулировка темп.
Вложение 19322
Вид для печати
Здравствуйте, имеется ручка фена. Что нужно ещё что бы она заработала? Наворотов особых не нужно -вкл / выкл, регулировка темп.
Вложение 19322
Судя по внешнему виду это фен от паяльной станции Lukey 702
В этом фене есть все кроме управляющей логики.
нагреватель, вентилятор, датчик температуры, возможно что и датчик оборотов вентилятора
Нужно позванивать и прикидывать где что и каким напряжением запитывать.
Самое низкое сопротивление должно быть у нагревательной спирали, потом кулер
А вот что установлено на датчике температуры нужно смотреть или знать, возможно термопара или терморезистор
Я пока ещё не заказывал, но по описанию там термопара. Датчика оборотов нет. Почитал про паяльные станции своими руками - но там всего так много, а мне бы попроще чего - потенциометр, кнопочка да и всё : )
Есть ссылка на характеристики фена?
Судя по отзывам с Алиэкспресс , на нагреватель больше 120в нельзя подавать. Турбина на 24В или 12В, нужно написать продавцу какую именно нужно.
Термопара стандартная
Вложение 19323
Теперь уже и не знаю чего брать : ) Готовую станцию не охота - дороговато
На нагреватель все равно нужен диммер, им можно отрегулировать нужное напряжение
Можно собрать диммер с переменным резистором и ограничить его пределы постоянным сопротивлением
На схеме резистор 10к нужно увеличить до тех пор, пока напряжение на выходе не будет 120 В
У меня вот такой диммер есть. Пойдёт?
Подойдет, только ограничительный резистор подобрать нужно будет
А диммер у меня в купе с вольтметром, видно будет сколько подаётся.
Если под нагрузкой то будет видно
Возьми паяльник, диммер, вольтметр и проверь.
Если нет паяльника, тот спиральная лампочка подойдет
Я уже проверял - видно.
http://sampawno.ru/download/file.php...BC+220+V+1.JPG
Ну вот, одним вопросом меньше.
Теперь нужно понять какой кулер барть на 12 или 24В?
Думаю на 24, так как есть такой свободный (без дела лежит) БП.
Вложение 19327
Вот только как организовать регулировку оборотов через ардуинку.
Хотя есть и на 12 вольт, но думаю ещё пригодится для светодиодной ленты (ползёт из Китая)
Вложение 19326
Можно собрать или купить на алиэкспрессе понижающий стабиллизатор с регулировкой напряжения
У меня вот такой есть. А зачем его понижать?
Чем меньше напряжение на вентиляторе, тем меньше его мощность и как следствие падение оборотов
если через Ардуину регулировать обороты, то тогда понадобится ключ на MOSFET
Его можно выпаять со старой материнки
Chip, спасибо за терпение и ответы на мои вопросы. MOSFET модуль у меня тоже есть. Оказалось для фена у меня почти всё есть : ) Осталось дождаться ручки, и начать сборку. Эту решил брать.
Поэкспериментировав кулером от компа и MOSFET, заметил что моторчик пищит на всех значениях кроме 255
Нашёл решение. Окольными путями, как оказалось, вернулся сюда же.PHP код:
int motorPin = 11;
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop(){
analogWrite(motorPin, 105);
delay(1500);
analogWrite(motorPin, 125);
delay(1500);
analogWrite(motorPin, 145);
delay(1500);
analogWrite(motorPin, 165);
delay(1500);
analogWrite(motorPin, 185);
delay(1500);
analogWrite(motorPin, 205);
delay(1500);
analogWrite(motorPin, 225);
delay(1500);
analogWrite(motorPin, 245);
delay(1500);
analogWrite(motorPin, 255);
delay(5000);
analogWrite(motorPin, 0);
delay(10000);
}
Прикрутил энкодер - пока всё работает нормально. Вот как бы теперь на него же сделать регулировку нагревателя.PHP код:
TCCR2B = TCCR2B & 0b11111000 | 7;
Только что то типа дребезга, при однократном щелчке / повороте в COM порту иногда проскакивает не та стрелка <<< и почему то 2 разаPHP код:
#include <Encoder.h>
#define PIN_ENCODER_CLK 8
#define PIN_ENCODER_DT 9
#define PIN_ENCODER_SW 10
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int motorPin = 11;
int motorSpeed = 75; // Изначальная скорость двигателя
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
Serial.begin(9600);
TCCR2B = TCCR2B & 0b11111000 | 7; // Устанавливаем частоту 30,5 Герц
pinMode(motorPin, OUTPUT);
}
void loop(){
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed += 5; // Прибавляем скорость
Serial.println(">>>");
if ( motorSpeed > 255 )
motorSpeed = 255;
}
else
if (newPosition < oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed -= 5; // Убавляем скорость
Serial.println("<<<");
if ( motorSpeed < 75 )
motorSpeed = 75;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( motorPin, motorSpeed );
}
}
Вложение 19328
По отдельности скетчи работают нормально. Первый крутит вентилятор, второй регулирует накал лампочки. Но при попытке их объединить - лампочка мерцает.
Первый
ВторойPHP код:
#include <Encoder.h>
#define PIN_ENCODER_CLK 5
#define PIN_ENCODER_DT 6
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int motorPin = 3;
int motorSpeed = 75; // Изначальная скорость двигателя
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
TCCR2B = TCCR2B & 0b11111000 | 7;
Serial.begin(9600);
pinMode(motorPin, OUTPUT);
}
void loop(){
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed += 5; // Прибавляем скорость
Serial.println(">>>");
if ( motorSpeed > 255 )
motorSpeed = 255;
}
else
if (newPosition < oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed -= 5; // Убавляем скорость
Serial.println("<<<");
if ( motorSpeed < 75 )
motorSpeed = 75;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( motorPin, motorSpeed );
Serial.println(motorSpeed);
}
}
ВместеPHP код:
#include <Encoder.h>
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer;
#define PIN_ENCODER_CLK 5
#define PIN_ENCODER_DT 6
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, RISING); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
Dimmer = 4500;
}
//********************обработчики прерываний*******************************
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
delay_us(Dimmer);
D4_High;
delay_us(40); //формируем импульс включения симистора
D4_Low;
}
//*************************************************************************
void loop(){
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
Dimmer -= 100;
if ( Dimmer < 2500 )
Dimmer = 2500;
}
else
if (newPosition < oldPosition)
{
Dimmer += 100;
if ( Dimmer > 9500 )
Dimmer = 9500;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
Dimmer = Dimmer;
}
}
На больших оборотах / напряжении всё нормально, только на малых лампочка моргаетPHP код:
#include <Encoder.h>
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer;
#define PIN_ENCODER_CLK 5
#define PIN_ENCODER_DT 6
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int motorPin = 3;
int motorSpeed = 75; // Изначальная скорость двигателя
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, RISING); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
Dimmer = 4500;
TCCR2B = TCCR2B & 0b11111000 | 7; Serial.begin(9600);
pinMode(motorPin, OUTPUT);
}
//********************обработчики прерываний*******************************
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
delay_us(Dimmer);
D4_High;
delay_us(40); //формируем импульс включения симистора
D4_Low;
}
//*************************************************************************
void loop(){
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
Dimmer -= 100;
if ( Dimmer < 500 )
Dimmer = 500;
analogWrite(motorPin, newPosition);
motorSpeed += 5; // Прибавляем скорость
Serial.println(">>>");
if ( motorSpeed > 255 )
motorSpeed = 255;
}
else
if (newPosition < oldPosition)
{
Dimmer += 100;
if ( Dimmer > 9500 )
Dimmer = 9500;
analogWrite(motorPin, newPosition);
motorSpeed -= 5; // Убавляем скорость
Serial.println("<<<");
if ( motorSpeed < 75 )
motorSpeed = 75;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
Dimmer = Dimmer;
analogWrite( motorPin, motorSpeed );
}
}
Я бы для начала закоментировал все что связано с serial
Уже сделано - это только тут осталось.
Так же мерцает?
Да, но стоит отключить программно вентилятор //analogWrite( motorPin, motorSpeed ) ; нет вспышек
Хотел снять видео как вспыхивает, но неожиданно задымил резистор
Вложение 19341
резистор 0,5W ?
Нужно код диммера из шапки брать, этот не пойдет
Но диммер то работал пока не стал скрещивать с вентилятором. Брал тут
У меня такая схема
http://sampawno.ru/download/file.php...c09efe476987e1
Поменял резистор - снял видео. На полной мощности всё ок, ниже середины начинаются вспышки
https://www.youtube.com/watch?v=enl9DnBYIVQ
По ссылке такой же код как в шапке темы. Который отличается от Вашего
Ааа код.. а я про схему (совсем запарился сегодня)
В схеме все нормально. Если не считать резисторы 0,25Вт
Не хочет через порт работать, но разобрался как вкл/выкл. А как регулировать?
через какой порт?
com порт
Цитата:
Если в сериал мониторе послать заглавную русскую букву "Г" то лампочка будет светится минимальным свечением
Если в сериал мониторе послать маленькую английскую букву "d" то лампочка будет светится на 50%
Если в сериал мониторе пробел то лампочка будет светится почти на максимуме
А сериал для чего? У Вас экодером же будет регулироваться
Совершенно верно - просто я хотел опробовать работоспособность кода из шапки, и разобраться что к чему.
Я могу накидать нужные функции, просто мне сейчас некогда править полностью код
Буду благодарен за функции. Я попробую сам разжевать. Вроде что то получилось - чуть позже покажу - для проверки чего я наварокосил : )
Красотища! Заработало как нужно, повырезал лишнее из кода (мне нужно на один диммер)
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>
#define PIN_ENCODER_CLK 5
#define PIN_ENCODER_DT 6
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int motorPin = 3;
int motorSpeed = 75; // Изначальная скорость двигателя
int fanPower = 155; // Изначальная мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer1;
void setup()
{
TCCR2B = TCCR2B & 0b11111000 | 7;
pinMode(motorPin, OUTPUT);
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
}
//********************обработчик и прерываний******************** ***********
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D4_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D4_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void loop()
{
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed += 5; // Прибавляем скорость
if ( motorSpeed > 255 )
motorSpeed = 255;
fanPower -= 5; // Прибавляем мощность фена
if ( fanPower < 0)
fanPower = 0;
}
else
if (newPosition < oldPosition)
{
analogWrite(motorPin, newPosition);
motorSpeed -= 5; // Убавляем скорость
Serial.println("<<<");
if ( motorSpeed < 75 )
motorSpeed = 75;
fanPower += 5; // Убавляем мощность фена
if ( fanPower > 255)
fanPower = 255;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( motorPin, motorSpeed );
Dimmer1= fanPower;
}
}
Я так понял что уже не требуется помощь?
На данном этапе нет, но будет вопрос позже.
Накидал скетч арудуины для управлениия диммером, при помощи энкодера. Сам не проверял
Нужно проверить работоспособность. Выводы энкодера и диммера можно переназначить в шапке
Код:#include <CyberLib.h> //Библиотека от Cyber-Place.ru
// Выводы ЭНКОДЕРА
#define CLK 3 // Clock Подключаем к INT1, нельзя переназначать
#define DT 4 // второй вывод энкодера
#define SW 5 // switch кнопка энкодера
#define ZD 2 // zero detection детектор ноля
#define GT 6 // Gate Triac управление симистором
#define Min 0 // минимальное значение диммера для устранения мерцания
#define Max 255 //максимальное значение диммера для устранения мерцания
volatile uint8_t tic, dimmer=0;
boolean DT_last; // последнее состояние энкодера
void setup()
{
pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
pinMode(DT, INPUT_PULLUP); // второй вывод энкодера
pinMode(SW, INPUT_PULLUP); // кнопка энкодера
pinMode(ZD, INPUT); // детектор нуля
pinMode(GT, OUTPUT); // управление симистором
digitalWrite(GT, 0); // отключить симмистор
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания int0 на низкий уровень
attachInterrupt(1, encoderTick, CHANGE); // прерывания от Энкодера
StartTimer1(halfcycle, 40); // время для одного разряда ШИМ в мкс
StopTimer1(); //остановить таймер
DT_last = digitalRead(CLK); // считываем положение CLK
Serial.begin(115200); // для отладки
}
void loop()
{
Serial.println(dimmer);
delay(100);
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if( dimmer < tic ) digitalWrite(GT, HIGH); //управляем выходом на симистор
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
digitalWrite(GT, LOW); //логический ноль на выход
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
void encoderTick() // Обратка прерываний от Энкодера
{
uint8_t DT_now = digitalRead(CLK); // считываем текущее положение CLK
if (DT_now != DT_last) // если предыдущее и текущее положение CLK не равны, значит был поворот
{
if (digitalRead(DT) != DT_now) // если DT не равен CLK, значит вращение по часовой стрелке
{
if( dimmer < Max ) dimmer++; // прибавить яркость
} else { // если DT равен CLK, значит вращение против часовой
if( dimmer > Min ) dimmer--; // убавить яркость }
}
}
DT_last = DT_now; // сохранить положение CLK для следующей проверки
}