76 (2022-01-13 00:55:47 отредактировано sanj76a)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Я б собрал на Ардуино, но из за одного омметра тратить 1115 не охота(дорого стоит), а Мег8, у меня горсть.
А как насчет 3 в одном?

77

Re: Миллиомметр 0 — 20 Ом (Arduino)

http://rcl-radio.ru/?p=82486

вот нашел. Какой программатор указать?

78

Re: Миллиомметр 0 — 20 Ом (Arduino)

USBASP

79 (2022-01-13 09:58:05 отредактировано sanj76a)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Нужно подобрать напряжение для каждого диапазона

if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
if(u_iz>1000&&n==2){n=3;}
if(n==3){ads.setGain(GAIN_TWO);multiplier = 0.0625;}
if(u_iz>2000&&n==3){n=4;}
if(n==4){ads.setGain(GAIN_ONE);multiplier = 0.125;}


как это сделать?
-----------

сдесь вы писали: http://rcl-radio.ru/?p=82486

Для прошивки ATmega8 нам понадобится программатор, в качестве программатора я буду использовать Arduino UNO.
А можно использовать Arduino Nano?

80

Re: Миллиомметр 0 — 20 Ом (Arduino)

Измеряете точное сопротивление, подбираете multiplier чтобы у Вас были точные показания

81

Re: Миллиомметр 0 — 20 Ом (Arduino)

liman324 пишет:

Измеряете точное сопротивление, подбираете multiplier чтобы у Вас были точные показания


подбираете multiplier - не понял,подробнее

82

Re: Миллиомметр 0 — 20 Ом (Arduino)

multiplier = 0.0078125; это первый предел
multiplier = 0.015625; второй  так далее

83

Re: Миллиомметр 0 — 20 Ом (Arduino)

liman324 пишет:

multiplier = 0.0078125; это первый предел
multiplier = 0.015625; второй  так далее

Извините , я так и не понял. Что за ПРЕДЕЛЫ и где измерять пределы?
На сопротевлении 100 Ом?

84

Re: Миллиомметр 0 — 20 Ом (Arduino)

в loop добавьте Serial.println(n);
что бы знать какой предел выбран пр измерении сопротивления, далее изменяете multiplier для точного измерения сопротивления

85

Re: Миллиомметр 0 — 20 Ом (Arduino)

какой рабочий код для атмеги 8 ?

86

Re: Миллиомметр 0 — 20 Ом (Arduino)

код для atmega8 полностью совместим с atmega328

87 (2022-01-23 13:13:56 отредактировано sanj76a)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Arduino: 1.8.19 (Windows 10), Плата:"ATmega8, Yes (UART0), EEPROM retained, BOD 2.7V, LTO disabled, External 8 MHz"

c:/users/sanj49/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: C:\Temp\arduino_build_556621/ArduinoISP.ino.elf section `.text' will not fit in region `text'

