Что здесь неправильно?

Bishkek
Offline
Зарегистрирован: 11.12.2014
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;
                   }

 

Bishkek
Offline
Зарегистрирован: 11.12.2014

Всё:начало получилось отлично.Сам спросил ,сам ответил.Следующий этап к этому коду приклеить шаговый мотор,пикалку ит.д.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ни вопроса, ни ответа. Пришёл поговорил о своём, а поделиться что было и как исправил?

Bishkek
Offline
Зарегистрирован: 11.12.2014

Этот код для обработки показаний NTC-термистора одного автомобильного датчика(в данном случае ГАЗоновский,инжекторный,двухпроводный) по таблице.Не получалось зажечь светодиод при достижении требуемой температуры.А вот и вопрос(риторический):чтоб сделать обработку второго датчика и третьего,как нужно сделать ?Код для первого датчика оформить как функцию или библиотеку? Чтоб в последствии по показаниям трёх датчиков строить логику управления моторчиками,светодиодами и т.д.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чтобы сделать опрос нескольких датчиков можно взять код из loop и оформить в виде отдельной функции, в которую передается номер пина, где расположен датчик и номер пина для управления/сигнализации, тогда в loop вызывать эту функцию столько раз, сколько датчиков. Плюс выкинуть delay(500) из функции и, если это нужно, делать delay мужду вызовами. А в дальнейшем совсем избавиться от delay.

PS Просто совет, если хотите, чтобы кто то смотрел исходники, форматируйте их (Ctrl-T в ArduinoIDE) и люди будут более охотно смотреть, иначе ответа можно не дождаться. Лично я прохожу мимо большой простыни с кривокосым кодом. Но дело Ваше.

 

Bishkek
Offline
Зарегистрирован: 11.12.2014

Спасибо,за отзывчивость и совет.Буду пробовать.

Bishkek
Offline
Зарегистрирован: 11.12.2014

Почему если есть delay - светодиод горит постоянно если нет ,то работает как надо

[code]
void loop()
{

  int n = (getTemp(analogRead(A0)));
  Serial.print("   ");
  Serial.print("int n : ");
  Serial.print(n);
  Serial.print("C");
  int n2 = (getTemp(analogRead(A1)));
  Serial.print("   ");
  Serial.print("int n2 : ");

  Serial.println("C");
  //delay(500);

  if (getTemp(n >= 20)) // Условие вкючения светодиода.Значение в градусах
    digitalWrite(LED_PIN_11, HIGH);

  else
    digitalWrite(LED_PIN_11, LOW);


}

[/code]

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Так это же суппппер, когда работает как надо!

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

А как надо? И почему ему не гореть постоянно?

Bishkek
Offline
Зарегистрирован: 11.12.2014

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Заменить строку 183 на

if (n >= 20) // Условие вкючения светодиода.Значение в градусах

или на

if (n2 >= 20) // Условие вкючения светодиода.Значение в градусах

Что такое "n >= 20" это или false или true, поэтому сам вызов getTemp(false) или getTemp(true) выглядит странно.

У тебя УЖЕ n и n2 в ГРАДУСАХ, зачем еще раз переводить градусы в градусы?

 

Bishkek
Offline
Зарегистрирован: 11.12.2014

Получилось соединить 2 датчика и светодиоды включаются каждый по своему условию.Но действительно получается код-простыня,и всё из-за таблиц.2 датчика 2-е таблицы и т.д. Неужели нельзя использовать одну таблицу для нескольких датчиков? Совет в посту 4 ,не понял как реализовать.Спасибо что указали на ошибку в коде (строку 183).

И ещё : при плавном изменении  температуры и достижении условия if (n >= 20)
светодиод начинает подмигивать в полнакала (очевидно в момент перехода через условие).Как можно победить этот эффект? Чтоб было : либо включён ,либо выключен,без подмигиваний.Наверняка сталкивались с этим эффектом.

Datak
Offline
Зарегистрирован: 09.10.2014

Bishkek пишет:

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

Они, эти таблицы, что, разные для разных датчиков?
Если одинаковые, то конечно, надо оставить только одну. :)

