Универсальный Ардуино пробник

svm
Offline
Зарегистрирован: 06.11.2016

В чем помогать? Что не работает?

satelit 2
Offline
Зарегистрирован: 04.12.2016

интернет тупит, пост продублировался. в проекте использован ардуино про мини 168 на 3.3 вольта, что бы питалось от лития. могу ли я на прямую запитать ардуинку через 3.3 вольтовый вход, что бы не терять просадку акума. я так понимаю атмега до 5.5 вольт работает

satelit 2
Offline
Зарегистрирован: 04.12.2016

показания сопромивлений не округляются в мар.

нашел ошибку, я нечайно стер округление сопротивлений

пиво мешает ))))))

satelit 2
Offline
Зарегистрирован: 04.12.2016

сопротивление не мерит. алгоритм скачал и инета, омметр, и минусовал свои 100к . показания не меняются ни на дисплее ни на мониторе порта. может где ошибка? ps напряжение мерит точно 

svm
Offline
Зарегистрирован: 06.11.2016

satelit 2 пишет:

сопротивление не мерит. алгоритм скачал и инета, омметр, и минусовал свои 100к . показания не меняются ни на дисплее ни на мониторе порта. может где ошибка?

А что выводит в монитор порта? Там у Вас много что выводится. И скетч тот-же или изменился?

satelit 2
Offline
Зарегистрирован: 04.12.2016

скетч не изменился, монитор пота выдает 100000 примерно, как раз подтягивающий резистор

svm
Offline
Зарегистрирован: 06.11.2016

satelit 2 пишет:

скетч не изменился, монитор пота выдает 100000 примерно, как раз подтягивающий резистор

100000 показывает  при измерении? А если щупы закорочены или разрыв , сколько тогда. Выведите в монитор еще Vin , Vout посмотрите как они меняются. хотя при такой схеме маленькие сопротивления измерить проблематично. 

И почему в последней схеме А1 соединен с резистором. В предыдущей он был подключен ко второму щупу. Тогда логика была. А в этой при замыкании щупа на землю А1 - выгорает. Да и при измерении напряжений тоже процентв на 80. У этой схемы есть еще несколько недостатков. Ей нельзя пользоваться если она питается от того-же источника что измеряемые цепи. И крайне нежелательно от сетевых источников. Только от автономного.

satelit 2
Offline
Зарегистрирован: 04.12.2016

пока у меня как пост 134

svm
Offline
Зарегистрирован: 06.11.2016

satelit 2 пишет:

пока у меня как пост 134

В таком случае выход спалить уже труднее.

satelit 2
Offline
Зарегистрирован: 04.12.2016

это радует, а почему тогда сопротивление не мерит,бональный оммертр пропиал

svm
Offline
Зарегистрирован: 06.11.2016

Сделай как в 157 посту, а дальше будем посмотреть.

satelit 2
Offline
Зарегистрирован: 04.12.2016

svm пишет:

Сделай как в 157 посту, а дальше будем посмотреть.

странно, 157 пост не корректирова

svm
Offline
Зарегистрирован: 06.11.2016

В 157 посту я писал, чтобы Вы вывели в монитор другие переменные и посмотрели как они изменяются при подключении резисторов. И что будет если щупы закорочены или в обрыве.

Novice User
Offline
Зарегистрирован: 25.09.2017

Получил дисплей для данного прибора https://ru.aliexpress.com/item/0-91-Inch-White-Color-128x32-IIC-I2C-OLED-LCD-Display-DIY-Module-SSD1306-Driver-IC/32815893431.html пришло за 2 недели,буду собирать дальше...

svm
Offline
Зарегистрирован: 06.11.2016

Неплохая игрушка должна получиться. Хотя у меня в принципе по габаритам не намного больше, но с этим дисплеем информацию можно подать намного эффектней.Тоже не удержался заказал парочку. Еще где бы пищалку мелкую найти. Если только динамик от сотового и какую нибудь музычку на него вывести - свою для каждого режима. Еще раз прочитал и тут, как говорят : "Остапа понесло". А что если приятный женский голос скажет : "На входе пробника- положительное напряжение 14,5 вольт" И индикатора не надо. Скорее всего добавит CD карту и какой нибудь МП3 шилд. Чисто программным вариантом скорее всего отделатся не удастся. Но! Вариант-то интересный? Мысли у кого есть?

А питание от чего будет?

Novice User
Offline
Зарегистрирован: 25.09.2017

от аккумулятора 230 ма/ч,он размеом всего 22*24*4 мм примерно

а озвучка-мп3 плеер ардуино,передача комманд по уарт,микросд карточка,на нем и говорящие часы где то видел

svm
Offline
Зарегистрирован: 06.11.2016

Несколько вопросов:

