Тема: Регулируемый стабилизатор напряжения с управлением от Arduino
Кнопки изменены на энкодер
Основная статья - http://rcl-radio.ru/?p=57730
#include <Wire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Adafruit_ADS1015.h>
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;
OneWire oneWire(A2);// вход датчика 18b20
DallasTemperature t(&oneWire);
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
Encoder myEnc(8, 9);//CLK, DT
unsigned long times,oldPosition = -999,newPosition;
int u_dig,i,u_reg,w,w1,I_r,menu;
unsigned int i_iz;
float u_max=26.3,I,temp,i_reg,I_old;
unsigned long time,time1,time2;
const float kalib2=1.000;// калибровка амперметра
void setup(){
Serial.begin(9600);Wire.begin();Wire.setClock(400000L);
lcd.begin(16, 2);
MsTimer2::set(3, to_Timer);MsTimer2::start();
pinMode(10,INPUT);// SW энкодер MENU
t.begin();t.setResolution(9);//9 бит
ads.begin();ads.setGain(GAIN_EIGHT);
u_dig=EEPROM.read(0)*256+EEPROM.read(1);i_reg=(float)EEPROM.read(2)/10.0;
}
void loop(){
if(digitalRead(10)==LOW){menu++;if(menu>1){menu=0;}delay(200);}
if(menu==0){
if (newPosition != oldPosition){oldPosition = newPosition;
u_dig=u_dig+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
w=1;time1=millis();
if(u_dig>4095){u_dig=4095;}if(u_dig<0){u_dig=0;}
}}
if(menu==1){
if (newPosition != oldPosition){oldPosition = newPosition;
i_reg=i_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;
w=1;time1=millis();
if(i_reg>30){i_reg=30;}if(i_reg<1){i_reg=1;}I_r=i_reg;
}}
MCP4725(u_dig-u_reg+16*I);
///////////////////////////////// амперметр /////////////////////////////////////////////
i_iz = ads.readADC_SingleEnded(0);
if(i_iz>65000){i_iz=0;}I = i_iz*0.015625*kalib2/100;
///////////////////////////////////////// защита от КЗ //////////////////////////////////
if(I>3){MCP4725(0);lcd.setCursor(0,0);lcd.print(" SHORT CIRCUIT! ");delay(10000);}
//////////////////////////////////// стабилизация по току + ТЕРМОАЩИТА///////////////////////////////
if(w1==1){ if(I>i_reg&&u_dig>0){u_reg=u_reg+10;} if(I==i_reg){}
if(I<i_reg&&u_reg>0&&I>0.1){u_reg=u_reg-10;} if(I<0.08){w1=0;u_reg=0;}}
if(I>i_reg&&u_dig>0&&w1==0){u_reg=u_dig-(u_dig*(i_reg/I));w1=1;MCP4725(u_dig-u_reg);}
if(temp>85){MCP4725(0);lcd.setCursor(0,0);lcd.print("HIGH TEMPERATURE");delay(10000);}
////////////////////////////////////// eeprom ///////////////////////////////////////////
if(w==1&&millis()-time>1000){EEPROM.update(0,highByte(u_dig));EEPROM.update(1,lowByte(u_dig));
EEPROM.update(2,I_r);time=millis();w=0;}
if(millis()-time2>300){
lcd.setCursor(0,0);lcd.print("U = ");lcd.print((u_dig-u_reg)*u_max/4096,1);lcd.print(" V ");
lcd.setCursor(0,1);lcd.print("I = ");lcd.print(abs(I),2);lcd.print(" A ");
time2=millis();} lcd.setCursor(11,1);lcd.print(i_reg,1);lcd.print(" A");
////////////////////// измерение температуры корпуса транзстора ///////
if(millis()-time1>1000&&I_old==I){ t.requestTemperatures();
temp=t.getTempCByIndex(0); lcd.setCursor(12,0);lcd.print(temp,0);
lcd.print(char(223));lcd.print("C ");time1=millis();}I_old=I;
}
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 to_Timer(){newPosition = myEnc.read()/4;}