И вообще, странновато эта таблица выглядит. Я бы левый, нулевой, столбец вообще выкинул, а везде где нужно значение addr[i][0] написал бы просто (i-40).

Bishkek
Offline
Зарегистрирован: 11.12.2014

Datak пишет:

Они, эти таблицы, что, разные для разных датчиков?
Если одинаковые, то конечно, надо оставить только одну. :)

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

Datak
Offline
Зарегистрирован: 09.10.2014

А если известна формула, есть ли вообще смысл считать таблицу?
Можно ведь саму формулу в расчётах использовать.

Bishkek
Offline
Зарегистрирован: 11.12.2014

Так это таблица соответствий температуры от сопротивления через 1 градус. Получил сопротивление надо же к какой то температуре привязать , а потом через массив считывать чтобы вывести в Serial именно температуру,а с температурой удобней работать. Лучшее описание которое нашёл(для чего и как), с калькулятором таблицы значений.

http://aterlux.ru/index.php?page=article&art=ntcresistor

Тут где то читал как 10 битный порт программно перевести в 16,чтоб точнее получалась температура.

Bishkek
Offline
Зарегистрирован: 11.12.2014

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

#define LED_PIN_10  10      // номер выхода,подключенного к светодиоду
#define LED_PIN_11  11      // номер выхода,подключенного к светодиоду
#define SERIAL_SPEED 9600 // скорость работы Serial

void setup()
{
  Serial.begin(SERIAL_SPEED);
  pinMode(LED_PIN_10 , OUTPUT);
  pinMode(A0, INPUT) ;
  pinMode(LED_PIN_11, OUTPUT);
  pinMode(A1, INPUT) ;

}
void loop()
{

  int n = (getTemp(analogRead(A0)));
  Serial.print("   ");
  Serial.print("int n : ");
  Serial.print(n);
  Serial.print("C");
  Serial.print("   ");
  Serial.print(" getR : ");
  Serial.print(getR(analogRead(A0)));
  Serial.print("   ");
  Serial.print("%");

  int n2 = (getTemp2(analogRead(A1)));
  Serial.print("   ");
  Serial.print("int n2 : ");
  Serial.print(n2);
  Serial.print("C");
  Serial.print("   ");
  Serial.print(" getR2 : ");
  Serial.println(getR(analogRead(A1)));
  delay(500);

  if (n >= 20) // Условие вкючения светодиода.Значение в градусах
    digitalWrite(LED_PIN_10, HIGH);
  else
    digitalWrite(LED_PIN_10, LOW);
  if (n2 >= 25) // Условие вкючения светодиода.Значение в градусах
    digitalWrite(LED_PIN_11, HIGH);
  else
    digitalWrite(LED_PIN_11, LOW);
}

//таблица соответствий температуры от сопротивления
float addr[151][2] =
{
 //Таблица в 1 сообщении
};
//таблица соответствий температуры от сопротивления
float addr2[152 ][2] =
{
 //Таблица в 1 сообщении
};

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


float getR2(float V)//функция преобразования напряжения полученного с аналогового входа в сопротивление терморезистора
{
  float result;
  result = -10 * V / (V - 1024);
  return result;
}
float getTemp2(float V)  //функция преобразования сопротивления в градусы по Цельсию
{
  float R2;
  R2 = getR2(V);
  int i = 0;
  while (addr2[i][1] > R2)
  {
    i++;
  }
  float result;
  result = (R2 - addr2[i][1]) * (addr2[i - 1][0] - addr2[i][0]) / (addr2[i - 1][1] - addr2[i][1]) + addr2[i][0];
  return result;
}

 


 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чтобы светик не мигал на границе сравнения, делают две границы, например, 20 и 21 градус. Пользоваться так: при больше или равно 21, включить светик, иначе если меньше 20, выключить таким образом от 20 до 21 градуса мы ничего не делаем. Вот такой гистерезис получается.

Чтобы не писать две функции, использующие разные таблицы, нужно в функцию передавать указатель на нужную таблицу.