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

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

Я тут покумекал малость...

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

Вкратце-на входе постоянно 5 в,кнопками имитируем напряжение 16 в на входе/напряжение 0-16 в на входе/сопротивление /кз

Влюбом из случаев напряжение на R3 не превышает 5 вольт,надо подобрать делитель R2/R3 что бы при входном напряжении 16 в на R3 было 1,1 в

Работа

-если на R3 0,36 В-то вход никуда не подключен либо напряжение на входе не превышает 5 вольт

-если более 0,36 в-измеряем напряжение на входе и выводим на индикатор

-если менее 0,36 в-также измеряем напряжение и вычисляем сопротивление на входе

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

В принципе логично если правильная полярность, а если автоэлектрик щупы перекинет?. Ну напряжение еще можно померять с достаточной для АМ точностью,если мостик поставить. Как в таком случае КЗ отловить, мостик-же сволочь имеет достатчно большое сопротивление по сравнению с КЗ? Должно-же решение быть? Хотелось -бы красивое решение без дополнительных элементов. только пару резисторов и все. Здесь кажется можно оттолкнуться от транзистор тестера поскольку источник питания скорее всего будет автономным и не завязанным с бортсетью. Использовать те-же принципы, но в более грубом варианте. И вместо  закнов Ома перейти к Кирхгофу. В принципе если подумать немного, все получится.

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

Мне кажется всю схему можно свести вот к этому:

Слева эквивалентные схемы двух цифровых выходов ардуино, условно D1 и D2 к которым подключены аналоговые входа А1 и А2 остается подобрать значения резисторов Rx и Rxx так чтобы ни при каких условиях напряжение на Rx не превышало 5 В, при этом соотношение делителя удовлетворяло диапазону измерения напряжений. В принципе задача на первый взгляд достаточно простая и ничего кроме закона Ома не нужно.

Сначала вставил рисунок, потом понял, что немного ошибся , цифровые выхода могут иметь еще и "Z" сомтояние, а аналоговые входа могут и на выход работать, что расширяет возможности маневра

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

а как предохранители проверять?

вот еще намулевал...

не,неправильно...

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

Novice User пишет:

а как предохранители проверять?

вот еще намулевал...

https://yadi.sk/d/3HMULuku3TNm3j

По сопротивлению. Это в принципе кусок схемы транзитестера. Там как-то измеряют? Просто надо немного подумать. Это-же не конечный вариант. Можно и еще пару аналоговых входов ререз достаточно большие резисторы подключить к щупам.

А вашу картинку в другом формате посмотреть нельзя?

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

если никуда не подключено-0,13 в на вольтметре,если подать 16 в то на вольтметре 1,88в ,полярность любая

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

тоже не то-пи сопротивлении 10 ом всего 0,000'58 в,а при 50 ом 0,002'84 вольт,такие значения сложно замерить...

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

В принципе должно работать,хотя мене кажется - много лишнего, но нужно спокойно проверить, а сегодня - спать.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

с 20 вольтами прозвонкой я думаю не стоит лазить в авто цепях... как я понял тут нужна как у логик тестера... тоесть если щупы неподключены, то на щупе присутствует небольшое напряжение например 0.5 вольта, если щупы соединить напряжение просаживается за счет закрытия или открытия транзистора

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

Xumuk пишет:

с 20 вольтами прозвонкой я думаю не стоит лазить в авто цепях... как я понял тут нужна как у логик тестера... тоесть если щупы неподключены, то на щупе присутствует небольшое напряжение например 0.5 вольта, если щупы соединить напряжение просаживается за счет закрытия или открытия транзистора

Никаких 20 В там не будет. Максимум 5 и то через резистор около 7 кОм, максимальный ток менее 1 мА

Вот сегодня поэкспериментировал. Пока результаты такие :

- напряжения измеряет независимо от полярности

-сопротивления от 1 ома и выше, точно не знаю, мешают клиенты

- все что ниже 1 ома считаем КЗ

