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

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1334
Joined: 5 Apr 2013
With us: 7 years 7 months

#1by Дим » 20 Nov 2020, 21:38

phpBB [media]


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

Измеритель индуктивности на Arduino.png
Измеритель индуктивности на Arduino
Измеритель индуктивности на Arduino.png (74.83 KiB) Viewed 145 times

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

Code: Select all

#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
i love you mxIni Mysql

! ! !


Arduino
Мл. сержант
Мл. сержант
Avatar
Arduino
Мл. сержант
Мл. сержант
Posts: 36
Joined: 19 Apr 2017
With us: 3 years 7 months

#2by Arduino » 20 Nov 2020, 22:15

phpBB [media]



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

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1334
Joined: 5 Apr 2013
With us: 7 years 7 months

#3by Дим » 23 Nov 2020, 11:00

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

Code: Select all

#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);
i love you mxIni Mysql

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1334
Joined: 5 Apr 2013
With us: 7 years 7 months

#4by Дим » 23 Nov 2020, 20:17

phpBB [media]


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

Code: Select all

#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);
i love you mxIni Mysql


  • Similar Topics
    Replies
    Views
    Last post

Return to “Программирование”

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest