По отдельности скетчи работают нормально. Первый крутит вентилятор, второй регулирует накал лампочки. Но при попытке их объединить - лампочка мерцает.
Первый
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 );
}
}
На больших оборотах / напряжении всё нормально, только на малых лампочка моргает