#include <Arduino.h>
#include <U8g2lib.h>
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const int CLK = 2;
const int SW = 3;
const int DT = 4;
const int minus_0p5dB = 5;
const int minus_1dB = 6;
const int minus_2dB = 7;
const int minus_4dB = 8;
const int minus_8dB = 9;
const int minus_16dB = 10;
const int minus_32dB = 11;
const int enable_output = 12;
float dB_number = 63.50;
byte volume_switched = 0;
volatile byte volume = 0;
volatile byte volume_saved = 0;
volatile byte muted = 1;
void setup()
{
pinMode(SW, INPUT_PULLUP);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(minus_32dB, OUTPUT);
digitalWrite(minus_32dB, HIGH);
pinMode(minus_16dB, OUTPUT);
digitalWrite(minus_16dB, HIGH);
pinMode(minus_8dB, OUTPUT);
digitalWrite(minus_8dB, HIGH);
pinMode(minus_4dB, OUTPUT);
digitalWrite(minus_4dB, HIGH);
pinMode(minus_2dB, OUTPUT);
digitalWrite(minus_2dB, HIGH);
pinMode(minus_1dB, OUTPUT);
digitalWrite(minus_1dB, HIGH);
pinMode(minus_0p5dB, OUTPUT);
digitalWrite(minus_0p5dB, HIGH);
pinMode(enable_output, OUTPUT);
delay(5000);
digitalWrite(enable_output, LOW);
attachInterrupt(digitalPinToInterrupt(SW), Mute, FALLING);
attachInterrupt(digitalPinToInterrupt(CLK), Encoder, RISING);
Serial.begin(9600);
u8g2.begin();
u8g2.setFont(u8g2_font_lubB18_tf); //設定字型
}
void loop()
{
dB_number = 63.50 - 0.5 * volume;
if (muted == 1) {
u8g2.firstPage();
do {
u8g2.drawStr(24, 42, "MUTE");
} while ( u8g2.nextPage() );
delay(500);
}
else{
u8g2.firstPage();
do {
u8g2.drawStr(0, 42, "-");
if (volume >= 108) {
u8g2.setCursor(31, 40);
}
else{
u8g2.setCursor(15, 40);
}
u8g2.print(dB_number);
u8g2.drawStr(94, 40, "dB");
} while ( u8g2.nextPage() );
delay(500);
}
if (volume != volume_switched && muted == 0) RelaySwitching(volume);
else if (muted == 0) digitalWrite(enable_output, HIGH);
else digitalWrite(enable_output, LOW);
Serial.println(volume);
delay(500);
}
void Mute()
{
if (muted == 0) {
muted = 1;
}
else {
muted = 0;
}
}
void Encoder()
{
if (muted == 1) {
muted = 0;
}
if (volume == 127) {
volume += (digitalRead(CLK) != digitalRead(DT) ? 0 : -1);
}
else if (volume == 0) {
volume += (digitalRead(CLK) != digitalRead(DT) ? 1 : 0);
}
else {
volume += (digitalRead(CLK) != digitalRead(DT) ? 1 : -1);
}
}
void RelaySwitching(byte remainder) {
digitalWrite(enable_output, LOW);
delay(200);
volume_switched = remainder;
byte remainder_tmp = remainder;
remainder = remainder % 64;
if (remainder != remainder_tmp) {
digitalWrite(minus_32dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_32dB, HIGH);
}
remainder = remainder % 32;
if (remainder != remainder_tmp) {
digitalWrite(minus_16dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_16dB, HIGH);
}
remainder = remainder % 16;
if (remainder != remainder_tmp) {
digitalWrite(minus_8dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_8dB, HIGH);
}
remainder = remainder % 8;
if (remainder != remainder_tmp) {
digitalWrite(minus_4dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_4dB, HIGH);
}
remainder = remainder % 4;
if (remainder != remainder_tmp) {
digitalWrite(minus_2dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_2dB, HIGH);
}
remainder = remainder % 2;
if (remainder != remainder_tmp) {
digitalWrite(minus_1dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_1dB, HIGH);
}
if (remainder != 0) {
digitalWrite(minus_0p5dB, LOW);
remainder_tmp = remainder;
}
else {
digitalWrite(minus_0p5dB, HIGH);
}
delay(200);
if (volume != 0) digitalWrite(enable_output, HIGH);
}