Можно перенести пост в другой раздел. У меня нет прав на создание тем.
Оборудование :Arduino Nano, энкодер и ИК приемник обыкновенные, экран SSD1306 128*64 i2c
Код: Выделить всё
/****************
* кнопка энкодера D04
* S1, S2 энкодера А2, А3
* Библиотека энкодера
* https://github.com/AlexGyver/GyverLibs/releases/download/GyverEncoder/GyverEncoder.zip
* Библиотека таймеров
* https://alexgyver.ru/gyvertimer/
* Загружал с менеджером плат GyverCore
* https://alexgyver.ru/lessons/gyvercore-doc/
* Экран: SCK - A5, SDA - A4
* SPI в PGA2311: Clock - D13, Data - D10, минус соединен между ардуино и регулятором, плюс ардуино от иного источника
* ИК приемник - данные в A0 *
* Мои Коды - 33450645; + 33452685; Mute 33469005; Repeat 4294967295 *
*/
#include <GyverEncoder.h>
#include <IRremote.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Экран
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//IR
IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;
//Энкодер
#define CLK A3
#define DT A2
#define SW 4
Encoder enc1(CLK, DT, SW);
#define STEPS 1 //Шаг изменения громкости
#define MinVol 0 //Минимальная громкость
#define MaxVol 180 //Максимальная громкость: Максимум 255 - +31,5 dB
byte Volume, LastVolume, lastValue, countBt;
signed int Gain; //Уровень громкости в децибеллах
bool VolMute;
bool VolPlusBt, VolMinusBt, VolRepeatBt, VolMuteBt, VolRepeatPlus, VolRepeatMinus, VolPlusBtWas, VolMinusBtWas;
void setup() {
//Энкодер
enc1.setType(TYPE2); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип\=
enc1.setFastTimeout(40); // таймаут на скорость isFastR. По умолч. 50
//ИК
irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала
pinMode(A0, INPUT); // пин A0 будет входом
Serial.begin(9600);
pinMode (SW, INPUT); //Кнопка энкодера
//Включение экрана
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
Volume = 80; //Начальное значение громкости
SPI.begin();
delay (1000);
SPI.transfer(Volume);
SPI.transfer(Volume);
}
void loop() {
//Энкодер
enc1.tick();
if (Volume < MaxVol and !VolMute){
if (enc1.isRight()) Volume += STEPS; // если был поворот направо, увеличиваем на 1
}
if (Volume > MinVol and !VolMute){
if (enc1.isLeft()) Volume -= STEPS; // если был поворот налево, уменьшаем на 1
}
//Активен mute. Выключить и позволить менять громкость
if ((enc1.isRight() or enc1.isLeft()) and VolMute){
countBt = 2;
Mute();
}
if (enc1.isPress()){ // Нажатие кнопки энкодера Mute
countBt +=1 ; //1 - mute, 2 - unmute
Mute();
}
IR_Recieve(); //Вызов функции ИК приемника
// если громкость изменилась - выводим на экран
if (lastValue != Volume) {
lastValue = Volume;
SPI.transfer(Volume);
SPI.transfer(Volume);
display_show();
}
}
//Вывод на экран
void display_show() {
Gain = 31.5 - (0.5 * (255 - Volume)); //Уровень громксоти в децибеллах
display.clearDisplay();
display.setTextColor(SSD1306_WHITE); // Draw white text
if (VolMute){
display.setCursor(1, 0);
display.setTextSize(2);
display.println("MUTE");
}
display.setTextSize(4);
display.setCursor(10, 17);
display.print(Gain);
display.setTextSize(3);
display.println("dB");
display.display();
}
void IR_Recieve(){
if (irrecv.decode(&results)) // если данные пришли выполняем команды
{
//Для считывания кодов пульта
//Serial.println(results.value); // отправляем полученные данные на порт
if (results.value == 33452685) VolPlusBt = true;
else VolPlusBt = false;
if (results.value == 33450645) VolMinusBt = true;
else VolMinusBt = false;
if (results.value == 33469005) VolMuteBt = true;
else VolMuteBt = false;
if (results.value == 4294967295) VolRepeatBt = true;
else VolRepeatBt = false;
// Vol + Repeat
if (VolPlusBt) VolPlusBtWas = true;
if (VolPlusBtWas and (VolMinusBt or VolMuteBt)) VolPlusBtWas = false;
if (VolPlusBtWas and VolRepeatBt) VolRepeatPlus = true;
else VolRepeatPlus = false;
// Vol - Repeat
if (VolMinusBt) VolMinusBtWas = true;
if (VolMinusBtWas and (VolPlusBt or VolMuteBt)) VolMinusBtWas = false;
if (VolMinusBtWas and VolRepeatBt) VolRepeatMinus = true;
else VolRepeatMinus = false;
// Vol +
if ((VolPlusBt or VolRepeatPlus) and (Volume < MaxVol) and !VolMute)
Volume += STEPS ;
//Vol -
if ((VolMinusBt or VolRepeatMinus) and (Volume > MinVol) and !VolMute)
Volume -= STEPS;
//Mute
if (VolMuteBt) {
countBt +=1 ;
Mute();
}
//Активен mute. Выключить и позволить менять громкость
if ((VolPlusBt or VolMinusBt) and VolMute) {
countBt = 2;
Mute();
}
irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
}
}
void Mute(){
if (!VolMute and countBt == 1){
LastVolume = Volume;
Volume = MinVol;
VolMute = true;
}
if (VolMute and countBt == 2){
Volume = LastVolume;
VolMute = false;
countBt = 0;
}
}