Не хочет через порт работать, но разобрался как вкл/выкл. А как регулировать?
Не хочет через порт работать, но разобрался как вкл/выкл. А как регулировать?
через какой порт?
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;
}
}
Последний раз редактировалось Kevin; 19.02.2018 в 02:02.
Я так понял что уже не требуется помощь?
На данном этапе нет, но будет вопрос позже.
Накидал скетч арудуины для управлениия диммером, при помощи энкодера. Сам не проверял
Нужно проверить работоспособность. Выводы энкодера и диммера можно переназначить в шапке
Код:#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 для следующей проверки }
Последний раз редактировалось Chip; 20.02.2018 в 21:13.
Эту тему просматривают: 12 (пользователей: 0 , гостей: 12)