Библиотека для терморезистора

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Anatoliy30_2 пишет:

Я использую библиотеку из этой темы. Округление должно быть прописано в библиотеке или в скетче?

Temp =(int)(Temp+0.5); // хотя я мог и ошибиться

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

int Temp;

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

Anatoliy30_2 пишет:

А здесь я вообще ничего не понял :(

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

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

andriano пишет:

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

Оценил! Но понимание Вашего поста это мне не прибавило :(

Увы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anatoliy30_2 пишет:

А здесь я вообще ничего не понял :(

А чего тут не понимать? Это же арифметика на уровне третьего класса средней школы. Воьмите любое чило и проделайте на бумажке все эти манипуляции - увидите его округлённым до 0,5 как Вы и просили. Я не шучу, проделайте эти операции на бумажке, например с числом 2,85 или там 1.23 и всё станет понятно.

Коллега qwone ошибся и написал Вам округление до целого, в то время как Вы просили округление до 0,5

Именно это Вам и написал коллега andriano - то, что написано - это способ округлить число до 0,5. Делайте как он говорит. 

Все перечисленные операции нужно произвести с Вашей переменной Temp.

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

ЕвгенийП пишет:

Именно это Вам и написал коллега andriano - то, что написано - это способ округлить число до 0,5. Делайте как он говорит. 

Ок! Видимо с моей стороны было глупо умолчать, что я "здравствуй дерево" в программировании :) но мне казалось здесь профильный форум и дают советы не в виде примеров из начального школьного курса, а в виде конкретных частей кода :) 

ЕвгенийП пишет:

Все перечисленные операции нужно произвести с Вашей переменной Temp.

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

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Anatoliy30_2 пишет:

но мне казалось здесь профильный форум и дают советы не в виде примеров из начального школьного курса, а в виде конкретных частей кода :) 

У Вас неверное представление о форумах.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Anatoliy30_2 пишет:

Ок! Видимо с моей стороны было глупо умолчать, что я "здравствуй дерево" в программировании :) но мне казалось здесь профильный форум и дают советы не в виде примеров из начального школьного курса, а в виде конкретных частей кода :) 

ок. представь, что ты-"здравствуй дерево" припёрся на форум хирургов - тебе что там должны будут выдать?

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Клапауций 112 пишет:

ок. представь, что ты-"здравствуй дерево" припёрся на форум хирургов - тебе что там должны будут выдать?

Я конечно "больной", но не на столько ;)

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Jeka_M пишет:

У Вас неверное представление о форумах.

Возможно! Но есть среди вас те, кто хранит веру в мои представления.

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Да ладно вам парни, уймитесь! Совет с целыми меня вполне устраивает :)

Спасибо всем!

PS: Юмористам отдельное спасибо!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Anatoliy30_2 пишет:

Я конечно "больной", но не на столько ;)

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

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

Anatoliy30_2 пишет:

Jeka_M пишет:

У Вас неверное представление о форумах.

Возможно! Но есть среди вас те, кто хранит веру в мои представления.

Да, на форум заходят иногда другие "деревья".

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Anatoliy30_2 пишет:

Но есть среди вас те, кто хранит веру в мои представления.

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

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Возмущаться?! Вы не правильно меня поняли :)

"Спасибо вам, мои корреспонденты,

Что вы неверно поняли меня!"

"Спасибо, люди добрые, спасибо,-

Что не жалели ночи и чернил!"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anatoliy30_2 пишет:

мне казалось здесь профильный форум и дают советы не в виде примеров из начального школьного курса, а в виде конкретных частей кода :) 

Вы ошибались. Здесь помогают тем, кто пытается сделать сам, а у него не получается. Тем, кто и не пытается здесь не помогают.

Anatoliy30_2 пишет:

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

Нет, не затруднит, абсолютно. Если Вы пытаетесь сделать сами, то я Вам с удовольствием помогу и с пояснениями, и с кодом.

Вы сделали то, что я Вам советовал?

ЕвгенийП пишет:

Возьмите любое чило и проделайте на бумажке все эти манипуляции

Получилось? Если нет, то, давайте сюда свои вычисления.

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

ЕвгенийП пишет:

Получилось? Если нет, то, давайте сюда свои вычисления.

