- КОД
Код: Выделить всё
#include "U8glib.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>
#define PIN_ENCODER_CLK 8
#define PIN_ENCODER_DT 9
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
//===========================================================
U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A0, /* dc=*/ A1, /* reset=*/ A2); // наш дисплей ||
//===========================================================
int motorPin = 3;
int motorSpeed = 75; // Изначальная скорость двигателя
int fanPower = 155; // Изначальная мощность фена
int selectMode = 1; // Что изменять, скорость или мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer1;
// =================================== Кнопка энкодера =====================
bool button_state = false;
bool button_auto_state = false;
uint32_t ms_button = 0;
uint32_t ms_auto_click = 0;
// =================================== Кнопка энкодера =====================
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_ncenR24);
u8g.setPrintPos(0, 30);
u8g.print(fanPower7);
}
void setup()
{
//Serial.begin( 9600 );
TCCR2B = TCCR2B & 0b11111000 | 7;
pinMode(motorPin, OUTPUT);
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
pinMode(PIN_ENCODER_SW, INPUT_PULLUP); // =================================== Кнопка энкодера
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()
{
// =================================== Кнопка энкодера =====================
uint32_t ms = millis();
bool pin_state = digitalRead(PIN_ENCODER_SW);
if( pin_state == LOW && !button_state && ( ms - ms_button ) > 50 )// Фиксируем нажатие кнопки
{
button_state = true;
button_auto_state = false;
ms_button = ms;
if(selectMode == 0)
{
selectMode = 1;
// Serial.println("Press key");
}
else
{
selectMode = 0;
}
}
if( pin_state == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия
{
button_auto_state = true;
ms_auto_click = ms;
// Serial.println("Auto press key");
}
if( pin_state == HIGH && button_state && ( ms - ms_button ) > 50 ) // Фиксируем отпускание кнопки
{
button_state = false;
ms_button = ms;
if( !button_auto_state )
Serial.println("No Press key");
}
// =================================== Кнопка энкодера =====================
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
if (selectMode == 0)
{
motorSpeed += 5; // Прибавляем скорость
if ( motorSpeed > 255 )
motorSpeed = 255;
}
else
{
fanPower -= 5; // Прибавляем мощность фена
if ( fanPower < 0)
fanPower = 0;
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
}
else
if (newPosition < oldPosition)
{
if (selectMode == 0)
{
motorSpeed -= 5; // Убавляем скорость
if ( motorSpeed < 75 )
motorSpeed = 75;
}
else
{
fanPower += 5; // Убавляем мощность фена
if ( fanPower > 255)
fanPower = 255;
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( motorPin, motorSpeed );
Dimmer1= fanPower;
// Serial.println(motorSpeed);
}
}