#include <LiquidCrystal_I2C.h> // Library for LCD
#define GetValue_pin 11
#define PrevColor_pin 10
#define NextColor_pin 9
#define EnterColor_pin 8
#define X100_pin 4
#define X1K_pin 5
#define X10K_pin 6
#define X100K_pin 7
#define X100_pin2 2
#define X1K_pin2 3
#define X10K_pin2 12
#define X100K_pin2 13
#define R_meter 0
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
class RTest {
private:
float V_sensor;
float R_val_return;
String sel_color[5];
String sel_alias[5];
uint32_t RBase_val[4] = {
200,//X100_val
2000,//X1K_val
33000,//X10K_val
200000//X100K_val
};
float sel_multiplier;
float sel_tolerance;
float V_ref = 5.0;
String color_nval;
String color_val[12] = {
"BLACK", "BROWN", "RED", "ORANGE", "YELLOW", "GREEN",
"BLUE", "VIOLET", "GRAY", "WHITE", "GOLD", "SILVER"
};
String color_als[12] = {
"BLK", "BRN", "RED", "ORN", "YLW", "GRN",
"BLU", "VIO", "GRY", "WHT", "GLD", "SLV"
};
float color_multiplier[12] = {
1, 10, 100, 1000, 10000, 100000, 1000000,
10000000, 100000000, 1000000000, 0.1, 0.01
};
float color_tolerance[2] = {
0.05, 0.1
};
public:
uint32_t* get_Rbase() {
return RBase_val;
}
void reset_color() {
color_nval = "";
}
void set_color(uint8_t c_index, uint8_t band_index) {
sel_color[band_index] = color_val[c_index];
sel_alias[band_index] = color_als[c_index];
if (band_index < 3) {
color_nval = color_nval + (String)c_index;
} else {
color_nval = color_nval;
}
if (band_index == 3) {
sel_multiplier = (float)color_multiplier[c_index];
}
if (band_index == 4 && c_index > 9) {
sel_tolerance = color_tolerance[(c_index - 10)];
} else {
sel_tolerance = 0;
}
}
float get_tolerance() {
return sel_tolerance;
}
String* get_colors() {
return sel_color;
}
String* get_col_als() {
return sel_alias;
}
String* clear_color_als() {
for (uint8_t i = 1; i <= 5; i++ ) {
sel_alias[i] = "";
}
}
String get_color_num() {
return color_nval;
}
float get_multiplier() {
return sel_multiplier;
}
String get_color_lcd(uint8_t c_index) {
return color_val[c_index];
}
float get_rval(float r_in, float sensor_val) {
V_sensor = (((float)V_ref / (float)1023) * (float)sensor_val);
R_val_return = (V_sensor * r_in) / ((float)V_ref - V_sensor);
return R_val_return;
}
float translate_color(String color_numval, float color_multiplier) {
float retvalue = color_numval.toFloat() * color_multiplier;
color_nval = "";
return retvalue;
}
String check_kilo(float resistance) {
String retval;
float rvalf;
if (resistance > 999) {
rvalf = resistance / 1000;
rvalf = (rvalf - (int)rvalf);
if (rvalf > 0) {
retval = (String)(resistance / 1000) + "K";
} else {
retval = (String)((float)resistance / 1000) + "K";
}
} else {
retval = (String)((int)resistance);
}
return retval;
}
float cmp_sample(float baseR, float baseTol, float sampleR) {
float minR = baseR - (baseR * baseTol);
float maxR = baseR + (baseR * baseTol);
float retvl;
if (sampleR < minR || sampleR > maxR) {
retvl = 0;
} else {
retvl = sampleR;
}
return retvl;
}
};
void setup() {
Serial.begin(115200);
pinMode(PrevColor_pin, INPUT);
pinMode(NextColor_pin, INPUT);
pinMode(EnterColor_pin, INPUT);
pinMode(GetValue_pin, INPUT);
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
lcd.print("4 Band Ohm Meter");
}
RTest rtest;
uint8_t band_index = 1;
uint8_t start_cal = 0;
uint8_t band_lbl_index = 1;
uint8_t color_index = 0;
uint8_t band_mon = 12;
bool band_show = 0;
uint8_t trn_cnt = 0;
void loop() {
int PrevButton = digitalRead(PrevColor_pin);
int NextButton = digitalRead(NextColor_pin);
int EnterButton = digitalRead(EnterColor_pin);
int GetValueButton = digitalRead(GetValue_pin);
delay(10);
if (GetValueButton == 1 && EnterButton == 1) {
start_cal = 0;
lcd.clear();
lcd.print("4 Band Ohm Meter");
delay(300);
}
if (PrevButton == 1 && start_cal == 1 && band_show == true) {
color_index--;
if (color_index > 11) {
color_index = 0;
}
if (band_lbl_index == 4 && color_index < 10) {
color_index = 10;
}
if (band_lbl_index == 1 && color_index == 0) {
color_index ++;
}
lcd.setCursor(7, 0);
lcd.print(rtest.get_color_lcd(color_index));
lcd.print(" ");
delay(300);
}
if (NextButton == 1 && start_cal == 1 && band_show == true) {
color_index++;
if (color_index > 11) {
color_index = 11;
}
if (band_lbl_index == 4 && color_index < 10) {
color_index = 10;
}
lcd.setCursor(7, 0);
lcd.print(rtest.get_color_lcd(color_index));
lcd.print(" ");
delay(300);
}
if (EnterButton == 1 && start_cal == 1 && GetValueButton == 0 ) {
band_show = true;
band_lbl_index++;
trn_cnt++;
lcd.setCursor(0, 1);
lcd.print(" ");
rtest.set_color(color_index, band_index);
String* sh_color = rtest.get_col_als();
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(sh_color[1]);
lcd.setCursor(4, 1);
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.print(sh_color[2]);
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(sh_color[3]);
lcd.setCursor(12, 1);
lcd.print(" ");
lcd.setCursor(12, 1);
lcd.print(sh_color[4]);
if (band_lbl_index == 5) {
band_lbl_index = 1;
}
String band_label = "BAND " + (String)band_lbl_index + ":";
lcd.setCursor(0, 0);
lcd.print(band_label);
lcd.setCursor(7, 0);
lcd.print(" ");
band_index++;
if (band_index > 4) {
band_index = 1;
}
color_index = 0;
delay(300);
}
if (GetValueButton == 1 && EnterButton == 0 ) {
if (start_cal == 0) {
lcd.clear();
band_index = 1;
String band_label = "BAND 1:";
lcd.setCursor(0, 0);
lcd.print(band_label);
band_show = true;
}
if (start_cal == 1 && trn_cnt > 3) {
pinMode(X100_pin, INPUT);
pinMode(X1K_pin, INPUT);
pinMode(X10K_pin, INPUT);
pinMode(X100K_pin, INPUT);
pinMode(X100_pin2, INPUT);
pinMode(X1K_pin2, INPUT);
pinMode(X10K_pin2, INPUT);
pinMode(X100K_pin2, INPUT);
band_show = false;
lcd.clear();
uint32_t* RBase_val = rtest.get_Rbase();
String* RInput_colors = rtest.get_colors();
String color_nuvl = rtest.get_color_num();
float Rmultiplier = rtest.get_multiplier();
uint8_t Rtolerance = rtest.get_tolerance() * 100;
float color_value = rtest.translate_color(color_nuvl, Rmultiplier);
float res_sam;
float analog_val;
float analog_disp;
uint8_t sample_delay = 1000;
uint8_t disp_delay = 3000;
for (uint8_t i = 0; i < 4; i++) {
pinMode(X100_pin, OUTPUT);
digitalWrite(X100_pin, HIGH);
res_sam = rtest.get_rval(RBase_val[0], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X100_pin, INPUT);
pinMode(X1K_pin, OUTPUT);
digitalWrite(X1K_pin, HIGH);
res_sam = rtest.get_rval(RBase_val[1], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X1K_pin, INPUT);
pinMode(X10K_pin, OUTPUT);
digitalWrite(X10K_pin, HIGH);
res_sam = rtest.get_rval(RBase_val[2], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X10K_pin, INPUT);
pinMode(X100K_pin, OUTPUT);
digitalWrite(X100K_pin, HIGH);
res_sam = rtest.get_rval(RBase_val[3], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X100K_pin, INPUT);
pinMode(X100_pin2, OUTPUT);
digitalWrite(X100_pin2, HIGH);
res_sam = rtest.get_rval(RBase_val[0], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X100_pin2, INPUT);
pinMode(X1K_pin2, OUTPUT);
digitalWrite(X1K_pin2, HIGH);
res_sam = rtest.get_rval(RBase_val[1], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X1K_pin2, INPUT);
pinMode(X10K_pin2, OUTPUT);
digitalWrite(X10K_pin2, HIGH);
res_sam = rtest.get_rval(RBase_val[2], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X10K_pin2, INPUT);
pinMode(X100K_pin2, OUTPUT);
digitalWrite(X100K_pin2, HIGH);
res_sam = rtest.get_rval(RBase_val[3], analogRead(R_meter));
analog_val = rtest.cmp_sample(color_value, rtest.get_tolerance(), res_sam);
if (analog_val > 0) {
analog_disp = analog_val;
}
delay(sample_delay);
pinMode(X100K_pin2, INPUT);
}
String band_label = "INPUT:" + rtest.check_kilo(color_value) + " " + (String)Rtolerance + "%";
String samp_label;// = "ACTUAL: " + rtest.check_kilo(analog_disp);
float rmin, rmax;
String act_label = "ACTUAL: " + (String)rtest.check_kilo(analog_disp);
// String act_label = "ACTUAL: " + (String)rtest.check_kilo(92100);
rmin = ((float)color_value - ((float)color_value * ((float)Rtolerance / 100)));
rmax = ((float)color_value + ((float)color_value * ((float)Rtolerance / 100)));
Serial.println("MIN: " + (String)rmin);
Serial.println("COLOR: " + (String)color_value);
Serial.println("MAX: " + (String)rmax);
Serial.println("ACTUAL: " + (String)analog_disp);
Serial.println("ACT DISP: " + act_label);
for (uint8_t r = 0; r < 4; r++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(act_label);
delay(disp_delay);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(band_label);
if (analog_disp < rmin || analog_disp > rmax) {
samp_label = "BAD RESISTOR";
} else {
samp_label = "GOOD RESISTOR";
}
lcd.setCursor(0, 1);
lcd.print(samp_label);
delay(disp_delay);
}
band_index = 0;
//color_index = 0;
band_lbl_index = 0;
trn_cnt = 0;
rtest.reset_color();
rtest.clear_color_als();
}
start_cal = 1;
delay(50);
}
//840-e025-00-004
}