на одно прерывание - это как?
на одно прерывание - это как?
Последний раз редактировалось Chip; 15.02.2018 в 10:54.
Ни как не пойму как сделать
подключить энкодер?
За основу код для энкодера можно взять здесь
Последний раз редактировалось Chip; 16.02.2018 в 02:47.
Как подключать энкоднер знаю, вот как с помощью его управлять диммером - не разберусь
Я могу помочь, подсказать , подправить, но весь код не напишу, да и подключенного энкодера у меня сейчас нет
Без тестов код написать сложно
Сделайте пока по классической схеме
код:
Код:
void loop() { currentTime = millis(); if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц) encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке // увеличиваем яркость, не более чем до 255 if(brightness + fadeAmount <= 255) brightness += fadeAmount; } else { // выход В в 0 сост., значит вращение против часовой стрелки // уменьшаем яркость, но не ниже 0 if(brightness - fadeAmount >= 0) brightness -= fadeAmount; } } encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла loopTime = currentTime; } }
Последний раз редактировалось Chip; 15.02.2018 в 19:24.
Сделал по аналогии данного кода, но иногда при регулировке бывают яркие вспышки лампочки (особенно на малой мощности)
Конденсаторы 0,1 мкФ на выходах энкодера установлены?
По поводу кода не понял? Выложи здесь
Последний раз редактировалось Chip; 15.02.2018 в 21:13.
Забыл код выложить : )
Энкодер у меня модулем (резисторы есть)PHP код:
#include <Encoder.h>
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer;
#define PIN_ENCODER_CLK 12
#define PIN_ENCODER_DT 11
#define PIN_ENCODER_SW 10
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
int accel = 1;
int i = 0;
long oldPosition = 0;
void setup() {
Serial.begin(9600);
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
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;
Serial.println(">>>");
if ( Dimmer < 500 )
Dimmer = 500;
}
else
if (newPosition < oldPosition)
{
Dimmer += 100; // Убавляем скорость
Serial.println("<<<");
if ( Dimmer > 9500 )
Dimmer = 9500;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
Dimmer = Dimmer;
Serial.println(Dimmer);
}
}
Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)