Вольтметр, термометр, часы для автомобиля.

gorar
Offline
Зарегистрирован: 11.12.2018

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

Комплектующие:

1. Wavgat nano3 (аналог arduino NANO только со своими библиотеками);

2. RTC DS3231

3. OLED display 128x32 SSD1306

4. терморезистор NTC 10k

Особенность использованной платы в том, что тут есть источник опорного напряжения на 4096мВ и аналоговые входы 12 бит это я и использовал. С вольтметром и часами проблем небыло все как задумано, но вот с термометром надо прояснить ситуацию. То ли  я школу забыл то ли еще что-то.

Все примеры термометров что мне попались на термисторах базируются на расчете: напряжения питания =1024. У меня же опорное 4.096В а питания около 5В. Я решил использовать дополнительный делитель для расчета сопротивленя термистора, но что-то тут не то. Я грешу на неправильную формулу расчета R_T.

long tablR[]={
   8789000,6175900,4393400,3161800,2300600,1691500,1255500,941430,711720,543080,415050,320140,250110,196910,156180,124740,100000,80800,65690,53720,44235,36610,30393,25359,21283,17942,15183,12901,11002,9418,8090,6972
}; //таблиця опорів Ом х10
byte tablT[]={
    0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155
}; 
#define R1 100000

int getTemp(byte pin){

    int analogT=analogRead(pin);      // замір на вході термістора
    int analogCal=analogRead(cal);  // замір на вході опорного дільника
    long R_T=R1*analogT/(2*analogCal-analogT);   //розрахунок опору термістора
    Serial.println(R_T);
    if (R_T <= tablR[0]) {
    int i=0;
    while (tablR[i]>R_T){
      i++;
    }
    int result=(float)(R_T-tablR[i])*(tablT[i-1]-tablT[i])/(tablR[i-1]-tablR[i])+tablT[i]; //
    result -=55;
        
    return result;
    } else  return 200;
 

cal - вход с делителя 10к/10к от питания

R1 - сопротивление нижнего плеча делителя  "cal" , Ом*10 (для удобства расчетов)

R1, R2, R3 =10к

термистор подключен в нижнее плечо делителя, в верхнем 10к от питания. 

b707
Offline
Зарегистрирован: 26.05.2017

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

gorar
Offline
Зарегистрирован: 11.12.2018

b707 пишет:

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

 

Извините! Я думал тут форум по ардуино, а не трепалка что и где купить

Спасибо за ответ!

 

 

Какая разница что это будет? Часы в авто или контроллер для солнечного колектора?

Я думал что я правильно задал вопрос, постараюсь перефразировать: Как мне правильно вычислить сопротивление термистора? 

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

Vin/(R3+RT) = VT/RT = (Vin-VT)/R3   - из неизвестных только RT

kalapanga
Offline
Зарегистрирован: 23.10.2016

Только обычно в интернетовских примерах в эту формулу просто подставляют максимальное значение АЦП и прочитанное значение АЦП. Если автор действительно использует опорное напряжение 4.096В, то ему так делать нельзя. Нужно и Vin в вольтах взять и показания АЦП в вольты перевести.

gorar
Offline
Зарегистрирован: 11.12.2018

ua6em пишет:

Vin/(R3+RT) = VT/RT = (Vin-VT)/R3   - из неизвестных только RT

 

Vin - теоретически тоже неизвесно: 4.8-5.5 а вход примет только до 4,096,  ради этого и делаю делитель cal

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Ну значит вместо Vin подставить 2*Vcal

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

получилось одолеть?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

gorar пишет:

Vin - теоретически тоже неизвесно: 4.8-5.5 а вход примет только до 4,096,  ради этого и делаю делитель cal

Нет у меня под рукой даташита на этот клон, но, сдается мне, вы путаете мягкое с теплым.

На 100 процентов я уверен, что "вход примет" любое значение до Vref. И на 99% уверен, что Vref можно поставть равным Vcc, то есть 5В. Если же этого нельзя сделать "изнутри", то можно просто соединить Vref c Vcc снаружи. Желательно через индуктивность.

А 4096 это то число которое считывается с регистров АЦП когда Vin = Vref

ВН
Offline
Зарегистрирован: 25.02.2016

gorar пишет:
Все примеры термометров что мне попались на термисторах базируются на расчете: напряжения питания =1024. У меня же опорное 4.096В а питания около 5В. Я решил использовать дополнительный делитель для расчета сопротивленя термистора, но что-то тут не то.

Начните дело с изучения пина Analog Referenсe.

А вообще, все это глупости, контролировать степень разряда стартерной АБ по наряжению, поскольку и при 80% разряде она будет выдавать 12В.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ВН пишет:

А вообще, все это глупости, контролировать степень рая пина Analog Referenсe.зряда стартерной АБ по наряжению, поскольку и при 80% разряде она будет выдавать 12В.

Ну почему глупость? Вполне нормальный способ.

Польностью заряженная АКБ дает где-то 12.7В. Если показывает 12В значит осталось точно меньше 50%.

ВН
Offline
Зарегистрирован: 25.02.2016

т.е. достаточно 1 компаратора типа LM393, за 8 р. и еще один про запас останется =) 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну, не совсем. Проценты заряженности батареи и ее способность завести авто - линейно не связаны. Если батарея изношена и\или на улице мороз, то беспокоится надо начинать уже при напряжении ниже,скажем, 12.5В, а летом можно и подольше за ноутом посидеть :)

