this is the final code:
#include <Wire.h>
#include <HCSR04.h>
#include <EncButton.h>
EncButton<EB_CALLBACK, 2, 3, 4> enc; //CLK=2; DT=3; BTN=4;
HCSR04 hc(7, 8); /// trig=7 , echo=8
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // SDA=4; SCL=5
byte x = 0;
byte y = 0;
int pwmout1 = 5;
int pwmout2 = 6;
int const row = 20;
int const col = 3;
int rowSelect = 0;
int alarm = 30;
int colNum;
int powerlvl[row][col] =
{ {0, 0, 0},
{1, 13, 13},
{2, 16, 16},
{3, 19, 19},
{4, 21, 21},
{5, 25, 25},
{6, 30, 30},
{7, 35, 35},
{8, 40, 40},
{9, 45, 45},
{10, 50, 50},
{11, 55, 55},
{12, 60, 60},
{13, 65, 65},
{14, 70, 70},
{15, 75, 75},
{16, 80, 80},
{17, 85, 85},
{18, 90, 90},
{19, 99, 99},
};
void setup() {
pinMode(pwmout1, OUTPUT);
pinMode(pwmout2, OUTPUT);
enc.attach(RIGHT_HANDLER, myRight);
enc.attach(LEFT_HANDLER, myLeft);
enc.attach(PRESS_HANDLER, myPress);
attachInterrupt(0, isr, CHANGE);
attachInterrupt(1, isr, CHANGE);
lcd.init();
lcd.backlight();
}
void myLeft()
{
if (colNum == 0) {
rowSelect = constrain(rowSelect - 1, 0, 19);
}
if (colNum == 1) {
powerlvl[rowSelect][1] = constrain(powerlvl[rowSelect][1] - 1, 0, 99);
if (powerlvl[rowSelect][1] < 10) {
lcd.setCursor(11, 0);
lcd.print(" ");
}
}
if (colNum == 2) {
powerlvl[rowSelect][2] = constrain(powerlvl[rowSelect][2] - 1, 0, 99);
if (powerlvl[rowSelect][2] < 10) {
lcd.setCursor(18, 0);
lcd.print(" ");
}
}
}
void myRight()
{
if (colNum == 0) {
rowSelect = constrain(rowSelect + 1, 0, 19);
}
if (colNum == 1) {
powerlvl[rowSelect][1] = constrain(powerlvl[rowSelect][1] + 1, 0, 99);
if (powerlvl[rowSelect][1] < 10) {
lcd.setCursor(11, 0);
lcd.print(" ");
}
}
if (colNum == 2) {
powerlvl[rowSelect][2] = constrain(powerlvl[rowSelect][2] + 1, 0, 99);
if (powerlvl[rowSelect][2] < 10) {
lcd.setCursor(18, 0);
lcd.print(" ");
}
}
}
void myPress() {
colNum++;
if (colNum == 3) colNum = 0;
}
void isr() {
enc.tickISR(); // ticker
}
void loop()
{
enc.tick();
lcd.setCursor(10, 3);
lcd.print(" "); // clear digits on row 4, col 4,5,6 if they were left over
lcd.setCursor(0, 3);
lcd.print("Litri:");
lcd.setCursor(6, 3);
lcd.print(60 - hc.dist(), 1); ///// flip measurment; Serial.print (xxx, 0); for no decimals
switch (colNum) {
case 0: {
lcd.setCursor(0, 0);
lcd.print(">");
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print("P=");
lcd.setCursor(3, 0);
lcd.print(powerlvl[rowSelect][0]);
lcd.setCursor(7, 0);
lcd.print("B%=");
lcd.setCursor(10, 0);
lcd.print(powerlvl[rowSelect][1]);
lcd.setCursor(14, 0);
lcd.print("M%=");
lcd.setCursor(17, 0);
lcd.print(powerlvl[rowSelect][2]);
x = map((powerlvl[rowSelect][1]), 0, 99, 0, 255);
analogWrite(pwmout1, x);
y = map((powerlvl[rowSelect][2]), 0, 99, 0, 255);
analogWrite(pwmout2, y / 5); //this /5 is intentional to determine which is which
break;
}
case 1: {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(">");
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print("P=");
lcd.setCursor(3, 0);
lcd.print(powerlvl[rowSelect][0]);
lcd.setCursor(7, 0);
lcd.print("B%=");
lcd.setCursor(10, 0);
lcd.print(powerlvl[rowSelect][1]);
lcd.setCursor(14, 0);
lcd.print("M%=");
lcd.setCursor(17, 0);
lcd.print(powerlvl[rowSelect][2]);
x = map((powerlvl[rowSelect][1]), 0, 99, 0, 255);
analogWrite(pwmout1, x);
y = map((powerlvl[rowSelect][2]), 0, 99, 0, 255);
analogWrite(pwmout2, y / 5); //this /5 is intentional to determine which is which
break;
}
case 2: {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print(">");
lcd.setCursor(1, 0);
lcd.print("P=");
lcd.setCursor(3, 0);
lcd.print(powerlvl[rowSelect][0]);
lcd.setCursor(7, 0);
lcd.print("B%=");
lcd.setCursor(10, 0);
lcd.print(powerlvl[rowSelect][1]);
lcd.setCursor(14, 0);
lcd.print("M%=");
lcd.setCursor(17, 0);
lcd.print(powerlvl[rowSelect][2]);
x = map((powerlvl[rowSelect][1]), 0, 99, 0, 255);
analogWrite(pwmout1, x);
y = map((powerlvl[rowSelect][2]), 0, 99, 0, 255);
analogWrite(pwmout2, y / 5); //this /5 is intentional to determine which is which
break;
}
}
if (hc.dist() >= alarm) ////////alarm at 30
{ digitalWrite(9, HIGH);
lcd.setCursor(12, 3);
lcd.print("OIL LOW!");
}
else
{ digitalWrite(9, LOW);
lcd.setCursor(12, 3);
lcd.print(" ");
}
if (rowSelect <= 9) //////// clear left over digits below powerlvl 9
{ lcd.setCursor(2, 2);
lcd.print(" ");
lcd.setCursor(4, 0);
lcd.print(" ");
lcd.setCursor(19, 0);
lcd.print(" ");
}
if (rowSelect == 0) //////// clear left over digits at powerlvl 1
{
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(18, 0);
lcd.print(" ");
}
}
@alto777 thats a great tool!