Чтение нескольких датчиков температуры 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();
}
5 ответов
Строка int tempPin = 0; // Аналоговый вход A0
указывает, какой аналоговый вход следует использовать в качестве входа для считывания значения NTC.
Затем вы можете расширить код необходимыми аналоговыми входами.
Вставьте несколько аналоговых входных контактов и считывайте их последовательно;
Вставьте несколько аналоговых входных контактов и сканируйте их в прерываниях adc.
первый подход довольно прост, а второй требует тщательного прочтения таблицы данных.
Arduino UNO имеет 6 аналоговых контактов..
Последовательно читать ADC каждые 2 секунды, либо вызывая соответствующие функции ADC внутри TIMER_INTERRRUPT_VECTOR(), либо, если высокая точность не требуется, вы можете ограничить свой основной цикл loop() небольшим размером и записать все ADC внутри него. Также убедитесь, что вы сэмплируете свой АЦП, если пишете внутри цикла, чтобы убедиться, что он точен.
Да... в обоих случаях писать в цикле просто, но всегда лучше запустить цикл() в кратчайшие сроки... если вы планируете изменить код в будущем. Еще один вариант - создать отдельные задачи и заставить все АЦП работать независимо, но это немного сложно, @GOKUL
Насколько я понимаю, у вас есть несколько аналоговых датчиков, которые вы хотите считать. Таким образом, ваш код должен выглядеть примерно так:
// предполагается, что датчики на A0, A1, A2, Ax
sensorPins [] = {A0, A1, A2};
int sensorNum = 3;
for(int x = 0; x < sensorNum; x++){
readSensor(x);
}
Что-то подобное должно вам подойти.
Это довольно просто. Создайте массив переменных 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.
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Строка
int tempPin = 0; // Аналоговый вход A0
указывает, какой аналоговый вход следует использовать в качестве входа для чтения значения NTC. Затем вы можете расширить код необходимыми аналоговыми входами., @MatsKСпасибо за ответ. Да, я знаю, что Arduino имеет 8 входов АЦП. Но мое желание состоит в том, как выполнить интервальное выполнение для многих входов АЦП. Это лучший способ написать прерывание таймера? для каждого аналогового входа выполняться каждые 2 секунды, если показания АЦП изменились?, @Abdelsalam Hamid