Я ещё не пробовал :( так как нет проекта под рукой (оставил его и ноут в деревне). 

В деревне проблема с интернетом. Пробовал лженаучными способами избавиться от лишних цифр но все счетно. Вот из города решили набрать инфы для дальнейших проб и ошибок, а вы набросились на "деревянного" :)

 

 

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Вот ещё вопрос возник :)

А можно ограничить ячейку вывода данных, например 3 знаками? Это наверное даже лучше будет :) инфа строго в ограниченных рамках без всяких перемещений при отрицательных температурах :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Anatoliy30_2 пишет:

А можно...

я запретил.

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Клапауций 112 пишет:

я запретил.

Ну и зря! Могло бы не плохо получиться :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anatoliy30_2 пишет:

Я ещё не пробовал :( так как нет проекта под рукой (оставил его и ноут в деревне). 

Для того, чтобы расписать на бумаге операции умножения, сложения, отбрасывания дробной части и деления, Вам требуется "его и ноут"?

Ну, тогда у Вас действительно проблема.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anatoliy30_2 пишет:

Вот ещё вопрос возник :)

Давайте так, Вы спрашиваете, Вам отвечают и Вы делаете то, что Вам говрят, ладно? А то, судя по Вашему предыдущему вопросы - отвечать Вам == зря терять время, а не хочется.

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Да зачем мне на бумаге эти вычисления? Я не ставлю под сомнение, что эти действия округляют значения до 5-ки после запятой. Я не знаю как компилятор отреагирует на мои вводные так как нет точного понимая где именно их вводит, заключать ли в скобки и тд и тп. Мои потуги написания кода сводятся к тому, что я дергаю куски с разных форумов и пытаюсь применить их в своём проекте. Можете смеяться, но я не технарь, а всего лишь художник, которого "может обидеть каждый". ;)

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

Anatoliy30_2 пишет:

Да зачем мне на бумаге эти вычисления? Я не ставлю под сомнение, что эти действия округляют значения до 5-ки после запятой. Я не знаю как компилятор отреагирует на мои вводные так как нет точного понимая где именно их вводит, заключать ли в скобки и тд и тп. Мои потуги написания кода сводятся к тому, что я дергаю куски с разных форумов и пытаюсь применить их в своём проекте. Можете смеяться, но я не технарь, а всего лишь художник, которого "может обидеть каждый". ;)

Скажите, а Вашей профессии тоже учат, что основные материалы для работы - это готовые репродукции, ножницы и клей?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Есть много книжек по С и С++, а именно на нем пишутся программы для Ардуино, для совершенно разного, даже для очень слабого уровня.

Есть много online IDE, где можно тренироваться на живом компиляторе, на том же самом gcc, который встроен в Arduino IDE.

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

Нельзя задавать на форуме программистов вопрос об округлении, понимаете? Хотя вам и ответили полностью.

На форуме электронщиков нельзя спрашивать чем кактод от анода отличается,

а на форуме художников чем масло от акварели.

Если человек не может найти ответ в гугле за минуту сам, то ему нужно не на форумы, а в психдиспансер.

---------------------------

Хотите учится программировать - велком! Тут каждый первый подскажет что читать и как практиковаться. Но коррекционная педагогика - не наш профиль.

====================

вы написали, что выводите на экран температуру

tft.print(Temp).

А что мешает вывести (Temp+1) или (Temp*2) или (round(Temp*2)/2.0) ? Просто интересно, что кипит в вашем разуме?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
tft.print(int(Temp));

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anatoliy30_2 пишет:

Да зачем мне на бумаге эти вычисления? 

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

kost82
Offline
Зарегистрирован: 30.11.2015

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

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

Все вычисление температуры можно оформить в небольшую функцию, строк на 20, из которых 10 - это строки-разделители и комментарии. Самая сложная часть вычислений это формула: 

Temp = 1 / (1 / T0 + (1 / B  * log(rTherm/R0)));  //температура в Кельвинах

Где T0 = 25 + 273.15 (25 градусов цельсия, переведенные в Кельвины), B - коэффициент, постоянный для терморезистора (гуглится для конкретного термистора), rTherm - сопротивление термистора (измеренное ардуиной), R0 - сопротивление термистора при 25 градусах цельсия (гуглится).

После этого надо только перевести обратно кельвины в цельсии (вычесть 273.15).