ВН
Offline
Зарегистрирован: 25.02.2016

 т.е. предлагаете вернуться к моему первоначальному ответу, что мол глупости ? 

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Eще раз - степень заряженности по напряжению определяется однозначно.

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

Поэтому простой компаратор тут не катит.

ВН
Offline
Зарегистрирован: 25.02.2016

оно понятно, что тока по этим самым десятым и сотым долям вольта + массе факторов ТС мигом вычислит, заведет его акум авто или не   

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ВН пишет:

оно понятно, что тока по этим самым десятым и сотым долям вольта + массе факторов ТС мигом вычислит, заведет его акум авто или не   

Точно, конечно, не вычислит. А экспертные оценки т очными  и не бывают. А вот вероятность успешно завестись вполне можно  оценить.

ВН
Offline
Зарегистрирован: 25.02.2016

asam пишет:
А вот вероятность успешно завестись вполне можно  оценить.

ясно, ясно. так может ТС стоит применить такой успешный метод к его 4-м резисторам, или там слишком много известных факторов и потому не прокатит?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Если "да" - то так и надо сделать.

А если "нет", то в разных режимах работы нужно использовать разные источникт опорного напряжения:

- для измерения напряжения в бортовой сети - 4.096 В, а для измерения температуры - то же напряжение, которое подается на цепь термистора, например 5 В.

gorar
Offline
Зарегистрирован: 11.12.2018

andriano пишет:

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

Если "да" - то так и надо сделать.

Нет. А если точнее то у меня еще мало опыта чтобы такое сделать.

andriano пишет:

А если "нет", то в разных режимах работы нужно использовать разные источникт опорного напряжения:

- для измерения напряжения в бортовой сети - 4.096 В, а для измерения температуры - то же напряжение, которое подается на цепь термистора, например 5 В.

Тоже сначала была такая идея но не придумал как ее реализировать. Если можно оператор analogReference(INTERNAL4V096); использовать в теле цыкла попеременно с analogReference(DEFAULT); то я уже знаю как сделать, надо проверить будет ли оно адекватно работать на конкретном екземпляре.

asam пишет:

На 100 процентов я уверен, что "вход примет" любое значение до Vref. И на 99% уверен, что Vref можно поставть равным Vcc, то есть 5В. Если же этого нельзя сделать "изнутри", то можно просто соединить Vref c Vcc снаружи. Желательно через индуктивность.

А 4096 это то число которое считывается с регистров АЦП когда Vin = Vref

Да тут все верно! но как я уже сказал в ответе andriano что мне нужно или каждый раз менять опорное с внутреннего (4,096В) на в нешнее (Vin ) или же привязываться так как я придумал через Vcal.
 
