Измеритель индуктивности на Arduino

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 20 ноября 2020, 21:38

phpBB [media]


Встретился в интернете проект измерителя индуктивности на Arduino. Решил его повторить - в итоге что то измеряет. Но так как номинал дросселей мне не известен - про точность измерений ничего пока сказать не могу.

Измеритель индуктивности на Arduino.png
Измеритель индуктивности на Arduino
Измеритель индуктивности на Arduino.png (74.83 КБ) 3446 просмотров

Измеритель индуктивности на Arduino 1.png
Измеритель индуктивности на Arduino

Код: Выделить всё

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);   //Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой 

//13 - вход в схему (подключается к резистору 150 Ом), 11 - выход компаратора / операционного усилителя..
double pulse, frequency, capacitance, inductance;
void setup(){
  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  pinMode(11, INPUT);
  pinMode(13, OUTPUT);
  Serial.println("Why hello!");
  delay(200);
}
void loop(){
  digitalWrite(13, HIGH);
  delay(5);//дать время зарядить индуктор.
  digitalWrite(13,LOW);
  delayMicroseconds(100); //убедитесь, что резонанс измерен
  pulse = pulseIn(11,HIGH,5000);//возвращает 0, если таймаут
  if(pulse > 0.1){ //если тайм-аут не произошел и потребовалось чтение:
    
    
//  #error вставьте здесь используемое значение емкости. В настоящее время используется 2 мкФ. Удалите эту строку после этого
  capacitance = 2.E-6; // - вставьте здесь значение
  
  
  frequency 
= 1.E6/(2*pulse);
  inductance = 1./(capacitance*frequency*frequency*4.*3.14159*3.14159);//один из моих профессионалов сказал мне просто делать такие квадраты
  inductance *= 1E6; // обратите внимание, что это то же самое, что сказать  inductance = inductance*1E6

  //Serial print
  Serial.print("High for uS:");
  Serial.print( pulse );
  Serial.print("\tfrequency Hz:");
  Serial.print( frequency );
  Serial.print("\tinductance uH:");
  Serial.println( inductance );
  delay(100);

  //LCD print
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd
.print("Inductance:");
  lcd.setCursor(0,1); 
  lcd
.print(inductance);
  lcd.setCursor(14,1); 
  lcd
.print("uH");          
  delay
(100);
  }

_http://electronoobs.com/eng_arduino_tut10_3.php
[center]i love you [s]mxIni[/s] Mysql[/center]


Arduino
Сержант
Сержант
Аватара
Arduino
Сержант
Сержант
Сообщения: 64
Зарегистрирован: 19 апреля 2017
С нами: 6 лет 11 месяцев

#2 Arduino » 20 ноября 2020, 22:15

phpBB [media]



Вот ещё на подобии такого же.

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#3 Дим » 23 ноября 2020, 11:00

Немного доработал код и собрал в корпус. Позже добавлю видео.

Код: Выделить всё

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);   //Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой 
//13 - вход в схему (подключается к резистору 150 Ом), 11 - выход компаратора / операционного усилителя..
double pulsefrequencycapacitanceinductance;
void setup(){
  
lcd.init();
  
lcd.backlight();
  
Serial.begin(115200);
  
pinMode(11INPUT);
  
pinMode(13OUTPUT);
  
initBar2();
  for(
int perc=0;perc<100;perc++)
  {
   
fillBar2(0116perc);  //fillBar2 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
   
lcd.setCursor(5,0);   
   
lcd.print("Loading");
  } 
  
lcd.clear(); 
  
lcd.setCursor(0,0);   
  
lcd.print("Inductance meter");
  
lcd.setCursor(1,1);   
  
lcd.print("Powered by Dim");
  
delay(3000);
}
void loop(){
  
digitalWrite(13HIGH);
  
delay(5);//дать время зарядить индуктор.
  
digitalWrite(13,LOW);
  
delayMicroseconds(100); //убедитесь, что резонанс измерен
  
pulse pulseIn(11,HIGH,5000);//возвращает 0, если таймаут
  
if(pulse 0.1){ //если тайм-аут не произошел и потребовалось чтение:     
  //  #error вставьте здесь используемое значение емкости. В настоящее время используется 2 мкФ. Удалите эту строку после этого
     
capacitance 0.914E-6// Вводим емкость конденсатора 0.515E-6 = 0,515 мКф(uF)
    
frequency 1.E6/(2*pulse);
    
inductance 1./(capacitance*frequency*frequency*4.*3.14159*3.14159);//один из моих профессионалов сказал мне просто делать такие квадраты
    
inductance *= 1E6// обратите внимание, что это то же самое, что сказать  inductance = inductance*1E6 
    //Serial print
    
Serial.print("High for uS:");
    
Serial.print( pulse );
    
Serial.print("\tfrequency Hz:");
    
Serial.print( frequency );
    
Serial.print("\tinductance uH:");
    
Serial.printlninductance );
    
delay(100);
    
//LCD print
    
lcd.clear();
    
lcd.setCursor(0,0);  
    
lcd.print(inductance);
    
lcd.setCursor(14,0); 
    
lcd.print("uH");    
    
lcd.setCursor(0,1); 
    
lcd.print(frequency);   
    
lcd.setCursor(14,1); 
    
lcd.print("Hz:");     
    
delay(100);
  }
  else
  {
    
lcd.clear();
    
lcd.setCursor(5,0);   
    
lcd.print("ERROR"); 
    
lcd.setCursor(0,1);  
    
lcd.print("No contact"); 
    for(
int perc=0;perc<100;perc++)
    {
      
fillBar2(1115perc);
    }
  }


