- Спойлер
Код: Выделить всё
#include "U8glib.h"
#include "rus6x12.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>
const uint8_t Logo[]U8G_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xC4,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x82,
0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x42,
0x3E, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x22,
0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x27, 0x74,
0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x08,
0x1E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x10,
0x1E, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x1E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
0x1E, 0x00, 0x38, 0xFC, 0x3F, 0x3E, 0x0F, 0x80, 0x1E, 0x04, 0x00, 0xFC, 0x0F, 0x9F, 0x80, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x43, 0x31, 0xC0, 0x1E, 0x04, 0x01, 0x02, 0x03, 0xA1, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x81, 0xC0, 0xE0, 0x1E, 0x0C, 0x02, 0x03, 0x81, 0xC0, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x40, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x0C, 0x0E, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0F, 0xFF, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x60, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0xC0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x01, 0x00, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x03, 0x81, 0x81, 0x80, 0x60, 0x00,
0x3E, 0x06, 0x00, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0x00, 0x01, 0xFF, 0x03, 0xC0, 0xF0, 0x00,
0xFF, 0xF8, 0x00, 0x7F, 0x1F, 0xCF, 0xFB, 0xFC, 0xFF, 0xC0, 0x00, 0x7C, 0x0F, 0xF3, 0xFC, 0x00
};
const uint8_t Termometr[]U8G_PROGMEM = {
0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x62, 0x62, 0x72, 0x72, 0x7A, 0x7A, 0x7E,
0x7E, 0x7E, 0xFF, 0x9F, 0x9F, 0xFF, 0x7E, 0x18,
};
#define PIN_ENCODER_CLK 3
#define PIN_ENCODER_DT 5
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
//===========================================================
U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A2, /* dc=*/ A1, /* reset=*/ A0); // наш дисплей ||
//===========================================================
int motorPin = 6;
int motorSpeed = 75; // Изначальная скорость двигателя
int fanPower = 115; // Изначальная мощность фена
int selectMode = 0; // Что изменять, скорость или мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer;
// =================================== Кнопка энкодера =====================
bool button_state = false;
bool button_auto_state = false;
uint32_t ms_button = 0;
uint32_t ms_auto_click = 0;
// =================================== Кнопка энкодера =====================
void draw(void) {
u8g.setFont(u8g_font_courR24n); // тонкие цифры
u8g.setPrintPos(15, 22);
u8g.print(Dimmer);
u8g.setPrintPos(15, 64);
u8g.print(motorSpeed);
u8g.setPrintPos(-2, 70);
u8g.print("*");
if(selectMode == 1 && (millis() & 512))
{
u8g.setPrintPos(78, 23);
u8g.print(".");
}
if(selectMode == 2 && (millis() & 512))
{
u8g.setPrintPos(78, 59);
u8g.print(".");
}
// ===================================
u8g.setPrintPos(81, 6);
u8g.setFont(rus6x12);
u8g.print("температура");
u8g.setPrintPos(84, 43);
u8g.print("обороты");
// ===================================
u8g.setFont(u8g_font_courR14r);
u8g.setPrintPos(95, 27);
// u8g.print(SetPower);
u8g.setPrintPos(95, 64);
// u8g.print(SetSpeed);
// ===================================
u8g.drawLine(77, 0, 77, 64); // Вертикальная линия
u8g.drawLine(80, 32, 128, 32); // Горизонтальная короткая линия
u8g.drawBitmapP(0, 0, 1, 24, Termometr);
// u8g.drawBitmapP(-2, 47, 2, 14, Cooler);
}
void setup()
{
Dimmer = fanPower;
Serial.begin( 9600 );
TCCR0B = TCCR0B & 0b11111000 | 5;
pinMode(motorPin, OUTPUT);
pinMode(PIN_ENCODER_SW, INPUT_PULLUP); // Кнопка энкодера
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
//======================
u8g.firstPage();
do {
u8g.drawBitmapP(0, 12, 16, 31, Logo); //0 - отступ слева, 12 - от верха, 16*8 ширина картинки, 31 - высота
} while( u8g.nextPage() );
delay (400);
//======================
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
//======================
}
//********************обработчик и прерываний******************** ***********
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer < 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 += 1; // Прибавляем скорость
if ( motorSpeed > 255 )
motorSpeed = 255;
Serial.println("1 >>>");
}
else
{
fanPower -= 1; // Прибавляем мощность фена
if ( fanPower < 0)
fanPower = 0;
Serial.println("2 >>>");
}
}
else
if (newPosition < oldPosition)
{
if (selectMode == 0)
{
motorSpeed -= 1; // Убавляем скорость
if ( motorSpeed < 75 )
motorSpeed = 75;
Serial.println("1 <<<");
}
else
{
fanPower += 1; // Убавляем мощность фена
if ( fanPower > 255)
fanPower = 255;
Serial.println("2 <<<");
}
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( motorPin, motorSpeed );
Dimmer = fanPower;
}
Dimmer = fanPower;
}