Буду пытаться сделать из сменами опорного.
Но! подскажите такую вещь (или лучше пошлите где можно почитать про математические операции в ардуине):
void setup() {
  Serial.begin( 9600 );
  // put your setup code here, to run once:
  float R = 20000 * 100000 * 4064 / ((200000 + 100000) * 1562 - 100000 * 4064);
  Serial.print(R);

мне выдает 30.00 а калькулятор щитает 130675,24 что я неправильно записал?

 
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

gorar пишет:

Но! подскажите такую вещь (или лучше пошлите где можно почитать про математические операции в ардуине):
void setup() {
  Serial.begin( 9600 );
  // put your setup code here, to run once:
  float R = 20000 * 100000 * 4064 / ((200000 + 100000) * 1562 - 100000 * 4064);
  Serial.print(R);

мне выдает 30.00 а калькулятор щитает 130675,24 что я неправильно записал?

Попробуй вот так

void setup() {
  Serial.begin( 9600 );
  // put your setup code here, to run once:
  float R = 20000.00 * 100000.00 * 4064.00 / ((200000.00 + 100000.00) * 1562.00 - 100000.00 * 4064.00);
  Serial.print(R);

И вообще, float в подобных задачах лучше не использовать. 

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

да, long достаточно будет и, всё, что можно использовать как константное значение надо так и вводить (20000.00 * 100000.00 * 4064.00) к примеру =2147483647

 

Интересно, почему float при такой записи - 20000 * 100000 * 4064 обрабатывал беззнаковые значения???


gorar
Offline
Зарегистрирован: 11.12.2018

С формулами разобрался, с опорными тоже (их можна переключать перед измерением а я затупил). Мой вариант с калибровочним делителем тоже рабочий, но чем больше разница Vin-Vref тем меньше диапазон измерения сопротивления (сверху).

Спасибо за помощь и наводки!

 

ВН
Offline
Зарегистрирован: 25.02.2016

что-то там на счет калибровки ацп в мануале этого проца наверчено, кто-нить детально разбирался?

 И как все это себя поведет при переключениях опоры?

gorar
Offline
Зарегистрирован: 11.12.2018

ВН пишет:

 И как все это себя поведет при переключениях опоры?

 

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

Результат переключения опорных: при активации опорной один раз за програму - все нормально. А если активируется internal4v096 (отрабатывает нормально) а потом на default - то реальная наверно 1,024В (небыло под рукой чем проверить). При переключении назад на 4,096 снова отрабатывает нормально. Думаю тут проблема не так с самим процом как с библиотекой под ардуино для него, тут  http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p про него немножко говорили, думаю если копать глубже то результат будет. Но копать я пока не готов (мало знаний пока).

И сразу вопрос: если на вывод ref подключить Vin то при активации external опорная будет питанием, НО при этом не случится ли чего с входом при переключении на 4,96В ?? Пока жалко проверять на практике, может кто теоретически подтвердит.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

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

gorar
Offline
Зарегистрирован: 11.12.2018

asam пишет:

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

это я знаю (читал гдето тут на форуме ) в этом варианте у меня идет десятки замеров для уменьшения шума, и задержку давал 50-100мс после переключения и первого замера никакой разницы все входы что при 4,096 были минимум 1600 при дефаулт 4064 (не 4095 - особенность то же библиотеки проца для ардуино)

ВН
Offline
Зарегистрирован: 25.02.2016

пожет таки особенность самого проца по части калибровки ацп?

gorar
Offline
Зарегистрирован: 11.12.2018

ВН пишет:

пожет таки особенность самого проца по части калибровки ацп?

В теме, помянутой выше, был скетч который выводил все внутрение опорные напряжения на вывод ref. Следовательно они также могут быть опорными при измерениях (на мой взгляд). И еще, с внутренними опорными то работает может просто глюк библиотеки вместо того чтобы переключится на питание его переключает на минимальное опорное?

ВН
Offline
Зарегистрирован: 25.02.2016

в первом посте темы http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p

есть ссылка на русский мануал вашего проца, см. что там писано по опрникам и ацп