цифровая электроника
вычислительная техника
встраиваемые системы

 



Омметр с автоматическим выбором диапазона на основе Arduino

Автор: Mike(admin) от 1-05-2023, 03:55

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


Омметр с автоматическим выбором диапазона на основе Arduino

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


Далее представлена схема омметра на основе Arduino Uno и ЖК-дисплея 16x2.


Омметр с автоматическим выбором диапазона на основе Arduino

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


Омметр с автоматическим выбором диапазона на основе Arduino

Следующий код программы для 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


Теги: Arduino, омметр




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий