#include "ErriezRotaryFullStep.h"
#include <Arduino.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 -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // See datasheet for Address; 0x3D or 0x3C
Adafruit_SSD1306 lcd (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define contrast = 0x01;
//contrast = 0x8F;
#define ROTARY_PIN1 3
#define ROTARY_PIN2 2
#define ROTARY_BUTTON_PIN 4
#define Smtr A0
RotaryFullStep rotary(ROTARY_PIN1, ROTARY_PIN2);
// Global variables
int count = 400;
int countLast = 0;
const int dataPin = 6; /* DS 74HC595 */
const int clockPin = 7; /* SHCP 74HC595 */
const int latchPin = 8; /* STCP 74HC595 */
void rotaryInterrupt();
int digMega ;
int digKilo ;
int digPul ;
int setDig ;
bool setPul = true;
bool setKil = false;
bool setMeg = false;
int smtr = 0;
int num = 1;
int Mode = 0;
word rxch_num;
void UpdateDisplay()
{
int channel = count;
if (channel < 0) channel = 999;
if (channel > 999) channel = 0;
int temp = channel % 100;
digMega = (channel - temp) / 100;
int temp2 = temp % 10;
digKilo = (temp - temp2) / 10;
digPul = temp2;
int _digPul = digPul;
int _digKilo = digKilo;
int _digMega = digMega;
int16_t ii = _digPul | _digKilo << 4 | _digMega << 8;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, (ii >> 8));
shiftOut(dataPin, clockPin, MSBFIRST, (ii & 0xFF));
digitalWrite(latchPin, HIGH);
//Serial.println(ii);
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(33, 05);
lcd.print("ICOM IC-2N");
lcd.setTextSize(2);
lcd.setCursor(20, 25);
lcd.print("14");
lcd.print(digMega);
lcd.print(".");
lcd.print(digKilo);
lcd.print(digPul);
lcd.print("0");
lcd.drawLine(1, 46, 128, 46, WHITE); // garis horizontal
lcd.drawLine(2, 53, 9, 53, WHITE); // draw signal bar
lcd.drawLine(2, 53, 5, 56, WHITE); // draw signal bar
lcd.drawLine(6, 56, 9, 53, WHITE); // draw signal bar
lcd.fillRect(5, 56, 2, 9, WHITE); // draw signal bar
const double max_bar = 12; // maksimal bar signal meter
const double min_bar = 0; // minimal bar signal meter
const double res = 1023; // resolusi ADC 10bit 5V
const double ref_sr = 3.3; // referensi input signal meter A0
const double a = 5 / ref_sr; // hasil bagi max_sr
smtr = analogRead(Smtr);
int net = smtr * ((max_bar / res) * a);
if (net > max_bar) net = max_bar;
if (net < min_bar) net = min_bar;
//Serial.print(smtr); Serial.print(" | "); Serial.println(net);
int x1 = 14, y1 = 60, x2 = 4, y2 = 4;
for (int i = 1; i <= net; i++)
{
lcd.fillRect(x1, y1, x2, y2, WHITE);
x1 += 10;
y1 -= 1;
y2 += 7;
}
lcd.display();
}
void setup()
{
// Initialize Serial port
Serial.begin(115200);
while (!Serial) {
;
}
//Serial.println(F("\nButton example polled full step Rotary Encoder"));
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(Smtr, INPUT);
// Enable internal pull-up for the rotary button pin
pinMode(ROTARY_BUTTON_PIN, INPUT_PULLUP);
if (!lcd.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
// Initialize pin change interrupt on both rotary encoder pins
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN1), rotaryInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN2), rotaryInterrupt, CHANGE);
// Change sensitivity
rotary.setSensitivity(25);
lcd.clearDisplay();
lcd.setTextSize(3);
lcd.setTextColor(WHITE);
lcd.setCursor(30, 15);
lcd.print("ICOM");
lcd.setTextSize(2);
lcd.setCursor(35, 45);
lcd.print("IC-2N");
lcd.display();
delay(3000);
lcd.clearDisplay();
UpdateDisplay();
}
void loop()
{
if (digitalRead(ROTARY_BUTTON_PIN) == 0)
{
Mode += 1;
if (Mode > 2) Mode = 0;
setPul = false; setKil = false; setMeg = false;
if (Mode == 0) setPul = true;
if (Mode == 1) setKil = true;
if (Mode == 2) setMeg = true;
delay(299);
//Serial.print(setMeg); Serial.print(" "); Serial.print(setKil); Serial.print(" ");
//Serial.println(setPul);
}
UpdateDisplay();
}
void rotaryInterrupt()
{
int rotaryState;
// Read rotary state (Counter clockwise) -2, -1, 0, 1, 2 (Clockwise)
rotaryState = rotary.read();
//Serial.println(rotaryState);
// Count up or down by using rotary speed
if (rotaryState == 0)
{
// No change
return;
} else if (abs(rotaryState) >= 2) {
count += rotaryState * 2;
} else {
count += rotaryState;
}
// setDig = count;
// if (setMeg) setDig += 100;
// if (setPul) setDig += 1;
// Limit count to a minimum and maximum value
if (count > 999) {
count = 0;
}
if (count + 1 < 1) {
count = 999;
}
}