Для теста брал этот скетч с первой страницы:
#include <Wire.h>
#include <EEPROM.h>
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(8, 9);//CLK, DT
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
unsigned long times,oldPosition = -999,newPosition;
int u_out,u_dig,menu,i_out;
const float u_k = 7.10; // калибровка регулятора напряжения
const float i_k = 0.975;// калибровка измерителя тока
const float r = 0.01; // сопротивление шунта
byte power = 1; // при подачи питания выходное напряжение 0 В - OFF
float i;
byte w;
void setup(){
Wire.begin();lcd.init();lcd.backlight();
MsTimer2::set(1, to_Timer);MsTimer2::start();
pinMode(10,INPUT);// SW энкодер MENU
pinMode(2,INPUT_PULLUP); // кнопка ON/OFF
pinMode(A0,INPUT); // input I
u_out=EEPROM.read(0)*256+EEPROM.read(1);i_out=EEPROM.read(2);
}
void loop(){i_kz();
if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}
if(digitalRead(2)==LOW&&power==0){power = 1;delay(200);}
if(digitalRead(2)==LOW&&power==1){power = 0;delay(200);}
//////// set out 0-28 V
if(menu==0){
if (newPosition != oldPosition){oldPosition = newPosition;
u_out=u_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
if(u_out<0){u_out=0;}if(u_out>280){u_out=280;}u_dig = float(u_out/10.00)/u_k*4096/5.00;}}
//////// set i 0-2.5 A
if(menu==1){
if (newPosition != oldPosition){oldPosition = newPosition;
i_out=i_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
if(i_out<0){i_out=0;}if(i_out>250){i_out=250;}}}
//////// lcd
i_kz();
lcd.setCursor(0, 0);if(menu==0){lcd.print("U*= ");}else{lcd.print("U = ");}if(u_out<100){lcd.print(" ");}
lcd.print(float(u_out/10.00),1);lcd.print(" V ");
lcd.setCursor(11, 0);lcd.print(abs(i),2);lcd.print("A");
lcd.setCursor(0, 1);if(menu==1){lcd.print("A*= ");}else{lcd.print("I = ");}lcd.print(float(i_out/100.00),2);lcd.print(" A ");
i_kz();
//////////////// EEPROM
if(millis()-times>5000&&w==1){EEPROM.update(0,highByte(u_out));EEPROM.update(1,lowByte(u_out));EEPROM.update(2,i_out);menu=0;times=millis();w=0;}
}//loop
void MCP4725(int data){
byte buffer[3];
buffer[0] = 0b01000000;
// data=0;
// buffer[0] = 0b01100000; // запись в память ЦАП 0 В
buffer[1] = data >> 4;
buffer[2] = data << 4;
Wire.beginTransmission(0x60);
Wire.write(buffer[0]);
Wire.write(buffer[1]);
Wire.write(buffer[2]);
Wire.endTransmission();
}
void i_kz(){
i = analogRead(A0)/250.00*i_k;
if(i > float(i_out/100.0)){MCP4725(0);lcd.setCursor(12, 1);lcd.print("ERR");delay(3000);power=1;}
else{lcd.setCursor(12, 1);
if(power==0){MCP4725(u_dig+i*4.00);lcd.print("ON ");}
if(power==1){MCP4725(0);lcd.print("OFF");}
}}
void to_Timer(){newPosition = myEnc.read()/4;}