На новом дисплее запустили? А то мне тоже такие пришли, правда пока на таможне.

Аккума такого на сколько хватает?

Ну и по поводу озвучки. Поигрался немного, вещь прикольная, но родные говорят, что задолбал тем, что какая-то девица постоянно говорит - напряжение 12,5 вольта. да и с временем туго стало, началась теплица  и активное таяние снега. Приходится больше лопатой работать. Озвучку делал чисто программно без МП3 шилда на библиотеке TMRpcm. Но пока остановился. Проблема еще в том, что на хороший динамик все работает отлично, а когда берешь мини динамик от сотового, то добиться качественного и громкого звука не удается. Возможно стоит поиграться с параметрами звуковых файлов. Ввести коррекцию при записи, а так ни усилители не эквалайзеры желаемого не дали.

Novice User
Offline
Зарегистрирован: 25.09.2017

Что-то мой дисплей молчит,открыл спор...подсветка включается и все на этом...а SSD12864 аботает,ток не мерил,да и программу пока не дописал-собираю измеритель емкости аккумуляторов-достались 16 шт 18650 от ноутбука,надо отобрать лучшие 3 для одного дела.. 

svm
Offline
Зарегистрирован: 06.11.2016

Понятно. Ну, а насчет дисплея, обидно может контроллер какой нибудь неизвестный поставили?

Novice User
Offline
Зарегистрирован: 25.09.2017

не знаю,в описании SSD1306...

svm
Offline
Зарегистрирован: 06.11.2016

По идее у него не должно быть подсветки.

Novice User
Offline
Зарегистрирован: 25.09.2017

я думал это подсветка ))) чуть чуть светятся пиксели,хотел фото выложить но там не видно

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Кстати, на всякий случай - дисплеи ssd1306 не толерантны к 5 вольтам, приходящим по I2C/SPI. И на платках с Али как правило есть стабилизатор питания, в вот транзисторов для сопряжения уровней -нет. Так что бдите..

на фото -правильный дисплей от адафрута. В корпусе so23-5 стабилизатор, и 2 шт so23 -транзисторы конвертора уровней.

svm
Offline
Зарегистрирован: 06.11.2016

В описании про это не упоминается. Что питание 3,3-5 В есть, а про шины, наверное не сочли нужным. Спасибо за информацию. А насчет библиотек, что хорошего подсказать можете?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

svm, ну либа от Адафрута -мерзкий монстр, зато всё умеет.   Я предпочитаю компактые, пока реально в проекте использовал только Asoled  от Andriano.  Ещё положил в закладочки вот эту, но её ещё не опробовал.

svm
Offline
Зарегистрирован: 06.11.2016

Вторая, судя по описанию, вообще суперкомпактная. И если будет нормально работать, то цены ей нет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

не в качестве рекламы, а так, может что полезное подчерпнёте. Подогнали мне такой пробник, ещё не пользовался толком. Вот инструкция.   Сразу что бросилось в глаза, когда измеряет частоту, там динамик встроенный её на звук воспроизводит, не знаю полезно ли)

sadman41
Offline
Зарегистрирован: 19.10.2016

Бродил по ссылкам и наткнулся на "измеритель индуктивности на ардуино". Самому мне без особой нужды (поэтому не проверял), но может к своему пробнику прикрутите:  http://codinglab.blogspot.ru/2013/02/measuring-inductances-using-arduino.html

svm
Offline
Зарегистрирован: 06.11.2016

dimax пишет:

svm, ну либа от Адафрута -мерзкий монстр, зато всё умеет.   Я предпочитаю компактые, пока реально в проекте использовал только Asoled  от Andriano.  Ещё положил в закладочки вот эту, но её ещё не опробовал.

Сегодня получил дисплеи,  запустил со вторй библиотекой, в принципе неплохо, размер цифр вполне приличный. К питанию и пятивольтовым SCL и SDA относятся толерантно. Память использует 14 и 11% в режиме I2C. Только 328 в DIP корпусе рядом с этим дисплеем кажется лошадью.

Novice User
Offline
Зарегистрирован: 25.09.2017

Можно схему и скетч,попробую

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

Можно схему и скетч,попробую

Собственно схемы как таковой нет. Индикатор подключен к макетке к аппаратному I2C и питание 5В.

Библиотека по второй ссылке Димакса, скетч из ее примеров, немного урезан. Достаточно много (около 40) различных шрифтов. Есть псевдографика. Но все не стал просматривать, долго. Неплохо смотрится  font8x8

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
//------------------------------------------------------------------------------
void setup() {
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(Adafruit5x7);
  oled.clear();
  oled.set2X();
  oled.println(" 12345678");
  oled.println("   Volt");
  
}
//------------------------------------------------------------------------------
void loop() {}