c:/users/sanj49/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: region `text' overflowed by 958 bytes

collect2.exe: error: ld returned 1 exit status

exit status 1

Ошибка компиляции для платы ATmega8.

88

Re: Миллиомметр 0 — 20 Ом (Arduino)

Опубликуйте скетч

89

Re: Миллиомметр 0 — 20 Ом (Arduino)

Скетч сильно большой, уменьшите размер

90

Re: Миллиомметр 0 — 20 Ом (Arduino)

Скетч использует 7306 байт (95%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 354 байт (34%) динамической памяти, оставляя 670 байт для локальных переменных. Максимум: 1024 байт.

Немного уменьшил, теперь будет компилироваться

#include <Wire.h>
#include <Adafruit_ADS1015.h>//https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

float multiplier = 0.0078125;
const int u_pogr=10;       // 10 мВ - погрешность ADS1115 при измерении 5 В
const float r_ogr=100.00;  // эталонное сопротивление 100 Ом
float u3300;
int  u_digital;
byte n,k;
long u_sum,u_an,x;
float u_iz,rx,rx_m;

void setup(void){lcd.begin(16, 2);ads.begin();delay(1000);}

void loop(){
  while(x<50){
x++;ads.setGain(GAIN_TWOTHIRDS);u3300=ads.readADC_SingleEnded(2)*0.1875-u_pogr;}
k++;if(k==60){x=0;k=0;}  // измерение напряжения 5В каждую минуту

if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
if(u_iz>1000&&n==2){n=3;}
if(n==3){ads.setGain(GAIN_TWO);multiplier = 0.0625;}
if(u_iz>2000&&n==3){n=4;}
if(n==4){ads.setGain(GAIN_ONE);multiplier = 0.125;}
if(u_iz>4000&&n==4){n=5;}
if(n==5){ads.setGain(GAIN_TWOTHIRDS);multiplier = 0.1875;}

if(u_iz<4000&&n==5){n=4;}
if(u_iz<2000&&n==4){n=3;}
if(u_iz<1000&&n==3){n=2;}
if(u_iz<500&&n==2){n=1;}
if(u_iz<250&&n==1){n=0;}

lcd.setCursor(1,0);
if(rx<1){rx_m=rx*1000;lcd.print("R = ");lcd.print(rx_m,1);lcd.print(" mOm");}
if(rx>=1&&rx<100){lcd.print("R = ");lcd.print(rx,3);lcd.print(" Om");}
if(rx>=100&&rx<1000){lcd.print("R = ");lcd.print(rx,2);lcd.print(" Om");}
if(rx>=1000){lcd.print(" Rx > 1000 Om    ");}
lcd.setCursor(1,1);lcd.print("U = ");lcd.print(u3300,1);lcd.print(" mV");
u_sum=0;
for(int i=0;i<100;i++){  // измерение
u_digital = ads.readADC_Differential_0_1();
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/100;
u_iz=u_an * multiplier;
//rx=(u3300/((u3300-u_iz)/r_ogr))-r_ogr;
rx = (r_ogr*u_iz)/(u3300-u_iz);

lcd.clear();
}

91

Re: Миллиомметр 0 — 20 Ом (Arduino)

Если укажите в настройках платы NO BOOTLOADER, свободного места будет еще больше.

92

Re: Миллиомметр 0 — 20 Ом (Arduino)

liman324 пишет:

Если укажите в настройках платы NO BOOTLOADER, свободного места будет еще больше.

NO BOOTLOADER, не изменял, оставил как есть

скеч загрузился

93 (2022-01-23 14:08:49 отредактировано sanj76a)

Re: Миллиомметр 0 — 20 Ом (Arduino)

до скольки оМ измеряет єтот скетч?

94

Re: Миллиомметр 0 — 20 Ом (Arduino)

до 1000 Ом

95

Re: Миллиомметр 0 — 20 Ом (Arduino)

Обновление показаний примерно через 10 сек.
Очень неудобно, долго ждать. Как уменьшить время вывода на lsd

96 (2023-07-06 01:17:53 отредактировано jdevires)

Re: Миллиомметр 0 — 20 Ом (Arduino)

Спасибо за отличный проект.
Я использовал его с 0.91"  I2C 128×32 OLED-экраном.
Извините за языковые ошибки, я англичанин.

/*
  Milliommeter 0 — 1000 Ohm (Arduino) using ADS1115 ADC
  Author: liman28
  From here: http://rcl-radio.ru/?p=45805 ; http://forum.rcl-radio.ru/viewtopic.php?id=39
  Mods by JdeV: V1.0  05/07/2023

  To disable Adafruit splash logo:
  Uncomment //  " #define SSD1306_NO_SPLASH "  in Adafruit_SSD1306.h , latest version 2.5.7
*/

#include <Wire.h>
#include <Adafruit_ADS1X15.h>  //https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <Adafruit_SSD1306.h>

Adafruit_ADS1115 ads;  //(0x48);

#define SCREEN_WIDATA_PINH 128     // OLED display Width, in pixels
#define SCREEN_HEIGHT 32           // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C 


Adafruit_SSD1306 display(SCREEN_WIDATA_PINH, SCREEN_HEIGHT, &Wire, -1);


float multiplier = 0.0078125;
const int u_pogr = -0.6;          // 10 mV - ADS1115 error when measuring 5 V
const float r_ogr = 99.15;        // reference resistance 100 ohm Ref
float u3300;                      // Vdd 5V supply
int u_digital;
byte n, k;
long u_sum, u_an, x;
float u_iz, rx, rx_m;

void setup(void) {
 
  Serial.begin(9600);
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);       // Don't proceed, loop forever
  }

  ads.begin();

  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    while (1);
  }
  
    
    delay(10);
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.print("Milliohm Meter"); 
    display.setCursor(0,10);
    display.print("0 - 1kOhm"); 
    display.setCursor(0,20);
    display.print("Designed by: Liman28");
    display.display();
    delay(3000);
    display.clearDisplay();
}

void loop() {
  while (x < 50) {
    x++;
    ads.setGain(GAIN_TWOTHIRDS);
    u3300 = ads.readADC_SingleEnded(2) * 0.1875 - u_pogr;
  }
  k++;                              // measure 5V supply every minute
  if (k == 60) {
    x = 0;
    k = 0;
  }  

  if (n == 0) {
    ads.setGain(GAIN_SIXTEEN);
    multiplier = 0.0078125;
  }
  if (u_iz > 250 && n == 0) { n = 1; }
  if (n == 1) {
    ads.setGain(GAIN_EIGHT);
    multiplier = 0.015625;
  }
  if (u_iz > 500 && n == 1) { n = 2; }
  if (n == 2) {
    ads.setGain(GAIN_FOUR);
    multiplier = 0.03125;
  }
  if (u_iz > 1000 && n == 2) { n = 3; }
  if (n == 3) {
    ads.setGain(GAIN_TWO);
    multiplier = 0.0625;
  }
  if (u_iz > 2000 && n == 3) { n = 4; }
  if (n == 4) {
    ads.setGain(GAIN_ONE);
    multiplier = 0.125;
  }
  if (u_iz > 4000 && n == 4) { n = 5; }
  if (n == 5) {
    ads.setGain(GAIN_TWOTHIRDS);
    multiplier = 0.1875;
  }

  if (u_iz < 4000 && n == 5) { n = 4; }
  if (u_iz < 2000 && n == 4) { n = 3; }
  if (u_iz < 1000 && n == 3) { n = 2; }
  if (u_iz < 500 && n == 2) { n = 1; }
  if (u_iz < 250 && n == 1) { n = 0; }

  
   if (u_iz > 4950) {                              // if probes open (value to be calibrated with 100k resistor, make it little more)
    rx = 0.001;
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(5,10);
    display.print("No Read"); 
    display.display();
    display.clearDisplay(); 
  }

  if (rx < 0.1 && rx > 0.005) {
    rx_m = rx * 1000;
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,7);
    display.print(rx_m, 3);
    display.print(" m");
    ohmSymbol();
  }

    if (rx < 1 && rx >= 0.1) {
    rx_m = rx * 1000;
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,7);
    display.print(rx_m, 2);
    display.print(" m");
    ohmSymbol();
  }

 if (rx >= 1 && rx < 100) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,7);
    display.print(rx,3);
    display.print(" ");
    ohmSymbol();
  }

  if (rx >= 100 && rx < 1100) {
     display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,7);
    display.print(rx,2); 
    ohmSymbol();
  }

  if (rx >= 1100) { 
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,7);
    display.print("Rx > 1k"); 
    ohmSymbol();
  }

 // Serial.print("V = ");
 // Serial.print(u3300, 1);
 // Serial.println(" mV");

  u_sum = 0;
  for (int i = 0; i < 100; i++) {                     // Value ??
    u_digital = ads.readADC_Differential_0_1();
    u_sum = u_sum + u_digital;
    delay(1);
  }
  u_an = u_sum / 100;
  u_iz = u_an * multiplier;
  //rx=(u3300/((u3300-u_iz)/r_ogr))-r_ogr;
  rx = (r_ogr * u_iz) / (u3300 - u_iz);

  Serial.print("Rx: ");Serial.print(rx);  Serial.print("  mV: "); Serial.print(u_iz,1);  Serial.print("   Multiplier: "); Serial.println(n); 

  display.clearDisplay(); 

}


void ohmSymbol() {

    static const unsigned char PROGMEM omega_bmp[] =     // omega (ohm) symbol
    { B00000011, B11000000,
      B00001111, B11110000,
      B00111000, B00011100,
      B01100000, B00000110,
      B01100000, B00000110,
      B11000000, B00000011,
      B11000000, B00000011,
      B11000000, B00000011,
      B11000000, B00000011,
      B11000000, B00000011,
      B01100000, B00000110,
      B01100000, B00000110,
      B01100000, B00000110,
      B00110000, B00001100,
      B11111000, B00011111,
      B11111100, B00111111 };

    // display omega (ohms) symbol
    display.drawBitmap(100,5 , omega_bmp, 16, 16, WHITE);
    display.display();
}

http://forum.rcl-radio.ru/uploads/images/2023/07/73c591b2bee401f118aeb2a28096b26f.jpg
http://forum.rcl-radio.ru/uploads/images/2023/07/91ab50b0788233ae4e73bc8cc95ca952.jpg