-при питании от USB заметно влияние наводок. При автономном питании скорее всего не будет.

-есть возможность добавить проверку диодов чисто программно

Схема и скетч на которых производились тесты:

 // Входом частотомера является пин цифровой пин 5
 #include <Wire.h>
  volatile unsigned int int_tic=0; 
 volatile unsigned long tic; 

 long adc_buff,rezd;
 float u_del,u_izm,rez,f_ucc;
 byte ri;// режим измерения

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

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

void loop(){
start:
pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс

pinMode(8, OUTPUT);     // выводим на 8 пин 0, выключаем спикер
digitalWrite(8,0); 
  
  
//**********************************************************************
//вольтметр
voltmeter:
   ri=1; 
  analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(2, INPUT);
pinMode(3, OUTPUT);        // выводим на 4 пин 0
digitalWrite(3,0);         // устанавливая его в 0(включаем нижний резистор делителя)
  delay(2);
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A2); }
adc_buff >>=4; // 16368 полная шкала 14bit
rez= (float)adc_buff/16368.0*16.138;// - реальный коэфф делителя
if (adc_buff > 100) goto vyv;   //если есть напряжения выводим

//**********************Пробуем сменить полярность**************************
ri=2;
pinMode(3, INPUT);
pinMode(2, OUTPUT);        // выводим на 4 пин 0
digitalWrite(2,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*16.138;// - реальный коэфф делителя
if (adc_buff > 100) goto vyv;   //если есть напряжения выводим - иначе измеряем сопротивление
//goto vyv;

rezist:


//#############################  ######################################

  ri=3;

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

// измеряем напряжение на верхнем щупе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A3); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff/16368*(float)readVcc();
u_izm=u_del;
// измеряем напряжение на нижнем щупе
//**************************************************************
adc_buff=0;
for (int n=0; n<=255; n++ ) {
adc_buff+= analogRead(A0); }
adc_buff >>=4; // 16368 full scale 14bit
u_del= (float)adc_buff/16368*(float)readVcc();
rez= float(u_izm-u_del);// отсюда можно вычислить сопротивление коротыш устойчиво отличает от 2-3 Ом

 goto vyv;
  
vyv:
/////////////////////////////////////////////////////////////////////////
info();

pinMode(2, INPUT);// 2 пин высокий импеданс
pinMode(3, INPUT);// 3 пин высокий импеданс
pinMode(4, INPUT);// 4 пин высокий импеданс



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;
}
void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("UCC   = ");
Serial.print((float)readVcc()/1000);
Serial.println(" V");
Serial.print("ADC - ");
Serial.println(adc_buff);

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);
}

На комментарии внимание не обращайте, не было времени, нужно было уезжать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Зачем 20 вольт, 14,6 достаточно

arduinec
Offline
Зарегистрирован: 01.09.2015

"Повторение - мать учения" (см. пост #58):

Зачем в строке 116 писать 1.1*1000, когда можно сразу 1100? Тогда и result (в строке 115) можно не float, а long сделать, тем более что функция readVcc() (в строке 106) возвращает long. Ещё можно сразу result = ADC писать.

Но это так мелкие придирки к коду :)

arduinec
Offline
Зарегистрирован: 01.09.2015

