Что здесь неправильно?
- Войдите на сайт для отправки комментариев
Пнд, 09/02/2015 - 00:46
float addr[151][2] = { { -40,82.7658 }, { -39,77.589101 }, { -38,72.776153 }, { -37,68.298791 }, { -36,64.131219 }, { -35,60.2498 }, { -34,56.591944 }, { -33,53.183895 }, { -32,50.006838 }, { -31,47.043496 }, { -30,44.278 }, { -29,41.661745 }, { -28,39.219559 }, { -27,36.938658 }, { -26,34.807281 }, { -25,32.8146 }, { -24,30.941776 }, { -23,29.189551 }, { -22,27.549341 }, { -21,26.013226 }, { -20,24.5739 }, { -19,23.204548 }, { -18,21.921351 }, { -17,20.718315 }, { -16,19.589899 }, { -15,18.53098 }, { -14,17.53315 }, { -13,16.59611 }, { -12,15.715759 }, { -11,14.888296 }, { -10,14.1102 }, { -9,13.363638 }, { -8,12.661766 }, { -7,12.001622 }, { -6,11.380457 }, { -5,10.79572 }, { -4,10.243847 }, { -3,9.723962 }, { -2,9.234008 }, { -1,8.772074 }, { 0,8.33638 }, { 1,7.927135 }, { 2,7.54074 }, { 3,7.175775 }, { 4,6.830919 }, { 5,6.50494 }, { 6,6.19571 }, { 7,5.903233 }, { 8,5.626497 }, { 9,5.36456 }, { 10,5.11654 }, { 11,4.882547 }, { 12,4.660785 }, { 13,4.450542 }, { 14,4.251148 }, { 15,4.06198 }, { 16,3.881632 }, { 17,3.710452 }, { 18,3.547921 }, { 19,3.393549 }, { 20,3.24688 }, { 21,3.103882 }, { 22,2.968088 }, { 23,2.839092 }, { 24,2.716515 }, { 25,2.6 }, { 26,2.491952 }, { 27,2.389069 }, { 28,2.291076 }, { 29,2.197711 }, { 30,2.10873 }, { 31,2.022048 }, { 32,1.939462 }, { 33,1.860757 }, { 34,1.785727 }, { 35,1.71418 }, { 36,1.645762 }, { 37,1.58049 }, { 38,1.518202 }, { 39,1.458744 }, { 40,1.401972 }, { 41,1.347531 }, { 42,1.29553 }, { 43,1.245846 }, { 44,1.198362 }, { 45,1.15297 }, { 46,1.109466 }, { 47,1.06786 }, { 48,1.028059 }, { 49,0.989975 }, { 50,0.953524 }, { 51,0.918671 }, { 52,0.885294 }, { 53,0.853324 }, { 54,0.822693 }, { 55,0.793338 }, { 56,0.765117 }, { 57,0.738063 }, { 58,0.712119 }, { 59,0.687236 }, { 60,0.663364 }, { 61,0.640516 }, { 62,0.618584 }, { 63,0.597527 }, { 64,0.577306 }, { 65,0.557882 }, { 66,0.539188 }, { 67,0.521225 }, { 68,0.503961 }, { 69,0.487364 }, { 70,0.471406 }, { 71,0.45585 }, { 72,0.440892 }, { 73,0.426508 }, { 74,0.412672 }, { 75,0.39936 }, { 76,0.386492 }, { 77,0.374108 }, { 78,0.362189 }, { 79,0.350714 }, { 80,0.339664 }, { 81,0.328983 }, { 82,0.318695 }, { 83,0.308784 }, { 84,0.299234 }, { 85,0.29003 }, { 86,0.281123 }, { 87,0.272537 }, { 88,0.264259 }, { 89,0.256276 }, { 90,0.248576 }, { 91,0.241184 }, { 92,0.234051 }, { 93,0.227166 }, { 94,0.22052 }, { 95,0.214102 }, { 96,0.207886 }, { 97,0.201883 }, { 98,0.196084 }, { 99,0.190482 }, { 100,0.185068 }, { 101,0.179844 }, { 102,0.174794 }, { 103,0.169912 }, { 104,0.165191 }, { 105,0.160625 }, { 106,0.156198 }, { 107,0.151914 }, { 108,0.14777 }, { 109,0.143759 }, { 110,0.139877 }, }; void setup() { Serial.begin(9600); pinMode(A1,INPUT) ; } void loop() { Serial.println(analogRead(A1)); Serial.println(getTemp(analogRead(A1))); delay(500); } float getR(float V) { float result; result=-10*V/(V-1024); return result; } float getTemp(float V) { float R; R=getR(V); int i=0; while (addr[i][1] >R) { i++; } float result; result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0]; return result; }
Всё:начало получилось отлично.Сам спросил ,сам ответил.Следующий этап к этому коду приклеить шаговый мотор,пикалку ит.д.
Ни вопроса, ни ответа. Пришёл поговорил о своём, а поделиться что было и как исправил?
Этот код для обработки показаний NTC-термистора одного автомобильного датчика(в данном случае ГАЗоновский,инжекторный,двухпроводный) по таблице.Не получалось зажечь светодиод при достижении требуемой температуры.А вот и вопрос(риторический):чтоб сделать обработку второго датчика и третьего,как нужно сделать ?Код для первого датчика оформить как функцию или библиотеку? Чтоб в последствии по показаниям трёх датчиков строить логику управления моторчиками,светодиодами и т.д.
Чтобы сделать опрос нескольких датчиков можно взять код из loop и оформить в виде отдельной функции, в которую передается номер пина, где расположен датчик и номер пина для управления/сигнализации, тогда в loop вызывать эту функцию столько раз, сколько датчиков. Плюс выкинуть delay(500) из функции и, если это нужно, делать delay мужду вызовами. А в дальнейшем совсем избавиться от delay.
PS Просто совет, если хотите, чтобы кто то смотрел исходники, форматируйте их (Ctrl-T в ArduinoIDE) и люди будут более охотно смотреть, иначе ответа можно не дождаться. Лично я прохожу мимо большой простыни с кривокосым кодом. Но дело Ваше.
Спасибо,за отзывчивость и совет.Буду пробовать.
Почему если есть delay - светодиод горит постоянно если нет ,то работает как надо
Так это же суппппер, когда работает как надо!
А как надо? И почему ему не гореть постоянно?
Если бы работало как надо не было вопроса. Суппппер что сразу ответил,моментально.
Заменить строку 183 на
или на
Что такое "n >= 20" это или false или true, поэтому сам вызов getTemp(false) или getTemp(true) выглядит странно.
У тебя УЖЕ n и n2 в ГРАДУСАХ, зачем еще раз переводить градусы в градусы?
Получилось соединить 2 датчика и светодиоды включаются каждый по своему условию.Но действительно получается код-простыня,и всё из-за таблиц.2 датчика 2-е таблицы и т.д. Неужели нельзя использовать одну таблицу для нескольких датчиков? Совет в посту 4 ,не понял как реализовать.Спасибо что указали на ошибку в коде (строку 183).
И ещё : при плавном изменении температуры и достижении условия
if
(n >= 20)
светодиод начинает подмигивать в полнакала (очевидно в момент перехода через условие).Как можно победить этот эффект? Чтоб было : либо включён ,либо выключен,без подмигиваний.Наверняка сталкивались с этим эффектом.
Но действительно получается код-простыня,и всё из-за таблиц.2 датчика 2-е таблицы и т.д. Неужели нельзя использовать одну таблицу для нескольких датчиков?
Они, эти таблицы, что, разные для разных датчиков?
Если одинаковые, то конечно, надо оставить только одну. :)
И вообще, странновато эта таблица выглядит. Я бы левый, нулевой, столбец вообще выкинул, а везде где нужно значение addr[i][0] написал бы просто (i-40).
Они, эти таблицы, что, разные для разных датчиков?
Если одинаковые, то конечно, надо оставить только одну. :)
Терморезисторы используемые в датчиках бывают разные, в зависимости от коэффициента взятого в даташите расчитывается таблица по формуле.В данном случае одинаковые,но могут быть разные.
А если известна формула, есть ли вообще смысл считать таблицу?
Можно ведь саму формулу в расчётах использовать.
Так это таблица соответствий температуры от сопротивления через 1 градус. Получил сопротивление надо же к какой то температуре привязать , а потом через массив считывать чтобы вывести в Serial именно температуру,а с температурой удобней работать. Лучшее описание которое нашёл(для чего и как), с калькулятором таблицы значений.
http://aterlux.ru/index.php?page=article&art=ntcresistor
Тут где то читал как 10 битный порт программно перевести в 16,чтоб точнее получалась температура.
В первом сообщении не могу поменять код на другой,так как нет кнопки изменить ,а только цитировать.Поэтому обновлённый код вставлю здесь:
Чтобы светик не мигал на границе сравнения, делают две границы, например, 20 и 21 градус. Пользоваться так: при больше или равно 21, включить светик, иначе если меньше 20, выключить таким образом от 20 до 21 градуса мы ничего не делаем. Вот такой гистерезис получается.
Чтобы не писать две функции, использующие разные таблицы, нужно в функцию передавать указатель на нужную таблицу.