Тема: Миллиомметр MCP3421
#include <Wire.h>
#include <MCP3421.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
MCP3421 mcp;
unsigned long dig,dig_sum;
float u,r;
const float u3300 = 3.241; // опорное напряжение (V)
const float r_ogr = 100.00;// эталонное сопротивление (Om)
const float r_0 = 0.0014; // погрешность нуля (Om)
int i,n=0,m;
void setup() {
Serial.begin(9600);Wire.begin();
mcp.setConfig(3,3);// 12 14 16 18 bit - 0-3 // 1x 2x 4x 8x gain - 0-3
lcd.init();lcd.backlight();
}
void loop() {
/// авто переключние диапазонов /////////
dig = mcp.readWire();
if(dig>131070&&n==0){mcp.setConfig(3,2);delay(50);n=1;}
if(dig>131070&&n==1){mcp.setConfig(3,1);delay(50);n=2;}
if(dig>131070&&n==2){mcp.setConfig(3,0);delay(50);n=3;}
if(dig<65000&&n==1){mcp.setConfig(3,3);delay(50);n=0;}
if(dig<65000&&n==2){mcp.setConfig(3,2);delay(50);n=1;}
if(dig<65000&&n==3){mcp.setConfig(3,1);delay(50);n=2;}
// калибровка диапазонов //
dig = mcp.readWire();
if(n==0){u = dig * 0.2569 /131071;}// n0 8 Om
if(n==1){u = dig * 0.5156 /131071;}// n1 18 Om
if(n==2){u = dig * 1.0270 /131071;}// n2 38 Om
if(n==3){u = dig * 2.0510 /131071;}// n3 170 Om
/// измерение ///////////////////////////
while(i<20){i++;dig = mcp.readWire();
dig_sum = dig_sum+dig;delay(50);}
i=0;dig=dig_sum/20;dig_sum=0;
/// монитор порта ////////////////////////
Serial.print(dig);Serial.print(" u=");Serial.print(u,6);Serial.print(" r=");
Serial.print(((r_ogr*u)/(u3300-u))-r_0,4-n);Serial.print(" n=");Serial.println(n);
switch(n){
case 0: m=4;break;
case 1: m=3;break;
case 2: m=3;break;
case 3: m=2;break;
}
r = ((r_ogr*u)/(u3300-u))-r_0;
if(r>172){lcd.setCursor(0, 0);lcd.print(" R > 172.00 Om ");}
else{lcd.setCursor(0, 0);lcd.print(" R = ");lcd.print(r,m);lcd.print(" Om ");}
lcd.setCursor(0, 1);lcd.print(" N ");lcd.print(n);
if(r>172){lcd.setCursor(5, 1);lcd.print(" 0.000");lcd.print(" mA");}
else{lcd.setCursor(5, 1);lcd.print(" ");lcd.print((u3300/(r+r_ogr))*1000);lcd.print(" mA");}
}