Вот картинка с работающим дисплеем, сверху вскрытый старый пробник. Хорошо сфотографировать не удается. Светится очень ярко, и фотоаппарат глючит.

Явное несоответствие размеров дисплея и 328 ардуины.

Вроде получилось сфотографировать. Верхнее фото со вспышкой. Видно, что свечение дисплея ярче, чем свет от вспышки

Нижняя половина - без вспышки. Причем еще не снята довольно непрозрачная защитная пленка.

Novice User
Offline
Зарегистрирован: 25.09.2017

Спасибо за скетч-дисплей рабочий!я его уже в ящичек с б/у деталями закинул

svm
Offline
Зарегистрирован: 06.11.2016

Novice User пишет:

Спасибо за скетч-дисплей рабочий!я его уже в ящичек с б/у деталями закинул

Дисплей неплохой, две строки по 8 хорошо читаемых символов за смешную цену - правда говорят, что со временем он деградирует, но для пробника это скорее всего не очень критично.

Ориентировочно для OLED SSD1306 128x32 дисплея получилось вот это:



 // Входом частотомера является пин цифровой пин 5
 #include <Wire.h>
 #include "SSD1306Ascii.h"
 #include "SSD1306AsciiWire.h"
 #define I2C_ADDRESS 0x3C
 SSD1306AsciiWire oled;
 volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 
 long adc_buff;
 float u_del,u_izm,rez;
 byte ri;// режим измерения

//***************************************************************

void setup()
{
 Wire.begin();
 Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(font8x8);
  oled.clear();
  oled.set2X();
//oled.setCursor(1,0);
//oled.setRow(10);
  
 TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
 }
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop(){
start:
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
pinMode(8, OUTPUT);     // выводим на 8 пин 0, выключаем спикер
digitalWrite(8,0); 
  
  //****************************  ЧАСТОТОМЕР ******************************************
  ri=0;
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // загрубляем вход (борьба с наводками)

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц 10 устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
if (tic<1)goto voltmeter;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);// Время измерения
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic; goto vyv;
//**********************************************************************
//вольтметр
voltmeter:
   ri=1; 
 analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*6.133;// - реальный коэфф делителя
if (adc_buff > 150) goto vyv;   //если есть напряжения выводим - иначе измеряем сопротивление
//************************************************************************
rezist:

//#############################  18 kOm  ######################################

pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*18000)/float(u_del-u_izm);// для 18 kOm
if (u_izm>1000){;//Если значение достоверно - вывод на индикацию
goto vyv;
}

//#############################  4,7 kOm  ######################################

pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (u_izm>1500){;
goto vyv;
}

 //#############################  430 Om  ######################################
 
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 470 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff;//16368*readVcc()

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
 u_izm= (float)adc_buff;//16368*readVcc()
rez= float(u_izm*700)/float(u_del-u_izm);// для 680 om
if (u_izm >1500){
goto vyv;
}
//Если  точность не удовлетворяет переходим на опорное 1,1 В
// измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
//**************************************************************
ri=2;
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff/16368*(float)readVcc();

// измеряем напряжение на измеряемом резисторе
analogReference(INTERNAL);// подключаем опорное 1.1 В
delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_izm= (float)adc_buff/16368*1100;
(rez)= float(u_izm*790)/float(u_del-u_izm);
vyv:
/////////////////////////////////////////////////////////////////////////
vdspl();// Вывод на дисплей 
goto start;
}

long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.1 * 1023.0*1000) / result;
  return result;
}
// вывод на  SSD1306
void vdspl()
{
oled.setCursor(1,0);
//oled.setRow(10);
if (ri==2 && rez >=0 && rez < 1){;   //Щупы 3акорочены или сопроивление < 1 Om
pinMode(8, OUTPUT);                  // выводим на 8 пин 1, подключаем спикер
digitalWrite(8,1);  
oled.clear();
oled.println("  SHORT ");
delay(100);
goto vdsp;
}
if (ri==0){ ;
oled.println (int(rez));
oled.print("HZ      ");
goto vdsp;
}
if (ri==1){;                     // Вывод "u"
oled.print(rez,1);
oled.println("      ");
oled.print("VOLTS   ");
goto vdsp;
}
if (rez<1000) rez=rez*100;
else rez=rez/10;
if (rez> 7999999){                //ХЗ что на входе
oled.clear();
goto vdsp;
}
oled.println(rez,1);
if (rez<1000) oled.println("Ohm     ");  
if (rez>=1000)oled.println("KOhm    ");                    
vdsp:; 
}

 

Andry Smart
Offline
Зарегистрирован: 06.09.2016

что то я запуталсяю а данный скетч последний для какой схемы? та, что до 20вольт?

svm
Offline
Зарегистрирован: 06.11.2016

Andry Smart пишет:

что то я запуталсяю а данный скетч последний для какой схемы? та, что до 20вольт?

Схема из поста #25.

Есть более свежий вариант. Схема в принципе та-же, немного переназначены пина АЦП, вместо активного спикера использован динамик от сотового и использована китайская Arduino Pro Mini с камнем ATmega168. Габариты получились намного меньше. И озвучка немного лучше. Вчера сделал корпус, пока краска сохнет. Сегодня погоняю и если особых косяков не будет выложу и схему и скетч. Ну и видео постараюсь снять.

Novice User
Offline
Зарегистрирован: 25.09.2017

svm пишет:

Сегодня погоняю и если особых косяков не будет выложу и схему и скетч. Ну и видео постараюсь снять.

Ждемс...Я пока отвлекся на пультоскоп с внешним ацп...

svm
Offline
Зарегистрирован: 06.11.2016
Надеюсь последний вариант, корпус немного маловат получился, поэтому выковыривать
уже проблематично. Хотя программная модернизация не возбраняется, все линии 
компорта выведены на задний разъем. 
 
Конструкция собрана навесным монтажем. Чтобы не закоротить дорожки на плате
Pro Mini  с ATmega168, на нее наклеен каптоновый скотч, а сверху пять СМД резисторов 
(номиналы видно на фото). Со стороны деталей две перемычки. Собственно и все.
На торце 
разъем КОМ порта и питания. 
 
 
Скетч:
 
 // Входом частотомера является пин цифровой пин 5
 #include <Wire.h>
 #include "SSD1306Ascii.h"
 #include "SSD1306AsciiWire.h"
 #define I2C_ADDRESS 0x3C
 //#define DEBUG // Раскомментировать,если нужна отладочная информация в монитор
 SSD1306AsciiWire oled;
 volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 
 long adc_buff;
 float u_del,u_izm,rez;
 byte ri;// режим измерения
//***************************************************************

void setup()
{
 
 #ifdef  DEBUG 
 Serial.begin(9600);
 #endif
 
 Wire.begin();
 Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(font8x8);
  oled.clear();
  oled.set2X();
//oled.setCursor(1,0);
//oled.setRow(10);
oled.print ("Ucc-");// При включении показать напряжение питания
oled.println (readVcc()/1000.0,1);
oled.print (" Volt   ");
tone(9,500,200);// и озвучить Ok азбукой Морзе
delay(250);
tone(9,500,200);
delay(250);
tone(9,500,200);
delay(500);
tone(9,500,200);
delay(250);
tone(9,500,50);
delay(100);
tone(9,500,200);
delay(500);
oled.clear();

 TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
 }
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop(){
start:
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
//pinMode(8, OUTPUT);     // выводим на 8 пин 0, выключаем спикер
//digitalWrite(8,0);      // для активного спикера на 8 пине
  
  //****************************  ЧАСТОТОМЕР ******************************************
  ri=0;
pinMode(4, OUTPUT);        // выводим на 4 пин 0
//pinMode (4,INPUT); 
digitalWrite(4,0);         // загрубляем вход (борьба с наводками)

pinMode (5,INPUT); // вход сигнала T1 (для atmega168/328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц 10 устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
if (tic<1)goto voltmeter;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);// Время измерения
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
goto vyv;
//**********************************************************************
//вольтметр
voltmeter:
   ri=1; 
 analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*5.29;// - реальный коэфф делителя
if (adc_buff > 150) goto vyv;   //если есть напряжения выводим - иначе измеряем сопротивление
//************************************************************************
rezist:
   ri=2;
//#############################  20 kOm  ######################################

pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 20 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*20000)/float(u_del-u_izm);// для 20 kOm
if (u_izm>4000){;//Если значение достоверно - вывод на индикацию
goto vyv;
}

//#############################  4,7 kOm  ######################################
ri=3;
pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (u_izm>4000){;
goto vyv;
}

 //#############################  500 Om  ######################################
 
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 500 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4; 
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
 u_izm= (float)adc_buff;
rez= float(u_izm*500)/float(u_del-u_izm);// для 500 om
if (u_izm >4000){
goto vyv;
}
//Если  точность не удовлетворяет переходим на опорное 1,1 В
// измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
//**************************************************************
ri=5;
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4;
u_del= (float)adc_buff/16368*(float)readVcc();

// измеряем напряжение на измеряемом резисторе
analogReference(INTERNAL);// подключаем опорное 1.1 В
delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4; 
u_izm= (float)adc_buff/16368*1100;
(rez)= float(u_izm*500)/float(u_del-u_izm);
vyv:
/////////////////////////////////////////////////////////////////////////
vdspl();// Вывод на дисплей 
 #ifdef  DEBUG 
 info(); 
 #endif
goto start;
}

