Справка
Токовая петля — способ передачи информации с помощью измеряемых значений силы электрического тока. В настоящее время такой способ более распространён в инженерной практике, чем использование для этой цели напряжения. Для задания измеряемых значений тока используется, как правило, управляемый источник тока. По виду передаваемой информации различаются аналоговая токовая петля и цифровая токовая петля.
Аналоговая токовая петля используется для передачи аналогового сигнала по паре проводов в лабораторном оборудовании, системах управления производством и т. д.
Применяется смещенный диапазон 4—20 мА, то есть наименьшее значение сигнала (например, 0) соответствует току 4 мА, а наибольшее — 20 мА. Таким образом весь диапазон допустимых значений занимает 16 мА. Нулевое значение тока в цепи означает обрыв линии и позволяет легко диагностировать такую ситуацию.
Интерфейс аналоговой токовой петли позволяет использовать разнообразные датчики (давления, потока, кислотности и т. д.) с единым электрическим интерфейсом. Также данный интерфейс может использоваться для управления регистрирующими и исполнительными устройствами: самописцами, заслонками и т. д.
На Arduino можно реализовать измерение унифицированного токового сигнала 4…20 мА, для этого необходимо ток преобразовать в напряжение и подать его на аналоговый вход АЦП Arduino. Сопротивление 50 Ом преобразует ток 20 мА в напряжение 1 В. Чем точнее подобрано сопротивление 50 Ом, тем более точные будут показания прибора. Измеритель унифицированного токового сигнала 4…20 мА позволяет задать произвольные значения для тока 4 мА и 20 мА, этими значениями можно задать наименьшую и наибольшую величину измерения (диапазон измерения). Этими величинами может быть ток, напряжение, давление, температура и т.д. Так же можно задать кол-во знаков после запятой у измеренного значения.
Значения наименьшей и наибольшей величины измерения, а так кол-во знаков после запятой у измеренного значения сохраняются в энергонезависимой памяти.
#include <LiquidCrystal.h> #include <EEPROM.h> //#include <EEPROMex.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7 int u,reg,i4,i20,zap,rom0,rom1,rom2,rom3,rom4,rom5,rom6,i4_minus,i20_minus,kn1,kn2,kn3,kn4; const float u_ref = 1.0785;// измеренное опорное напряжение float i,u_f, iz; unsigned long w; void setup() { lcd.begin(16, 2);// LCD 16X2 analogReference(INTERNAL); pinMode(A0,INPUT);// A0 - аналоговый вход pinMode(4,INPUT);pinMode(3,INPUT);pinMode(2,INPUT); rom0=EEPROM.read(0);if(rom0>1){EEPROM.update(0,rom0);}//+- i4 rom1=EEPROM.read(1);if(rom1>10){EEPROM.update(1,rom1);}//10xx i4 rom2=EEPROM.read(2);if(rom2>99){EEPROM.update(2,rom2);}//xx99 i4 rom3=EEPROM.read(3);if(rom3>1){EEPROM.update(3,rom3);}// +- i20 rom4=EEPROM.read(4);if(rom4>10){EEPROM.update(4,rom4);}//10xx i20 rom5=EEPROM.read(5);if(rom5>99){EEPROM.update(5,rom5);}//xx99 i20 rom6=EEPROM.read(6);if(rom6>2){EEPROM.update(6,rom6);}//0.00 i4=rom1*100+rom2;if(rom0==1){i4=i4-2*i4;} i20=rom4*100+rom5;if(rom3==1){i20=i20-2*i20;} zap=rom6;} void loop() { if(digitalRead(4)==HIGH){reg++;delay(500);}if(reg>3){reg=0;} if(digitalRead(3)==HIGH&®==1){kn1++;if(kn1>=10){i4=i4+10;}else{i4++;}}else{kn1=0;}if(i4>1000){i4=1000;} if(digitalRead(2)==HIGH&®==1){kn2++;if(kn2>=10){i4=i4-10;}else{i4--;}}else{kn2=0;}if(i4<-1000){i4=-1000;} if(digitalRead(3)==HIGH&®==2){kn3++;if(kn3>=10){i20=i20+10;}else{i20++;}}else{kn3=0;}if(i20>1000){i20=1000;} if(digitalRead(2)==HIGH&®==2){kn4++;if(kn4>=10){i20=i20-10;}else{i20--;}}else{kn4=0;}if(i20<-1000){i20=-1000;} if(digitalRead(3)==HIGH&®==3){zap++;}if(zap>2){zap=0;} if(digitalRead(2)==HIGH&®==3){zap--;}if(zap<0){zap=2;} if(i4<0){i4_minus=1;} if(i20<0){i20_minus=1;} lcd.setCursor(0,0); if(reg==1){lcd.print("4 mA = ");lcd.print(i4);} if(reg==2){lcd.print("20 mA = ");lcd.print(i20);} if(reg==3){if(zap==0){lcd.print(" 0 ");}if(zap==1){lcd.print(" 0.0 ");}if(zap==2){lcd.print(" 0.00 ");}} if(reg>0){w=0;} if(reg==0){if(w==1){ EEPROM.update(0,i4_minus); EEPROM.update(1,abs(i4/100)); EEPROM.update(2,abs(i4-i4/100*100)); EEPROM.update(3,i20_minus); EEPROM.update(4,abs(i20/100)); EEPROM.update(5,abs(i20-i20/100*100)); EEPROM.update(6,zap);} u = analogRead(A0); // измерение по входу А0 u_f = (u*u_ref)/1023; i = u_f*20; lcd.setCursor(0,1);lcd.print("I = ");lcd.print(i,2);lcd.print(" mA"); if(i<3.8){lcd.setCursor(14,1);lcd.print("LO");} if(i>20.2){lcd.setCursor(14,1);lcd.print("HI");} iz =(i20-i4)/16.0*i-(i20-i4)/16.0*4+i4; lcd.setCursor(0,0);lcd.print(iz,zap);lcd.setCursor(10,0);lcd.print("4-20mA"); } w++;delay(300);lcd.clear(); }
здрвствуйте
есть лиу Вас наработки?
добавить пару входов 4-20мА чтобы управлять реле и мониторить состояние по сети