ИМХО 90% проектов, где нужно измерение температуры - не нагружены большими вычислениями. Да и измерять температуру несколько раз в секунду не имеет смысла, так как это вещь довольно инертная. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kost82 пишет:

ИМХО 90% проектов, где нужно измерение температуры

Как выражался М.С. Горбачёв, "я Вам больше скажу" - в "ХЗ сколько, но много"% проектов "где нужно измерение температуры", оно на самом деле не нужно, а нужна просто настройка делителя на терморезисторе. Сюда относятся, например, все проекты, где надо что-то просто включить/выключить по достижении определённой температуры. В таких проектах, ставится подстроечный резистор в делитель с терморезистором. В нужное место кидается термопара, подключённая к мультиметру, отвёрткой настраивается срабатывание при нужной темпмпературе, мультиметр с термопарой убирается, а автомат отлично работает. 

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

kost82 пишет:

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

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

 А часто бывает так, что человек написал "блинк", потом с трудом разобрался с чтением термопары - а третим проектом уже пишет библиотеку, "чтобы другим было проще" . В итоге в половине либ для ардуино внутри больше косяков, чем у самих новичков в "блинке" :)

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

andriano пишет:

Скажите, а Вашей профессии тоже учат, что основные материалы для работы - это готовые репродукции, ножницы и клей?

Да! Коллаж называется ;)

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

wdrakula пишет:

Есть много книжек по С и С++

А можно хотябы одну для примера? Много я не осилю :(

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Клапауций 112 пишет:

tft.print(int(Temp));

 

Спасибо!

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

kost82 пишет:

Например вот статья в которой все подробно расписано.

Спасибо!

kost82
Offline
Зарегистрирован: 30.11.2015

b707 пишет:

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

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

Лично я посчитал, что мне удобней будет оформить все в отдельную функцию, которая принимает только один параметр на входе - analogRead(pin), а на выходе отдает температуру в цельсиях. Все параметры термистора идут в начале и прокомментированы. ИМХО - если мне потребуется через какое-то время править этот код (например что-то вдруг случится с термистором и его надо будет заменить на другой) - я легко разберусь что мне надо будет поменять. Если же это будет библиотека - мне надо будет сначала найти где она лежит, посмотреть в ее документацию (если она есть) и разобраться что к чему. При этом делать библиотеку ради 20 строк кода - я считаю не оправданным.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Доработал библиотеку.

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

Совместима с прошлой версией.

Пример использования.

#include <TermoRes3950.h>//библиотека терморезистора NTC3950 10k V3.0
TermoRes3950 termo(1,1);//терморезистор на АЦП 1, режим 12бит (оверсемплинг)(медленнее, точнее)
//или TermoRes3950 termo(1);//12бит режим включен по умолчанию
//или TermoRes3950 termo(1,0);//терморезистор на АЦП 1, режим 10бит (быстрее)
float tempС=0.0;//переменная для хранения температуры в цельсиях
float tempF=0.0;//переменная для хранения температуры в фаренгейтах
float tempK=0.0;//переменная для хранения температуры в кельвинах

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

void loop(){
  tempС=termo.getTempC();//получаем температуру (в цельсиях по умолчанию)
  //или так tempС=termo.getTemp();//оставлена для совместимости с прошлой версией
  tempF=termo.getTempF();//получаем температуру в фаренгейтах
  tempK=termo.getTempK();//получаем температуру в кельвинах
  //выводим в порт
  Serial.println(tempС);
  Serial.println(tempF);
  Serial.println(tempK);
  delay(1000);
}

СКАЧАТЬ

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Функция для округления

float roundedValue(float val){
  val *=10;
  val = floor(val+0.5);
  val /= 10;
  return val;
}

Пример

#include <TermoRes3950.h>//библиотека терморезистора
TermoRes3950 termo_0(0);//терморезистор первый на АЦП 0
TermoRes3950 termo_1(1);//терморезистор второй на АЦП 1
float temp0=0.0;//переменная для хранения температуры первого терморезистора
float temp1=0.0;//переменная для хранения температуры второго терморезистора

float roundedValue(float val){//возвращает округленное значение
  val *=10;
  val = floor(val+0.5);
  val /= 10;
  return val;
}

void setup(){
  Serial.begin(9600);
}
void loop(){
  temp0=termo_0.getTemp();//получаем температуру с первого
  temp1=termo_1.getTemp();//получаем температуру со второго
  temp0=roundedValue(temp0);//округляем temp0
  temp1=roundedValue(temp1);//округляем temp1
  Serial.println(temp0);//выводим температуру с первого терморезистора
  Serial.println(temp1);//выводим температуру со второго терморезистора
  delay(1000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:

Функция для округления

Замечания нужны? Или ну их нафиг?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП пишет:

yul-i-an пишет:

Функция для округления

Замечания нужны? Или ну их нафиг?


Против Ваших замечаний ничего против не имею. Выкладывайте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, в целом, замечание-то одно. Использовать параметр функции, как временную переменную (изменять её) это некрасивая практика. Лучше оставлять её константой.

Ваша функция может быть переписана вот так:

float roundedValue(const float val){
	return round(val * 10.0) / 10.0;
}

На практике это ничего особенного не даёт (ни по времени, ни по памяти), т.к. временем и памятью занимается оптимизатор и он всё, что надо сделает, но стилистически так более профессионально. Да и короче, кстати.

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

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

Хотя вопрос "Зачем все это, если есть готовая функция sprintf()?" - постоянно всплывает в подсознании

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Хотя вопрос "Зачем все это, если есть готовая функция sprintf()?" - постоянно всплывает в подсознании

Загрузите в подсознане ответ: местная реализация printf не поддерживает работу с плавающей точкой.

Если понадобится, то используйте dtostrf - она работает нормально.

У меня вот другой вопрос, зачем вообще использовать плавающую точку в устройстве с такими скромными ресусами? Но этот вопрос выходит за рамки данного топика :))))