//**************************************************************************
// вывод на  SSD1306
void vdspl()
{
if (rez> 7999999 || rez<0){         //ХЗ что на входе
oled.clear();
goto vdsp;
}  
oled.setCursor(1,0);
//oled.setRow(10);
if (rez==0)goto vdsp;
if (ri==5 && rez >=0 && rez < 1){;   //Щупы 3акорочены или сопроивление < 1 Om
//pinMode(8, OUTPUT);                // выводим на 8 пин 1, подключаем спикер
//digitalWrite(8,1);                 // для активного спикера на 8 пине
tone(9,500,100);                     // для пассивного спикера на 9 пине
oled.clear();
oled.println("  SHORT ");
delay(100);
goto vdsp;
}
if (ri==0){ ;
oled.print (int(rez));
oled.println("      ");
oled.print("HZ      ");
goto vdsp;
}
if (ri==1){;                        // Вывод напряжения
oled.print(rez,2);
oled.println("      ");
oled.print("VOLTS   ");
goto vdsp;
}
if (ri==2 ||ri==3) rez=rez/1000;    // Вывод сопртивления
oled.print(rez,1);
oled.println("      ");
if (ri==2 ||ri==3) oled.println(" KOhm    ");  
else oled.println(" Ohm     ");                    
vdsp:; 
}
// измерение 
long readVcc() {
  //float result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  result = (1.03357 * 1023.0*1000) / result;
  return result;
}

//************* отладочная информация *****************
void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("UCC   = ");
Serial.print((float)readVcc());
Serial.println(" V");
Serial.print("U_del - ");
Serial.println(u_del);
Serial.print("U_izm - ");
Serial.println(u_izm);
Serial.print("REZULT- ");
Serial.println((float)rez);
Serial.println("");
Serial.println("-------<>-------");
delay(1500);
}

 

 
 Фото без крышки:
 
Расположение дополнительных элементов:
 
Общий вид с кабелем питания и адаптером КОМ порта:

Пробник испытание

 
Novice User
Offline
Зарегистрирован: 25.09.2017

Красиво!

Andry Smart
Offline
Зарегистрирован: 06.09.2016

мне бы увеличить максимальное входное напряжение до 16в (для автоэлектрики)

 да и скрестить с пультоскопом попробую. но вот как присобачить на вход делитель да , что бы осталась возможность измерения сопротивления не докумекаю

svm
Offline
Зарегистрирован: 06.11.2016

В принципе можно попробовать вариант http://arduino.ru/forum/proekty/universalnyi-arduino-probnik?page=2#comment-352905 . Питать его нужно от автономного источника, т.к. для того чтобы не думать о полярности включения щупов "земля" ардуино не должна быть связана с измеряемыми цепями.В реальном автомобиле не испытывал. Там где есть электроника могут быть глюки, т.к. во время измерения сопротивлений (если на входных щупах нет частоты более 5 Гц  или напряжения) на щупы выдаются  импульсы с периодом около 1 сек. Это расплата за то что не нужно выбирать режим измерения. Если отказаться от него и поставить кнопочку выбора режима, то получится обычный тестер. Этот-же эффект присутствует и в последней версии пробника. Может быть это будет вносить некоторый элемент хаоса при проверке действующих конструкций, а в некоторых случаях и пригодится, используя пробник как генератор импульсов. Время покажет. Пока со старой версией особых проблем не было. Тестер переехал на полку. Достаточно удобно искать СМД резисторы на старых платах, но если номиналы превышают 20 кОм, то лучше питать пробник от автономного источника, иначе показания нестабильны. 

Andry Smart
Offline
Зарегистрирован: 06.09.2016

похоже частотомера там нет.

в автомобиле попутать щупы не реально. точнее все меряется относительно массы авто.

Глюков не будет, разве что в цепях управления реле но это не страшно. Can Lin шины достаточно помехоустойчивые, нагрузка им не страшна даже до полного КЗ. (кстати нагрузочные резисторы на каншине 60 ом.)

Andry Smart
Offline
Зарегистрирован: 06.09.2016

пробник будет в виде отвертки .   на отвертке щуп а с другого конца проводок с крокодилом. цепляещь крокодил на массу в любом удобном месте и работаешь.

 

Andry Smart
Offline
Зарегистрирован: 06.09.2016

я что то не совсем понял. в вашей схеме на входе делитель 20к/4,7k  по идее должен измерять до 20в. 

или я что то не так понял?

svm
Offline
Зарегистрирован: 06.11.2016

Andry Smart пишет:

я что то не совсем понял. в вашей схеме на входе делитель 20к/4,7k  по идее должен измерять до 20в. 

или я что то не так понял?

