Чтение нескольких датчиков температуры NTC с помощью Arduino

Эй... Я создаю проект с четырьмя датчиками температуры NTC 10 кОм с помощью Arduino. Легко измерить только один датчик температуры NTC. Существует множество примеров измерения NTC, например код, написанный с помощью уравнения Стейнхарта-Харта, или чтение термистора АЦП с помощью таблицы поиска.

Я нашел один пример с формулой Стейнхарта-Харта. Я не очень хорошо разбираюсь в кодировании с помощью Arduino, но мне удается написать код только для одного датчика NTC и прочитать его с помощью Nokia LCD 5110. Вопрос в том, как написать код для нескольких датчиков NTC?

/* Измерение температуры NTC 13-08-2017
*
* Использование ЖК-дисплея Nokia 5110
*/

#include "LCD5110_Graph.h"
LCD5110 myGLCD(8, 9, 10, 12, 11);  // Настройка экрана Nokia 5110 SCLK/CLK=5, DIN/MOSI/DATA=6, DC/CS=7, RST=8 Выбор чипа/CE/SCE=9,
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];

int tempPin = 0;   // аналоговый вход A0
int Vout, charTc ;
float R1 = 10000; //отпорность на собственную температуру 10К или 10000 ома
float R2, Tk, Tc;
float Ac = 1.009249522e-03, Bc = 2.378405444e-04, Cc = 2.019202697e-07;
char charBuffer[10];


void setup(){
myGLCD.InitLCD(); //инициализируем LCD с контрастностью по умолчанию 70
myGLCD.setContrast(68);
myGLCD.setFont(SmallFont); // Установить размер шрифта по умолчанию. tinyFont 4x6, smallFont 6x8, mediumNumber 12x16, bigNumbers 14x24
myGLCD.clrScr();

myGLCD.print("Temp test",CENTER,0);
myGLCD.print("Check",CENTER,12);
myGLCD.print("Please Wait",CENTER,24);

myGLCD.update(); 
delay(5000);
myGLCD.clrScr();
}

void loop() {
  Vout = analogRead(tempPin);
  R2 = R1 * (1023.0 / (float)Vout - 1.0); // преобразование из аналогового в цифровое
  Tk = (1.0 / (Ac + Bc*log(R2) + Cc*log(R2)*log(R2)*log(R2))); // Температура в Кльвене
  Tc = Tk - 273.15; //температура конвертируется в цельсию

charTc=dtostrf(Tc, 3, 2, charBuffer);



  myGLCD.clrScr();
  //myGLCD.print("Разрядка",CENTER,0);
  //myGLCD.print("Температура:",ЦЕНТР,0);
  myGLCD.print("Temp1:",0,0);
  //myGLCD.print(charTc,CENTER,20);
  myGLCD.print( charTc,36,0 );
  myGLCD.print("Temp2:",0,10);
  myGLCD.print("Temp3:",0,20);
  myGLCD.print("Temp4:",0,30);
  myGLCD.update(); 
  delay(2000);
  myGLCD.clrScr();
}

, 👍1

Обсуждение

Строка int tempPin = 0; // Аналоговый вход A0 указывает, какой аналоговый вход следует использовать в качестве входа для чтения значения NTC. Затем вы можете расширить код необходимыми аналоговыми входами., @MatsK

Спасибо за ответ. Да, я знаю, что Arduino имеет 8 входов АЦП. Но мое желание состоит в том, как выполнить интервальное выполнение для многих входов АЦП. Это лучший способ написать прерывание таймера? для каждого аналогового входа выполняться каждые 2 секунды, если показания АЦП изменились?, @Abdelsalam Hamid


5 ответов


1

Строка int tempPin = 0; // Аналоговый вход A0 указывает, какой аналоговый вход следует использовать в качестве входа для считывания значения NTC.

Затем вы можете расширить код необходимыми аналоговыми входами.

,

0
  1. Вставьте несколько аналоговых входных контактов и считывайте их последовательно;

  2. Вставьте несколько аналоговых входных контактов и сканируйте их в прерываниях adc.

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

,

1

Arduino UNO имеет 6 аналоговых контактов..

Последовательно читать ADC каждые 2 секунды, либо вызывая соответствующие функции ADC внутри TIMER_INTERRRUPT_VECTOR(), либо, если высокая точность не требуется, вы можете ограничить свой основной цикл() небольшим размером и записать все ADC внутри него. Также убедитесь, что вы сэмплируете свой АЦП, если пишете внутри цикла, чтобы убедиться, что он точен.

,

Да... в обоих случаях писать в цикле просто, но всегда лучше запустить цикл() в кратчайшие сроки... если вы планируете изменить код в будущем. Еще один вариант - создать отдельные задачи и заставить все АЦП работать независимо, но это немного сложно, @GOKUL


1

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

// предполагается, что датчики на A0, A1, A2, Ax

sensorPins [] = {A0, A1, A2};
int sensorNum = 3;

for(int x = 0; x < sensorNum; x++){
  readSensor(x);
}

Что-то подобное должно вам подойти.

,

0

Это довольно просто. Создайте массив переменных uint_8, содержащих ваши номера контактов.

Затем напишите функцию, которая принимает номер вывода в качестве входных данных, считывает АЦП, выполняет математические операции и возвращает значение.

sensorPins [] = {A0, A1, A2, A3};

float readTemp(int tempPin) {
  int Vout = analogRead(tempPin);
  float R2 = R1 * (1023.0 / (float)Vout - 1.0); // преобразование из аналогового в цифровое
  float Tk = (1.0 / (Ac + Bc*log(R2) + Cc*log(R2)*log(R2)*log(R2))); // Температура в Кельвенах
  Tc = Tk - 273.15; //температура конвертируется в градусы Цельсия
  return Tc;
}

Затем напишите цикл, который проходит по массиву номеров выводов и вызывает функцию readTemp.

,