#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#define LOG_LEVEL LOG_LEVEL_DEBUG
#include "SerialLogger.h"
#define I2C_ADDR 0x27
// gpio.9 SCL
// gpio.8 SDA
#define LCD_KOLUMNY 16
#define LCD_LINIE 2
#define PWM_LED 10
#define PWM_LASER 11
#define PWM_KROK_PROCENT 5
#define PWM_ROZDZ 255
// encoder
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_POZ_MIN 0
#define ENCODER_POZ_MAX (100 / PWM_KROK_PROCENT)
#define PWM_KROK ((float) PWM_ROZDZ / ENCODER_POZ_MAX)
int encoderPoz = 0;
int mocPWM = 0;
bool odswiezLCD = true;
void naZmianeCLK();
SerialLogger Logger;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_KOLUMNY, LCD_LINIE);
void setup() {
// Init
Logger.init(115200); // Initialize logger with baud rate
Logger.infof("Start systemu...\r\n");
lcd.init();
lcd.backlight();
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(PWM_LED, OUTPUT);
pinMode(PWM_LASER, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), naZmianeCLK, CHANGE);
}
void inline odswiezenieLCD()
{
mocPWM = encoderPoz * PWM_KROK_PROCENT;
Logger.debugf("%s:%d mocPWM: %d%%\r\n", __func__, __LINE__, mocPWM);
lcd.setCursor(0, 0);
lcd.printf("Moc: %3d%%", mocPWM);
}
void inline ustawPWM()
{
float wartoscPWM = encoderPoz * PWM_KROK;
Logger.debugf("%s:%d analog PWM: %d\r\n", __func__, __LINE__, (int) wartoscPWM);
analogWrite(PWM_LED, (int) wartoscPWM);
analogWrite(PWM_LASER, (int) wartoscPWM);
lcd.setCursor(0, 1);
lcd.printf("PWM: %3d", (int) wartoscPWM);
}
void naZmianeCLK(){
//Serial.printf("%s:%d\r\n", __func__, __LINE__);
int nowyClk = digitalRead(ENCODER_CLK);
int dtWartosc = digitalRead(ENCODER_DT);
if (!nowyClk) {
if (dtWartosc) {
Logger.debugf("%s:%d Przekret w prawo ⏩\r\n", __func__, __LINE__);
encoderPoz++;
} else {
Logger.debugf("%s:%d Przekret w lewo ⏪\r\n", __func__, __LINE__);
encoderPoz--;
}
encoderPoz = std::clamp(encoderPoz, ENCODER_POZ_MIN, ENCODER_POZ_MAX);
Logger.debugf("%s:%d encoderPoz: %d\r\n", __func__, __LINE__, encoderPoz);
odswiezLCD = true;
}
}
void loop() {
if (odswiezLCD) {
odswiezenieLCD();
ustawPWM();
odswiezLCD = false;
}
delay(10);
}