Это если использовать опорное 5В. У меня же используется 1,1 В, как более стабильное (а фактически для 168 атмеги оказалось 1,035 В). Так как этот пробник используется только для поиска косяков в ардуино, то пока меня устраивает. Если использовать опорное 5 В , то будет около 25 В. Я сейчас немного доработал схему - завел на D6 напряжение с кнопки включения подсветки, чтобы можно было перейти из автоматического режима в ручной (выбирать измеряемый параметр и возможно пределы измерений). Но пока не до этого. Живу в деревне и приходится больше с мотоблоком и бензотриммером общаться.

Andry Smart
Offline
Зарегистрирован: 06.09.2016

а вы не могли бы выложить библиотеку, которую использовали для вывода на OLED?

все нашел. оказалось она толоько текст умеет выводить. а мне надо режим пультоскопа сделать. 

буду адафрут юзать

 

 

Andry Smart
Offline
Зарегистрирован: 06.09.2016

набросал примерно то, что хочу реализовать в пробнике автоэлектрика.  пока копаюсь в коде.

решил использовать модуль питания автономного с зарядкой. Он работает с аккумулятором. обеспечивает на выходе 5в. защита аккумулятора и зарядка в нем реализованы.

порт А0 считывает уровень заряда батареи

пока мучаюсь как скрестить с пультоскопом. что бы переключателем выбирать режим пробника или пультоскопа.

планирую опорное 5в для измерения напряжения использовать (собственно поэтому и решил питать стабильными 5в схему)

если измеряемое напряжение меньше 1в то использую опорное 1.1в

от пультоскопа хочу использовать только режим осциллографа. но и тут никак не получается. 

задача

