Re: Миллиомметр 0 — 20 Ом (Arduino)
Я б собрал на Ардуино, но из за одного омметра тратить 1115 не охота(дорого стоит), а Мег8, у меня горсть.
А как насчет 3 в одном?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Законченные проекты → Миллиомметр 0 — 20 Ом (Arduino)
Я б собрал на Ардуино, но из за одного омметра тратить 1115 не охота(дорого стоит), а Мег8, у меня горсть.
А как насчет 3 в одном?
вот нашел. Какой программатор указать?
USBASP
Нужно подобрать напряжение для каждого диапазона
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?
Измеряете точное сопротивление, подбираете multiplier чтобы у Вас были точные показания
Измеряете точное сопротивление, подбираете multiplier чтобы у Вас были точные показания
подбираете multiplier - не понял,подробнее
multiplier = 0.0078125; это первый предел
multiplier = 0.015625; второй так далее
multiplier = 0.0078125; это первый предел
multiplier = 0.015625; второй так далее
Извините , я так и не понял. Что за ПРЕДЕЛЫ и где измерять пределы?
На сопротевлении 100 Ом?
в loop добавьте Serial.println(n);
что бы знать какой предел выбран пр измерении сопротивления, далее изменяете multiplier для точного измерения сопротивления
какой рабочий код для атмеги 8 ?
код для atmega8 полностью совместим с atmega328
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.
Опубликуйте скетч
Скетч сильно большой, уменьшите размер
Скетч использует 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();
}
Если укажите в настройках платы NO BOOTLOADER, свободного места будет еще больше.
Если укажите в настройках платы NO BOOTLOADER, свободного места будет еще больше.
NO BOOTLOADER, не изменял, оставил как есть
скеч загрузился
до скольки оМ измеряет єтот скетч?
до 1000 Ом
Обновление показаний примерно через 10 сек.
Очень неудобно, долго ждать. Как уменьшить время вывода на lsd
Спасибо за отличный проект.
Я использовал его с 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();
}
forum.rcl-radio.ru → Законченные проекты → Миллиомметр 0 — 20 Ом (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|