// Program for attiny3216 to respons the rotary encode for menu navigation // created by Jans Hendry // Universitas Gadjah Mada, Indonesia // Kamakura Node, Japan // fab academy MIT - 2022 // This program still have many aspect to improve. Please do... // the directives/predecessor #include #include // create lcd as an object // format: address, num of columns, num of rows LiquidCrystal_I2C lcd(0x27, 20, 4); // create costum character on LCD byte ch0[8] = { 0b00001, 0b00011, 0b00111, 0b11111, 0b11111, 0b00111, 0b00011, 0b00001 }; // variables const int sw = 4; // sw pin const int dt = 3; // dt pin const int clk = 7; // clk pin int inc = 0, oldState, newState, dta; int pos; void setup() { Serial.begin(9600); // start serial // begin lcd lcd.begin(20, 4); // setting up lcd.init(); // turn on backlight <- the variable resistor has been adjusted lcd.backlight(); // clear screen lcd.clear(); // create costum character lcd.createChar(8, ch0); // arrow // pin mode pinMode(sw, INPUT_PULLUP); pinMode(dt, INPUT_PULLUP); pinMode(clk, INPUT_PULLUP); oldState = digitalRead(clk); // static text defDisplay(); lcd.setCursor(19, 0); lcd.write((byte)8); delay(500); // take a breath } void loop() { // check current state newState = digitalRead(clk); // conditional IF if (newState != oldState) { dta = digitalRead(dt); if (dta != newState) { inc++; } else { inc--; } // check max increment if (inc >= 6) { inc = 6; } // check min decrement if ((inc <= 0) && (inc >= -6)){ inc = -1 * inc; } // display arrow clearAnc(); // clear arrow if (inc % 2 == 0) { pos = inc / 2; lcd.setCursor(19, pos); lcd.write((byte)8); } else if (inc % 2 != 0) { pos = (inc - 1) / 2; lcd.setCursor(19, pos); lcd.write((byte)8); } else { pos = 0; lcd.setCursor(19, pos); lcd.write((byte)8); } } if (digitalRead(sw) == LOW) { lcd.clear(); lcd.setCursor(4, 1); lcd.print("DEMO MENU "); lcd.setCursor(15, 1); lcd.print(pos + 1); delay(3000); defDisplay(); lcd.setCursor(19, pos); lcd.write((byte)8); } oldState = newState; // update previous state } void defDisplay() { lcd.clear(); // clear display lcd.setCursor(0, 0); lcd.print("DEMO MENU 1"); lcd.setCursor(0, 1); lcd.print("DEMO MENU 2"); lcd.setCursor(0, 2); lcd.print("DEMO MENU 3"); lcd.setCursor(0, 3); lcd.print("DEMO MENU 4"); } void clearAnc() { for (int i = 0; i < 4; i++) { lcd.setCursor(19, i); lcd.print(" "); } }