В рамках данного проекта мы соберем простой омметр для электронного испытательного стенда, который может использоваться вместо мультиметра. Он будет полезен, когда просто нужно быстро измерить новые и бывшие в употреблении резисторы, чтобы отсортировать их для хранения или чтобы они соответствовали определенным значениям. Точность здесь не очень высокая для прецизионных измерений, но для получения значений сопротивления стандартных резисторов данное устройство вполне подойдет.

Особенностью данного омметра на основе Arduino является функция автоматического выбора диапазона при измерении различных резисторов.
Далее представлена схема омметра на основе Arduino Uno и ЖК-дисплея 16x2.

Вместо ЖК-дисплея для экономии числа выводов можно использовать OLED-дисплей, который можно подключить по шине I2C на линии A4 (SDA) и A5 (SCL).

Следующий код программы для Arduino позволяет реализовать простой омметр с автовыбором диапазона.
#include <Arduino.h>
#include <U8g2lib.h>
#define CH0 12
#define CH1 11
#define CH2 10
#define CH3 9
#define CH4 8
byte ch_number;
uint32_t res;
const uint32_t res_table[5] = {100, 1000, 10000, 100000ul, 1000000ul};
char _buffer[11];
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
void setup(void) {
// Serial.begin(9600);
// analogReference(EXTERNAL);
u8g2.begin();
u8g2.clearDisplay();
u8g2.setFont(u8g2_font_lubB14_tf);
u8g2.drawStr(10, 20, " < OHM >");
u8g2.drawStr(10, 40, "< METER >");
u8g2.setFont(u8g2_font_luRS10_tf);
u8g2.drawStr(0, 60, " by: f.w.mclennan");
u8g2.sendBuffer();
while (millis() < 4000) {
}
u8g2.clearDisplay();
u8g2.clearBuffer();
pinMode(CH0, OUTPUT);
pinMode(CH1, OUTPUT);
pinMode(CH2, OUTPUT);
pinMode(CH3, OUTPUT);
pinMode(CH4, OUTPUT);
ch_number = 4;
ch_select(ch_number);
}
void loop() {
// uint16_t volt_image = analogRead(A1) + 1;
uint16_t volt_image = analogRead(A1);
if (volt_image >= 550 && ch_number < 4) {
ch_number++;
ch_select(ch_number);
delay(50);
return;
}
if (volt_image <= 90 && ch_number > 0) {
ch_number--;
ch_select(ch_number);
delay(50);
return;
}
if (volt_image < 900) {
// uint16_t volt_image = analogRead(A1);
float value = (float)volt_image * res / (1024 - volt_image);
if (value < 1000.0)
sprintf(_buffer, "%03u.%1u Ohm ", (uint16_t)value, (uint16_t)(value * 10) % 10);
else if (value < 10000.0)
sprintf(_buffer, "%1u.%03u Kohm", (uint16_t)(value / 1000), (uint16_t)value % 1000);
else if (value < 100000.0)
sprintf(_buffer, "%02u.%02u Kohm", (uint16_t)(value / 1000), (uint16_t)(value / 10) % 100);
else if (value < 1000000.0)
sprintf(_buffer, "%03u.%1u Kohm", (uint16_t)(value / 1000), (uint16_t)(value / 100) % 10);
else
sprintf(_buffer, "%1u.%03u Mohm", (uint16_t)(value / 1000000), (uint16_t)(value / 1000) % 1000);
}
else
sprintf(_buffer, "<INFINITY>");
u8g2.setFont(u8g2_font_lubB14_tf);
u8g2.clearBuffer();
u8g2.setCursor(5, 30);
u8g2.print(_buffer);
u8g2.sendBuffer();
// Serial.println(_buffer);
// Serial.println();
delay(1000);
}
void ch_select(byte n) {
switch (n) {
case 0:
digitalWrite(CH0, LOW);
digitalWrite(CH1, HIGH);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);
break;
case 1:
digitalWrite(CH0, HIGH);
digitalWrite(CH1, LOW);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);
break;
case 2:
digitalWrite(CH0, HIGH);
digitalWrite(CH1, HIGH);
digitalWrite(CH2, LOW);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);
break;
case 3:
digitalWrite(CH0, HIGH);
digitalWrite(CH1, HIGH);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, LOW);
digitalWrite(CH4, HIGH);
break;
case 4:
digitalWrite(CH0, HIGH);
digitalWrite(CH1, HIGH);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, LOW);
}
res = res_table[n];
}
© digitrode.ru