1 измерение напряжение (точность особо не нужна главное различать 12в 5в и т.д.

2 измерение частоты

3 измернеие сопротивления

4 прозвонка цепи с пищалкой

5 режим осциллографа (посмотреть сигнал с лямбдазонда или датчика скрорости, коленвала, распредвала)

6 кнопкой "нагрузка" нагрузить цепь через лампочку на массу (удобно искать цеп управления центральным замком , или включить какое реле) 

7 еще есть мысли анализатор шины сделать (для определения Can Lin и т. д.

svm
Offline
Зарегистрирован: 06.11.2016

Это уже получается далеко не пробник, а универсальный прибор автоэлектрка. В 168 он наверное уже не влезет. После опытной эксплуатации своего пробника, выявил существенный недостаток- если на щупе нет напряжения или импульсов с частотой более 5 Гц, то на щупе в режиме измерения сопротивления появляются импульсы с частотой около 1 Гц и амплитудой от о.1 до 5 вольт (зависит от сопротивления измеряемой цепи). При поиске немсправностей монтажа, это не напрягает, а в действующей конструкции, вызывает неадекватную ее реакцию. Сейчас собираюсь немног модернизировать пробник. Буду использовать кнопку подсветки для выбора режима измерения. Или автоматический выбор (режим пробника) илм ручной - измерение частоты, напряжения или  сопротивления. Если мозгов у ардуинки хватит, может быть добавлю простейший генератор. Большее вряд-ли получится, без изменения схемотехники. На макетке пробовал изобразить источник регулируемо напряжения, но столкнулся с тем что нужно ставить на выходе фильтр, а он влияет на остальные режимы. Но это не самое страшное, проблема, как не изменяя конструкции одной кнопкой регулировать это напряжение. Есть варианты- медленно, но точно или быстро ,но +- трамвайная остановка. Впереди три выходных, может что и получится.

Andry Smart
Offline
Зарегистрирован: 06.09.2016

думаю впихнуть в 328атмегу (arduino nano) хотя может и не влезет. все таки библиотека с графикой кушает не мало.

похоже режим измерения сопротивления мне прийдется сделать отключаемым. жаль терять автоматический режим но боюсь глюков в автомобиле наловить. 

 

регулировку одной кнопкой можно сделать с ускорением (если коротко нажимать то медленно а если удержиавать то чем дольше держим, тем быстрее увеличиваем) 

 

 

svm
Offline
Зарегистрирован: 06.11.2016

Andry Smart пишет:

 

регулировку одной кнопкой можно сделать с ускорением (если коротко нажимать то медленно а если удержиавать то чем дольше держим, тем быстрее увеличиваем) 

 

Надо пробовать. Теоретически где-то так, а насколько удобно и функционально получится, посмотрим.

svm
Offline
Зарегистрирован: 06.11.2016

Все-таки пришлось добавить ручной режим измерений. Изучал SIM800 и когда начал просматривать сигналы на его ногах, модем периодически отваливался или перезагружался- причина наличие импульсов на щупе в режиме измерения сопротивлений. В результате появилась новая версия, с которой этот эффект пропал.

Так как пробник уже в корпусе, и всунуть туда дополнительные элементы управления проблематично, решил для переключения режимов использовать кнопку подсветки. При включении питания устанавливается режим "Пробник". Короткиие нажатия последовательно переключают режимы "Вольметр","Омметр","Частотомер" и снова "Пробник". Длительное нажатие в любом режиме - "Пробник". Правда при изготовлении пробника это не планировалось, поэтому подсветка была собрана как удобнее, а потом еще и клеем залита. Подпаяться удалось только к нижнему резитору 20 Ом.  Получилось так.

При включении подсветки на нем очень маленькое падение напряжения и использовать цифровой вход не удалось. Поэтому пришлось использовать аналоговый вход. Если сразу предусмотреть испоьзование кнопки для переключения, то можно использовать и цифровые входа. 

Скетч довольно сумбурный так, как делался в лоб и большее время ушло на отлавливание косяков. Меню можно и получше сделать и добавить дополнительные функции. Но это уже в свободное время. Работает и ладно. На 168 атмеге используется 77% и 50% памяти. Если использовать 328, то еще многое влезет.



 // Входом частотомера является цифровой пин 5
 #include <Wire.h>
 #include "SSD1306Ascii.h"
 #include "SSD1306AsciiWire.h"
 #define I2C_ADDRESS 0x3C
 //#define DEBUG // Раскомментировать,если нужна отладочная информация в монитор
 SSD1306AsciiWire oled;
 volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 
 long adc_buff,tau_svet,t_svet;
 float u_del,u_izm,rez;
 byte ri,rr,rs,prob,svet;// режим измерения
//***************************************************************

void setup()
{
  #ifdef  DEBUG 
 Serial.begin(9600);
 #endif
 Wire.begin();
 Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(font5x7);
  oled.clear();
  oled.set2X();
  tone(9,500,100);                   
  oled.println("  PROBNIK");
  delay(1000);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++;
}

void loop(){
rs=0;  
svet=0;
prob=1;
start:
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс
//*******************************************************************
svet:// фиксация длительности вкючения кнопки подсветки
if (analogRead(A0)>100 && svet==0){t_svet=millis();svet=1;goto svet;}
if (analogRead(A0)>100 && svet==1)goto svet;
if (analogRead(A0)<10  && svet==1){tau_svet=millis()-t_svet;
if (tau_svet<400){rr++;prob=0;rs=0;} //короткое нажатие выбор режима
if (tau_svet>800){rr=0;prob=1;}      //очень длинное  нажатие возврат к пробнику
if (tau_svet>450)rr=0;               //длинное  нажатие
svet=0;t_svet=0;}
//************** измерение выборочных величин ************************

if (rr==0)goto probn;
if (rr==1){show_menu();voltmeter();}
if (rr==2){show_menu();ommeter();}
if (rr==3){show_menu();f_meter();ri=0;}
if (rr>3){show_menu();goto probn;}
vdspl();
if (prob==0)goto start;


probn:;//******************** РЕЖИМ ПРОБНИКА ****************************
  
//****************************  ЧАСТОТОМЕР ******************************************
test_F();     //  Тест наличия импульсов с F>5 Гц.
if (tic>1) {  // Если есть импульсы измеряем частоту
f_meter();
goto ind;
}
//**************************** Вольтметр ******************************************
voltmeter();
if (adc_buff > 150) goto ind;   //если есть напряжения выводим - иначе измеряем сопротивление
//**************************** ОММЕТР ********************************************
//rezist:
ommeter();
//*************************** ИНДИКАЦИЯ ************************************
ind:;
vdspl();// Вывод на дисплей 
 #ifdef  DEBUG 
 info(); 
 #endif
goto start;
}
// ************* Конец лупа ***********************

void show_menu(){
if (rs==0){
tone(9,500,100);                   
oled.clear();
if (rr>3){oled.println("  PROBNIK");rr=0;}
if (rr==1)oled.println("  Voltmetr");
if (rr==2)oled.println("  Ommeter");
if (rr==3)oled.println("  F_meter");
delay(500);
rs=rr;}}


//**************************************************************************
// вывод на  SSD1306
void vdspl()
{ 
if (rez> 7999999 || rez<0){         //ХЗ что на входе
//oled.clear();
oled.setCursor(1,0);
oled.println(" Incorrect ");
oled.print(" data  R/");
if (rr==1) oled.print("U");
if (rr==2) oled.print("R");
if (rr==3) oled.print("F");
if (rr==0) oled.print("P");
goto vdsp;
}  
oled.setCursor(1,0);
if (rez==0)goto vdsp;
if (ri==5 && rez >=0 && rez < 1){;   //Щупы 3акорочены или сопроивление < 1 Om
tone(9,500,100);                     // для пассивного спикера на 9 пине
oled.clear();
oled.println("  SHORT     ");
delay(100);
goto vdsp;
}
if (ri==0){ 
oled.print (int(rez));
oled.println("              ");
oled.print("HZ          ");
goto vdsp;
}
if (rs==3)goto vdsp;
if (ri==1){;                        // Вывод напряжения
oled.print(rez,2);
oled.println("           ");
oled.print("VOLTS   ");
goto vdsp;
}
if (ri==2 ||ri==3) rez=rez/1000;    // Вывод сопртивления
oled.print(rez,1);
oled.println("         ");
if (ri==2 ||ri==3) oled.println(" KOhm    ");  
else oled.println(" Ohm     ");                    
vdsp:; 
}


// измерение напряжения питания
long readVcc() {
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  uint8_t low = ADCL; // сначала нужно прочесть ADCL - это запирает ADCH
  uint8_t high = ADCH; // разлочить оба
  float result = (high<<8) | low;
  //result = (1.03357 * 1023.0*1000) / result;
  result =1057342.11/ result;
  return result;
}

//************* отладочная информация *****************
void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("UCC   = ");
Serial.print((float)readVcc());
Serial.println(" V");
Serial.print("U_del - ");
Serial.println(u_del);
Serial.print("U_izm - ");
Serial.println(u_izm);
Serial.print("REZULT- ");
Serial.println((float)rez);
Serial.println("");
Serial.println("-------<>-------");
delay(1500);
}


void voltmeter(){// *************** ВОЛЬТМЕТР *****************
   ri=1; 
 analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(2, INPUT); 
pinMode(3, INPUT); 
pinMode(4, OUTPUT); // выводим на 4 пин 0
digitalWrite(4,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*5.29;// - реальный коэфф делителя
}
//****************************************************************************
void ommeter(){// *************** ОММЕТР *****************
     
//R=20 kOm  
ri=2;
pinMode(2, INPUT);         // 2 пин высокий импеданс
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(4, OUTPUT);        // 4 пин выход
digitalWrite(4,1);         // переводим его в 1 подключаем измерительный резистор 20 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*20000)/float(u_del-u_izm);// для 20 kOm
if (u_izm>4000){;//Если значение достоверно - вывод на индикацию
goto vyv;
}

//#############################  4,7 kOm  ######################################
ri=3;
pinMode(4, INPUT);         // 4 пин высокий импеданс
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(3,1);         // переводим его в 1 подключаем измерительный резистор 4.7 kOm
analogReference(DEFAULT);// подключаем опорное 5 В  
delay(2);

// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4;
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
u_izm= (float)adc_buff;
rez= float(u_izm*4750)/float(u_del-u_izm);// для 4,7 kOm
if (u_izm>4000){;
goto vyv;
}

 //#############################  500 Om  ######################################
 
  analogReference(DEFAULT);// подключаем опорное 5 В
  ri=4;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // 2 пин выход
digitalWrite(2,1);         // переводим его в 1 подключаем измерительный резистор 500 Ом 
  delay(2);
// измеряем полное напряжение на делителе под нагрузкой
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4; 
u_del= (float)adc_buff;

// измеряем напряжение на измеряемом резисторе
//**************************************************************
// сначала при опорном 5 В
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4;
 u_izm= (float)adc_buff;
rez= float(u_izm*500)/float(u_del-u_izm);// для 500 om
if (u_izm >4000){
goto vyv;
}
//Если  точность не удовлетворяет переходим на опорное 1,1 В
// измеряем полное напряжение на делителе под нагрузкой при опорном 5 В
//**************************************************************
ri=5;
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4;
u_del= (float)adc_buff/16368*(float)readVcc();

// измеряем напряжение на измеряемом резисторе
analogReference(INTERNAL);// подключаем опорное 1.1 В
delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A1); }
adc_buff >>=4; 
u_izm= (float)adc_buff/16368*1100;
(rez)= float(u_izm*500)/float(u_del-u_izm);
vyv:;
}


void init_fm(){// ********* конфигурация входов частотомера *******
ri=0;
pinMode(4, OUTPUT);        // выводим на 4 пин 0
digitalWrite(4,0);         // загрубляем вход (борьба с наводками)
//pinMode(4, INPUT);       // если нужна макс. чувствительность
pinMode (5,INPUT);         // вход сигнала T1 (для atmega168/328)
}


void f_meter(){//*******************ЧАСТОТОМЕР********************
ri=0;
if (analogRead(A0)>100)rr=0;prob=1;goto vf;// ПРОВЕРКА КНОПКИ
init_fm();  
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(1000);// Время измерения
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
vf:;
}

void test_F(){// ******* Тест наличия импульсов с F>5 Гц.********
init_fm();
ri=0;
int_tic=0; TCNT1 = 0;
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(50);// Тестовый замер (срабатывает> 5 Гц  устойчиво)
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
rez=tic;
}