Тема: Вольтамперметр для блока питания (Arduino)
Основная статья - http://rcl-radio.ru/?p=53330
#include <Wire.h>
#include <Adafruit_ADS1015.h> // Adafruit_ADS1X15-master.zip
#include <EEPROM.h>//#include <EEPROMex.h>
Adafruit_ADS1115 ads;
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
int u0,u1,a2,a3,i;
byte w,stop;
float u_0,u_1,u_ob0,u_ob1,a_2,a_3,a_ob2,a_ob3,i_reg;
unsigned long time=millis();
const float kalib0=7.970;// калибровка вольтметра А0 по максимальному напряжению 30V I=0
const float kalib2=1.000;// калибровка амперметра А2 по максимальному току 10 А
void setup(void){
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(12,INPUT);pinMode(11,INPUT);pinMode(10,OUTPUT);
i_reg = EEPROM.read(0)+(float)EEPROM.read(1)/100;// reg eeprom
ads.begin();delay(100);
}
void loop(){
if(digitalRead(12)==HIGH){i_reg=i_reg+0.01;if(i_reg>=9.99){i_reg=9.99;}time=millis();delay(200);w=1;}
if(digitalRead(11)==HIGH){i_reg=i_reg-0.01;if(i_reg<0){i_reg=0.01;}time=millis();delay(200);w=1;}
if(millis()-time>3000){
////////////////////////////////// вольтметр ////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_ONE);
u0 = ads.readADC_SingleEnded(0);u_0 = u0*0.125*kalib0/1000;delay(20);
u1 = ads.readADC_SingleEnded(1);u_1 = u1*0.125*kalib0/1000;delay(5);
u_ob0=u_ob0+u_0;u_ob1=u_ob1+u_1;}
u_0=u_ob0/10;u_ob0=0;u_1=u_ob1/10;u_ob1=0;i=0; u_0=u_0-u_1;
///////////////////////////////// амперметр /////////////////////////////////////////////
while(i<10){i++;ads.setGain(GAIN_SIXTEEN);
a2 = ads.readADC_SingleEnded(2);a_2 = a2*0.0078125*kalib2/10;
if(a_2>=i_reg){digitalWrite(10,LOW);stop=1;break;}else{digitalWrite(10,HIGH);}delay(20);
a3 = ads.readADC_SingleEnded(3);a_3 = a3*0.0078125*kalib2/10;delay(5);
a_ob2=a_ob2+a_2;a_ob3=a_ob3+a_3;}
a_3=a_ob3/10;a_ob3=0;a_2=a_ob2/10;a_ob2=0;i=0;a_2=a_2-a_3;
///////////////////////////////// вывод на экран ///////////////////////////////////////
if(a_2<0.005){a_2=0;}if(u_0<0.005){u_0=0;}// измерения начинаются с 0,005 В и с 0,005 А
u_0=u_0-(a_2/100);// компенсация напряжения шунта
}
lcd.setCursor(0,0);if(u_0<=9.999){lcd.print(" ");}lcd.print(abs(u_0),3);lcd.print(" B");
if(millis()-time<3000){lcd.print(" REG ");}
lcd.setCursor(0,1);lcd.print(" ");lcd.print(abs(a_2),3);lcd.print(" A ");lcd.print(i_reg,2);lcd.print(" A ");
if(stop==1){lcd.setCursor(9,0);lcd.print(" 10sOFF ");stop=0;delay(10000);}
if(stop==0&&millis()-time>3000){lcd.setCursor(9,0);lcd.print(" ON ");}
if(w==1){EEPROM.update(0,(int)i_reg);EEPROM.update(1,i_reg*100-(int)i_reg*100);w=0;}
}