uragan
Offline
Зарегистрирован: 23.02.2015

ЕвгенийП пишет:

b707 пишет:

Хотя вопрос "Зачем все это, если есть готовая функция sprintf()?" - постоянно всплывает в подсознании

 

Загрузите в подсознане ответ: местная реализация printf не поддерживает работу с плавающей точкой.

Если понадобится, то используйте dtostrf - она работает нормально.

У меня вот другой вопрос, зачем вообще использовать плавающую точку в устройстве с такими скромными ресусами? Но этот вопрос выходит за рамки данного топика :))))

Матрицу двумерную: значения АЦП - значения температуры с десятыми долями. И никаких плавающих запятых- только целые числа. Между точками - mapом. 

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

ЕвгенийП пишет:

Загрузите в подсознане ответ: местная реализация printf не поддерживает работу с плавающей точкой.

Если понадобится, то используйте dtostrf - она работает нормально.

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

Один дурак может задать столько вопросов. что и сто мудрецов не ответят (с)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Чтобы printf поддерживала плавающую точку, надо компилятору добавить в опции

-Wl,-u,vfprintf -lprintf_flt -lm

но код увеличиваеца на полтора кило сразу

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

ЕвгенийП пишет:

b707 пишет:

Хотя вопрос "Зачем все это, если есть готовая функция sprintf()?" - постоянно всплывает в подсознании

Загрузите в подсознане ответ: местная реализация printf не поддерживает работу с плавающей точкой.

Если понадобится, то используйте dtostrf - она работает нормально.

У меня вот другой вопрос, зачем вообще использовать плавающую точку в устройстве с такими скромными ресусами? Но этот вопрос выходит за рамки данного топика :))))

кеплеровские данные как использовать без плавающей точки? ежели надо очень ;-)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

кеплеровские данные как использовать без плавающей точки? ежели надо очень ;-)))

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

А вообще, Вы мен янеправильно поняли. Я вовсе не ратую за выбрасывание флоатов, прсото с умом надо всё делать. Когда я вижу как в библиотеке DallasTemperature заводят float только для того, чтобы результат вернуть, меня коробит. Кто мешал вернуть этот результат с фиксированной точкой?

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

ЕвгенийП пишет:

ua6em пишет:

кеплеровские данные как использовать без плавающей точки? ежели надо очень ;-)))

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

А вообще, Вы мен янеправильно поняли. Я вовсе не ратую за выбрасывание флоатов, прсото с умом надо всё делать. Когда я вижу как в библиотеке DallasTemperature заводят float только для того, чтобы результат вернуть, меня коробит. Кто мешал вернуть этот результат с фиксированной точкой?

тем более что нужен один знак после запятой )))