При желании можно к тестеру транзисторов (http://arduino.ru/forum/proekty/transistor-tester-arduino) щупы приделать и посмотреть что получится.

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

arduinec пишет:

"Повторение - мать учения" (см. пост #58):

Зачем в строке 116 писать 1.1*1000, когда можно сразу 1100? Тогда и result (в строке 115) можно не float, а long сделать, тем более что функция readVcc() (в строке 106) возвращает long. Ещё можно сразу result = ADC писать.

Но это так мелкие придирки к коду :)

Там скорее всего и крупных косяков много. Во первых я не программист, а железячник, во вторых -  экспериментировал на работе и достаточно часто отвлекали. Как все заработает, тогда можно будет и код причесать. Тем более , что измерение питания не столь необходимо и от него можно отказаться,чтоя в конце концов и сделал.

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

arduinec пишет:

При желании можно к тестеру транзисторов (http://arduino.ru/forum/proekty/transistor-tester-arduino) щупы приделать и посмотреть что получится.

Там есть свои недостатки- высокое входное сопротивление измерительных цепей. Все нормально работает когда тестируемый элемент подключен проводами минимальной длины. Стоит удлиннить провода на 100-150 мм и начинается вакханалия. Правда не всегда, но что есть -то есть. В данном пробнике я пытаюсь избавиться от этого, сознательно уменьшая входное сопротивление измерительных цепей. Для автомобильного пробника это не очень критично. В основном там низкие сопротивления цепи и лошадиные токи. Смущает наличие электроники в современных автомобилях. Как она отнесется к входному сопротивлению в 5-10 кОм?

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

в том то и дело, что в современных авто всякие кан шины и слаботочные цепи в которых как раз и нужно большое входное сопротивление, я конечно не совсем компитентен в этих делах, но сколько смотрел обзоров и т д, все об этом говорят. На сколько оно должно быть большим не знаю=(( большое сопротивление в основном нужно чтобы случайно не тыкнуть не туда и не спалить, я так полагаю)

https://www.youtube.com/watch?v=o52K-uaLsL4 вот тут человек сделал пробник для авто конкретно, с 3.3 примерно рассказывает про него, может что-то подчерпнете

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

Xumuk пишет:

в том то и дело, что в современных авто всякие кан шины и слаботочные цепи в которых как раз и нужно большое входное сопротивление, я конечно не совсем компитентен в этих делах, но сколько смотрел обзоров и т д, все об этом говорят. На сколько оно должно быть большим не знаю=(( большое сопротивление в основном нужно чтобы случайно не тыкнуть не туда и не спалить, я так полагаю)

https://www.youtube.com/watch?v=o52K-uaLsL4 вот тут человек сделал пробник для авто конкретно, с 3.3 примерно рассказывает про него, может что-то подчерпнете

Вот поэтому -бы и хотелось мнение толкового автоэлектрика, а не таких как, я допустим.  Я могу отремонтировать практически все, если есть схема и алгоритм работы. Но что смотреть в современном автомобиле, я не знаю. Не до этого. Если раньше, кроме механических контактов ничего не было и достаточно было просто "контрольки", то сейчас требования к авто-тестеру могут кардинально отличаться от того что я себе представляю.

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

в современном авто сущестсвуют различные шины данных. Если ткнуть в них нагрузкой или повышенным напряжением (напряжение на шине не выше 3В) может вылететь драйвер (транссивер) шины. Если ткнуть плюсом (даже 3,3 нежелательно) в провод пиропатрона (газогенератора) подушек безопасности - может бахнуть. Но это всё и заводским хорошим тестером можно проделать с дуру. 

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

MaksVV пишет:

в современном авто сущестсвуют различные шины данных. Если ткнуть в них нагрузкой или повышенным напряжением (напряжение на шине не выше 3В) может вылететь драйвер (транссивер) шины. Если ткнуть плюсом (даже 3,3 нежелательно) в провод пиропатрона (газогенератора) подушек безопасности - может бахнуть. Но это всё и заводским хорошим тестером можно проделать с дуру. 

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

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

Вот что в итоге получилось в финальной версии.

Измерение на аналоговых входах во предложению yul-i-an в 28 посту вынесено в отдельную функцию, что заметно сократило потребление памяти.



 long adc_buff,rezd;
 float u_del,u_izm,rez,u_del1;
 byte ri;// режим измерения
//***************************************************************

void setup()
{
 Serial.begin(9600); 

 //---------------------------------------------------------------------
 }
 
void loop(){
start:
pinMode(2, INPUT); // 2 пин высокий импеданс
pinMode(3, INPUT); // 3 пин высокий импеданс
pinMode(8, OUTPUT);// выводим на 8 пин 0, выключаем спикер
digitalWrite(8,0); 

//************************** вольтметр ********************************************
   ri=1; 
analogReference(INTERNAL);// включаем внутренний ИОН 1.1 В
pinMode(3, OUTPUT);        // выводим на 3 пин 0
digitalWrite(3,0);         // устанавливая его в 0(включаем нижний резистор делителя)
adc_buff=adc14BitRead(A2);//чтение с 2 аналогового входа с разрешением 14 бит
rez= (float)adc_buff/16368.0*16.138;// - реальный коэфф делителя
if (adc_buff > 100) goto vyv;   //если есть напряжения выводим

//**********************Пробуем сменить полярность**************************
 ri=2;
pinMode(3, INPUT);         // 3 пин высокий импеданс
pinMode(2, OUTPUT);        // выводим на 2 пин 0
digitalWrite(2,0);         // устанавливая его в 0(включаем нижний резистор делителя)
adc_buff=adc14BitRead(A1);//чтение с 1 аналогового входа с разрешением 14 бит
rez= (float)adc_buff/16368.0*16.138;// - реальный коэфф делителя
if (adc_buff > 100) goto vyv;   //если есть напряжения выводим 

//################## Измерение сопротивлений ##############################
  ri=3;
pinMode(2, OUTPUT);        // 2 пин выход
pinMode(3, OUTPUT);        // 3 пин выход
digitalWrite(2,1);
digitalWrite(3,0);
analogReference(DEFAULT);// подключаем опорное 5 В  

// измеряем напряжение на верхнем конце делителя
//**************************************************************
adc_buff=adc14BitRead(A2);
u_del= (float)adc_buff;

// измеряем напряжение на верхнем щупе
//**************************************************************
adc_buff=adc14BitRead(A3);
u_izm= (float)adc_buff;

// измеряем напряжение на нижнем щупе
//**************************************************************
adc_buff=adc14BitRead(A0);
u_del1= (float)adc_buff;

u_del=u_del-u_del1;// Полное напряжение на делителе
u_izm=u_izm-u_del1;// Напряжение на измеряемом резисторе

//сопротивление измеряемого резистора
rez= float(u_izm*2936)/float(u_del-u_izm);// для 3 kOm
// От 10 Ом до 1 МОма меряет достаточно точно, но заметно влияние рук.
//Скорее всего из за питания от USB.
vyv:
/////////////////////////////////////////////////////////////////////////
info(); // Отладочная информация для настройки (потом можно удалить)
vdspl();// Вывод на дисплей закомментировать или написать свой
goto start;
}

//функция чтения с АЦП в 14 бит 
int adc14BitRead(byte Ain){
  delay(3);
  adc_buff=0;
  for (int n=0; n<=255; n++ ) {
    adc_buff+= analogRead(Ain);  }
  return  adc_buff >>=4; // 16368 полная шкала 14bit
}


void info(){
Serial.println("-------<>-------");
Serial.println("");
Serial.print("REJIM - ");
Serial.println(ri);
Serial.print("U_del - ");
Serial.println(u_del);
Serial.print("U_izm - ");
Serial.println(u_izm);
Serial.print("U_del1 - ");
Serial.println(u_del1);
Serial.print("REZULT- ");
Serial.println((float)rez);
Serial.println("");
Serial.println("-------<>-------");
delay(10);
}

Напряжения измеряет где-то до 20 Вольт с индикацией знака. Сопротивления от 5 Ом до 99,9 кОм. В принципе можно и расширить, но для автопробника и трех знаков хватит. Все,что ниже 1 Ома считаем КЗ и выдаем звуковой сигнал.

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

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

Может что-то осталось от прошлых скетчей, часть для моего дисплея. Хотя старался все лишнее зачистить.

Собран на макетке, собирать законченную конструкцию нет нужды. Интерес пропал.

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

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

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

satelit 2 пишет:

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

Скетч в первом посту-очень сырой и не полностью рабочий. А что Вам там непонятно (какие строки)?

Для схемы из 25 поста рабочие скетчи в 62 и 65 постах.

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

спасибо огромное, кучу времени сьэкономили мне. а скетч хочу переделать на семисигментный индикатор трез разрядный. мне хватает и компактный получиться( частота 50 герц умещается, напряжение тоже в трех цифрах достаточно, сопротивление тоже до 999, а точко будет означать кОм).  я и так не могу разобраться, как вывести переменную на семисегментный индикатор без регистора. во первых нет его у меня в наличии, во вторых место занимает. весь вечер потерял.(((( загорелся проектом, хотел до утра собрать. 

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

satelit 2 пишет:

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

В принципе свободных ног у ардуино  должно хватить, поищите готовые примеры. Должны быть. В скетче нельзя трогать только D5, он жестко привчзан к частотомеру. Остальные можно менять, как Вам захочется.

 

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

а команда  delay не помешает в данном проекте

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

satelit 2 пишет:

а команда  delay не помешает в данном проекте

Если большой то будут задержки, а если от 1-10, то скорее всего ничего не заметите. 

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

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

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

satelit 2 пишет:

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

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

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

опять помощ нужна, у меня в наличии только кварц на 8 мгц, могу ли я прошить мк как про мини на 8 и не повлияет ли она на показания

с другой стороны большой плюс, можно запитать от аккума от электронной сигареты ли-по 3.6в

bwn
Offline
Зарегистрирован: 25.08.2014

satelit 2 пишет:

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

Для светодиодных она скорее всего не понадобится, на них засветка не видна, просто закомментируйте.

P/S дайте ссылочку, если не сложно. Как раз часики сочиняю.

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

Благодарю, насчет делей погорячился, на нем динамика сделана, убирать нельзя. Хотя нормальная работа с таким подходом очень сомнительна, фактически МК сидит в нем все время. Самое нормальное на таймере (пока не умею) или неблокирующий на миллис (менее стабильно, чем на таймере). ИМХО.

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

собираю упрощенный пробник. при измерении напряжения d8 притянут к земле(я так понимаю логическая 0). при измерении сопротивления притянут к плюсу. задача мерить наряжения до 20 вольт постоянки и переменки. светодиод указывает, что напряжение переменное, резистор забыл нарисовать, торопился. 

вопрос состит в том, что если придет переменка на 20 вольт, не убью ли я атмегу, через d8

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

D8 у меня включает активную пищалку и нигде в измерениях не учавствует. Так-что о нем беспокоиться не стоит . Второй Щуп сидит на земле , а не на D8 . Eсли смотреть Вашу схему, то спалить ардуино достаточно трудно, но достоверно измерить переменку по моему проблематично. Эдесь я думаю отдельная история. И еще вопрс , как светодиод может определить переменку?

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

мне достоверно переменку мерить не важно, лишь бы был около 18 вольт. постоянки 12 вольт и сопромтивление 600-800 ом.  пробник я собрал по своим нуждам и не по сдешнему проекту. 

прошу кому не лень обьяснить почему у меня горит светодиод на 13 пине. он мне не мешает, но настораживает. кажеться я спалил 13 пин. в программе домустил ошибку, тк тестит на 13 пине и по монитору порта, и не понйму почему компилятор не увидел ошибку и камень нагрелся, тк 13 пин участвовал в двух операциях. ошибку исправил, а 13 led не тухнет. вот скетч полуфабрикат, значения буду корректировать уже на итоговом пробнике

int d8 = 8;// минусовой щуп на d8
int R = 0;// стартовое значение сопротивдения
int raw= 0;// (сопротивление)
int Vin= 5;// (сопротивление)
float Vout= 0;// (сопротивление)
float R1= 10000;// (сопротивление)
float R2= 0;// (сопротивление)
float buffer= 0;// (сопротивление)
int analogInput = A0;//щуп
float vin = 0;// при старте программы значение равно 0// напряжение
float rezultat = 0; //переменная которая покажет результат на индикаторе

void setup ()
{
pinMode(d8, OUTPUT);//минусовой щуп заземляем
  Serial.begin(9600);// связь с монитором порта
}


void loop()
{
  digitalWrite(d8, LOW);   
   
  vin = float(analogRead(analogInput))/19.50;// 19.65 колибровка делителя напряжения
  rezultat = map(vin, 0, 20, 0, 20); // округляем до целого числа
 



  if (vin>= 2)// если напряжение больше или равно 2 вольтам, то выводим на экран значение 
  {
    Serial.print ("vin");
    Serial.println (vin);// выводим значение напряжения на монитор

    Serial.print ("rez");
    Serial.println (rezultat);
    delay(500);// время изменения показаний на экране
  }// не работает
  else {
    digitalWrite(d8, HIGH);   
    raw= analogRead(analogInput);
    if(raw) 
    {
      buffer= raw * Vin;
      Vout= (buffer)/1024.0;
      buffer= (Vin/Vout) -1;
      R2= R1 * buffer;
      R2=R2-100000;// Мминус 100Ком с делителя
      R = map(R2, 0, 999, 0, 999); // округляем до целого числа
      //if(R>999){R=999;}
      
      Serial.print("R: ");
      Serial.println(R);
      delay(500);
    }
  }
}


коментарии могут не совпадать, тк размножал строки

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

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

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

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

Объяснить глюки с 13 пином трудно т.к. в скетче он не встречается. Полной схемы тоже не видно, ну и неплохо-бы ссылку на исходный проект. Диод на входе- это нелинейный элемент - источник погрешностей. Да и достаточно проблематично измерить 600-800 Ом включенные последовательно с 110 кОм и диодом, да еще в добавок к ним в параллель светодиод стоит..

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

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

кстати схема полная, пока на мониторе порта балуюсь

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

Может кто - то и разберется с "несчастливым" 13 пином и почему зависает программа. Мистика наверное. Я никак не могу врубиться  почему не измерить напряжение стандартными способами  с опорным 1,1В, и как измерять  переменное. 

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

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

еще еще мистику нашел, функция мар округляет вольтаж, а сопротивление нет. 

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

 

arduinec
Offline
Зарегистрирован: 01.09.2015

svm пишет:

почему не измерить напряжение стандартными способами с опорным 1,1В

При опорном 1.1В можно измерить напряжения только до 1.1В.

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

arduinec пишет:

При опорном 1.1В можно измерить напряжения только до 1.1В.

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

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

еще один глупый вопрос, если я буду замерять напряжение через а0(20 вольт) , выход а1 буду програмно активизировать в режиме измерения сопротивления для повышения точности сопротивления( мне хватает погрешности в 100 ом, 600-800 ом рабочее сопротивление). спалю ли я атмегу через а1 во время измерения напряжения

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

Однозначно спалите, и не только при измерении напряжения. Если на А1 будет "1" и закоротить Щупы, то выходной каскад ардуино, так-же выйдет из строя из-за перегрузки.

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

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

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

satelit 2, а какая плата? На уно вполне может гореть.

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

satelit 2 пишет:

с led13  я так и не разобрался, led13 горит. пробовал на трех ардуинках, рзультат одинаков. библиотеки не подключал, в скетче про 13 пин упоминаний нет. я в шоке

Вожможно такая схемотехника, что если пин неактивный (работает на вход), то светодиод горит. Подайте туда "0" принудительно для успокоения совести. На работу в реальном скетче свечение этого диода никак не скажется, если - только моргание рааздражать будет.

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

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

кому не лень, посмотрите шибки

#include <MsTimer2.h>
#include <Led4Digits.h>
int a1 = 15;// минусовой щуп на а2
int raw= 0;// (сопротивление)
int Vin= 5;// (сопротивление)
float Vout= 0;// (сопротивление)
float R= 0;
float R1= 10000;// (сопротивление)
float R2= 0;// (сопротивление)
float buffer= 0;// (сопротивление)
int analogInput = A0;//щуп
float vin = 0;// при старте программы значение равно 0// напряжение
float rezultat = 0; //переменная которая покажет результат на индикаторе
// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(2, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
  pinMode(a1, OUTPUT);//минусовой щуп заземляем
  Serial.begin(9600);// связь с монитором порта
  MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс время горения светодиодов на дисплее 
  MsTimer2::start();               // разрешение прерывания 
}

void loop() {
  digitalWrite(a1, LOW);   
   
  vin = float(analogRead(analogInput))/19.50;// 19.65 колибровка делителя напряжения
  rezultat = map(vin, 0, 20, 0, 20); // округляем до целого числа
 



  if (vin>= 2)// если напряжение больше или равно 2 вольтам, то выводим на экран значение 
  {
    Serial.print ("vin");
    Serial.println (vin);// выводим значение напряжения на монитор

    Serial.print ("rez");
    Serial.println (rezultat);

     disp.print(rezultat, 3, 1); //rezultat=показания, 3=3 сегмента, 1=вкл\выкл нулей 
     
    delay(500);// время изменения показаний на экране
  }// не работает
  else {
    digitalWrite(a1, HIGH);   
    raw= analogRead(analogInput);
    if(raw) 
    {
      buffer= raw * Vin;
      Vout= (buffer)/1024.0;
      buffer= (Vin/Vout) -1;
      R2= R1 * buffer;
      R=R2-100000;// Мминус 100Ком с делителя
      Serial.print("Vout: ");
      Serial.println(Vout);
      Serial.print("R2: ");
      Serial.println(R2);
      Serial.print("R: ");
      Serial.println(R);
      
      disp.print(R, 3, 1); 
      delay(500);
    }
  }
}

// обработчик прерывания 2 мс
void  timerInterrupt() {
  disp.regen(); // регенерация индикатора
}

 

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

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

кому не лень, посмотрите шибки

#include <MsTimer2.h>
#include <Led4Digits.h>
int a1 = 15;// минусовой щуп на а2
int raw= 0;// (сопротивление)
int Vin= 5;// (сопротивление)
float Vout= 0;// (сопротивление)
float R= 0;
float R1= 10000;// (сопротивление)
float R2= 0;// (сопротивление)
float buffer= 0;// (сопротивление)
int analogInput = A0;//щуп
float vin = 0;// при старте программы значение равно 0// напряжение
float rezultat = 0; //переменная которая покажет результат на индикаторе
// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(2, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
  pinMode(a1, OUTPUT);//минусовой щуп заземляем
  Serial.begin(9600);// связь с монитором порта
  MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс время горения светодиодов на дисплее 
  MsTimer2::start();               // разрешение прерывания 
}

void loop() {
  digitalWrite(a1, LOW);   
   
  vin = float(analogRead(analogInput))/19.50;// 19.65 колибровка делителя напряжения
  rezultat = map(vin, 0, 20, 0, 20); // округляем до целого числа
 



  if (vin>= 2)// если напряжение больше или равно 2 вольтам, то выводим на экран значение 
  {
    Serial.print ("vin");
    Serial.println (vin);// выводим значение напряжения на монитор

    Serial.print ("rez");
    Serial.println (rezultat);

     disp.print(rezultat, 3, 1); //rezultat=показания, 3=3 сегмента, 1=вкл\выкл нулей 
     
    delay(500);// время изменения показаний на экране
  }// не работает
  else {
    digitalWrite(a1, HIGH);   
    raw= analogRead(analogInput);
    if(raw) 
    {
      buffer= raw * Vin;
      Vout= (buffer)/1024.0;
      buffer= (Vin/Vout) -1;
      R2= R1 * buffer;
      R=R2-100000;// Мминус 100Ком с делителя
      Serial.print("Vout: ");
      Serial.println(Vout);
      Serial.print("R2: ");
      Serial.println(R2);
      Serial.print("R: ");
      Serial.println(R);
      
      disp.print(R, 3, 1); 
      delay(500);
    }
  }
}

// обработчик прерывания 2 мс
void  timerInterrupt() {
  disp.regen(); // регенерация индикатора
}