void initBar2() {
  
// необходимые символы для работы
  // создано в http://maxpromer.github.io/LCD-Character-Creator/
  
byte right_empty[8] = {0b11111,  0b00001,  0b00001,  0b00001,  0b00001,  0b00001,  0b00001,  0b11111};
  
byte left_empty[8] = {0b11111,  0b10000,  0b10000,  0b10000,  0b10000,  0b10000,  0b10000,  0b11111};
  
byte center_empty[8] = {0b111110b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111};
  
byte left_full[8] = {0b111110b100000b101110b101110b101110b101110b100000b11111};
  
byte right_full[8] = {0b111110b000010b111010b111010b111010b111010b000010b11111};
  
byte center_full[8] = {0b111110b000000b111110b111110b111110b111110b000000b11111};
  
lcd.createChar(0left_empty);
  
lcd.createChar(1center_empty);
  
lcd.createChar(2right_empty);
  
lcd.createChar(3left_full);
  
lcd.createChar(4center_full);
  
lcd.createChar(5right_full);
}

void fillBar2(byte start_posbyte rowbyte bar_lengthbyte fill_percent) {
  
byte infill round((float)bar_length fill_percent 100);
  
lcd.setCursor(start_posrow);
  if (
infill == 0lcd.write(0);
  else 
lcd.write(3);
  for (
int n 1bar_length 1n++) {
    if (
infilllcd.write(4);
    if (
>= infilllcd.write(1);
  }
  if (
infill == bar_lengthlcd.write(5);
  else 
lcd.write(2);
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#4 Дим » 23 ноября 2020, 20:17

phpBB [media]


Зная точно номиналы двух дросселей - 150 uH (белый) и 6800 uH (серый), выставил capacitance = 0.747E-6; хотя ёмкость конденсатора 0,914 uF. Теперь показания стали более менее точными, но мне особо точные и не нужны.

Код: Выделить всё

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);   //Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой 
//13 - вход в схему (подключается к резистору 150 Ом), 11 - выход компаратора / операционного усилителя..
double pulse, frequency, capacitance, inductance;
void setup(){
  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  pinMode(11, INPUT);
  pinMode(13, OUTPUT);
  initBar2();
  for(int perc=0;perc<100;perc++)
  {
   fillBar2(0, 1, 16, perc);  //fillBar2 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
   lcd.setCursor(5,0);   
   lcd
.print("Loading");
  } 
  lcd
.clear(); 
  lcd
.setCursor(0,0);   
  lcd
.print("Inductance meter");
  lcd.setCursor(1,1);   
  lcd
.print("Powered by Dim");
  delay(3000);
}
void loop(){
  digitalWrite(13, HIGH);
  delay(5);//дать время зарядить индуктор.
  digitalWrite(13,LOW);
  delayMicroseconds(100); //убедитесь, что резонанс измерен
  pulse = pulseIn(11,HIGH,5000);//возвращает 0, если таймаут
  if(pulse > 0.1){ //если тайм-аут не произошел и потребовалось чтение:     
  //  #error вставьте здесь используемое значение емкости. В настоящее время используется 2 мкФ. Удалите эту строку после этого
 //================= 
    capacitance = 0.747E-6; // Вводим емкость конденсатора 0.914E-6 = 0,914 мКф(uF)
// Хотя емкость установленного конденсатора 0.914. методом тыка пришлось выставить 0.747.
 //=================   
    frequency = 1.E6/(2*pulse);
    inductance = 1./(capacitance*frequency*frequency*4.*3.14159*3.14159);//один из моих профессионалов сказал мне просто делать такие квадраты
    inductance *= 1E6; // обратите внимание, что это то же самое, что сказать  inductance = inductance*1E6 
    //Serial print
    Serial.print("High for uS:");
    Serial.print( pulse );
    Serial.print("\tfrequency Hz:");
    Serial.print( frequency );
    Serial.print("\tinductance uH:");
    Serial.println( inductance );
    delay(100);
    //LCD print
    lcd.clear();
    lcd.setCursor(0,0);  
    lcd
.print(inductance);
    lcd.setCursor(14,0); 
    lcd
.print("uH");    
    lcd
.setCursor(0,1); 
    lcd
.print(frequency);   
    lcd
.setCursor(14,1); 
    lcd
.print("Hz:");     
    delay
(100);
  }
  else
  
{
    lcd.clear();
    lcd.setCursor(5,0);   
    lcd
.print("ERROR"); 
    lcd
.setCursor(0,1);  
    lcd
.print("No contact"); 
    for
(int perc=0;perc<100;perc++)
    {
      fillBar2(11, 1, 5, perc);
    }
  }
}
 

void initBar2
() {
  // необходимые символы для работы
  // создано в http://maxpromer.github.io/LCD-Character-Creator/
  byte right_empty[8] = {0b11111,  0b00001,  0b00001,  0b00001,  0b00001,  0b00001,  0b00001,  0b11111};
  byte left_empty[8] = {0b11111,  0b10000,  0b10000,  0b10000,  0b10000,  0b10000,  0b10000,  0b11111};
  byte center_empty[8] = {0b11111, 0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111};
  byte left_full[8] = {0b11111, 0b10000, 0b10111, 0b10111, 0b10111, 0b10111, 0b10000, 0b11111};
  byte right_full[8] = {0b11111, 0b00001, 0b11101, 0b11101, 0b11101, 0b11101, 0b00001, 0b11111};
  byte center_full[8] = {0b11111, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b11111};
  lcd.createChar(0, left_empty);
  lcd.createChar(1, center_empty);
  lcd.createChar(2, right_empty);
  lcd.createChar(3, left_full);
  lcd.createChar(4, center_full);
  lcd.createChar(5, right_full);
}

void fillBar2(byte start_pos, byte row, byte bar_length, byte fill_percent) {
  byte infill = round((float)bar_length * fill_percent / 100);
  lcd.setCursor(start_pos, row);
  if (infill == 0) lcd.write(0);
  else lcd.write(3);
  for (int n = 1; n < bar_length - 1; n++) {
    if (< infill) lcd.write(4);
    if (>= infill) lcd.write(1);
  }
  if (infill == bar_length) lcd.write(5);
  else lcd.write(2);
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 7 гостей