Отображение нескольких температурных выходов с термисторами
Итак, я задал этот вопрос пару дней назад, но еще немного поработал с некоторыми кодировками, но я действительно застрял и нуждаюсь в некоторой помощи. Я пытаюсь отобразить температуру для каждого отдельного термистора с входных контактов A0-A8 на плате 2560. Моя текущая проблема в том, что он считывает только входной контакт A8. Нужно ли мне делать больше объявлений, таких как "double readThermistor1, double readThermistor2 ..." и т.д. После того, как я сделаю эти заявления, как я буду отображать каждый отдельный термистор? Я опубликую то, что у меня есть на данный момент:
// Константы
const int SAMPLE_NUMBER = 10;
const double BALANCE_RESISTOR = 10000.0;
const double MAX_ADC = 1023.0;
const double BETA = 3977.0;
const double ROOM_TEMP = 298.15; // температура в помещении в Кельвинах
const double RESISTOR_ROOM_TEMP = 10060.0;
// Здесь мы сохраним текущую температуру
double currentTemperature = 0;
// Объявления Pin
//Входные данные:
int thermistorPin[] = {A0,A1,A2,A3,A4,A5,A6,A7,A8}; // Где АЦП выбирает выходной сигнал резисторного делителя
// Результаты:
void setup()
{
// Настройка скорости порта для сообщений последовательного окна
Serial.begin(9600);
}
double readThermistor()
{
// переменные, которые работают в этой функции
double rThermistor = 0; // Содержит значение сопротивления термистора
double tKelvin = 0; // Удерживает расчетную температуру
double tCelsius = 0; // Удерживает температуру в градусах Цельсия
double adcAverage = 0; // Содержит среднее
int adcSamples[SAMPLE_NUMBER]; // Массив для хранения каждого измерения напряжения
/* Calculate thermistor's average resistance:
As mentioned in the top of the code, we will sample the ADC pin a few times
to get a bunch of samples. A slight delay is added to properly have the
analogRead function sample properly */
for (int i = 0; i < SAMPLE_NUMBER; i++)
{
adcSamples[i] = analogRead(thermistorPin[0]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[1]);
delay(10); // подождите 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[2]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[3]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[4]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[5]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[6]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[7]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
adcSamples[i] = analogRead(thermistorPin[8]); // считывание с вывода и сохранение
delay(10); // ожидание 10 миллисекунд
}
/* Then, we will simply average all of those samples up for a "stiffer"
measurement. */
for (int i = 0; i < SAMPLE_NUMBER; i++)
{
adcAverage += adcSamples[i]; // сложить все выборки . . .
}
adcAverage /= SAMPLE_NUMBER; // . . . усреднить его без деления
rThermistor = BALANCE_RESISTOR * ( (MAX_ADC / adcAverage) - 1);
tKelvin = (BETA * ROOM_TEMP) /
(BETA + (ROOM_TEMP * log(rThermistor / RESISTOR_ROOM_TEMP)));
tCelsius = tKelvin - 273.15; // перевести кельвин в Цельсий
return tCelsius; // Возвращает температуру в градусах Цельсия
}
void loop()
{
currentTemperature = readThermistor();
delay(3000);
/* Here is how you can act upon a temperature that is too hot,
too cold or just right. */
if (currentTemperature > 0.0 && currentTemperature < 60.0)
{
Serial.print("It is ");
Serial.print(currentTemperature);
Serial.println("C. Ahhh, very nice temperature.");
}
else if (currentTemperature >= 60.0)
{
Serial.print("It is ");
Serial.print(currentTemperature);
Serial.println("C. I feel like a hot tamale!");
}
}
Любая помощь приветствуется, спасибо.
@GarthDanti, 👍-1
Обсуждение1 ответ
Вот мое предложение:
Суммируйте показания (выборки) каждого датчика (термистора) и сохраните сумму в массиве. Затем разделите каждую сумму на количество взятых проб. Вместо того чтобы вычислять один Цельсий, вычислите один Цельсий для каждого среднего значения и сохраните его также в массиве. Затем распечатайте каждый из них. Не стесняйтесь печатать его так, как вам нравится.
Кстати, я не компилировал и не тестировал код. В нем могут быть ошибки. Используйте это как подсказку / пример.
const int SAMPLE_NUMBER = 10;
const double BALANCE_RESISTOR = 10000.0;
const double MAX_ADC = 1023.0;
const double BETA = 3977.0;
const double ROOM_TEMP = 298.15;
const double RESISTOR_ROOM_TEMP = 10060.0;
// PIN_COUNT - это длина списка контактов термистора.
const double PIN_COUNT = 9;
int thermistorPin[] = {A0,A1,A2,A3,A4,A5,A6,A7,A8};
void setup()
{
Serial.begin(9600);
}
double readThermistor()
{
double rThermistor = 0.0;
double tKelvin = 0.0;
// Количество нулей ниже должно быть равным
// к PIN_COUNT
double tCelsius[]
= {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0};
double adcSampleSumPerPin[]
= {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0};
for (int i = 0; i < SAMPLE_NUMBER; i++)
{
for (int j = 0; j < PIN_COUNT; i++)
{
adcSampleSumPerPin[j] +=
(double) analogRead(thermistorPin[j]);
delay(10);
}
}
for (int i = 0; i < PIN_COUNT; i++)
{
adcSampleSumPerPin[i] /= SAMPLE_NUMBER;
rThermistor = BALANCE_RESISTOR *
((MAX_ADC / adcSampleSumPerPin[i]) - 1);
tKelvin = (BETA * ROOM_TEMP) /
(BETA + (ROOM_TEMP * log(rThermistor /
RESISTOR_ROOM_TEMP)));
tCelsius[i] = tKelvin - 273.15;
}
return tCelsius;
}
void loop()
{
delay(3000);
currentTemps = readThermistor();
for (i = 0; i < PIN_COUNT; i++)
{
double currentTemperature = currentTemp[i];
if (currentTemperature > 0.0 && currentTemperature < 60.0)
{
Serial.print("Sensor A");
Serial.print(i);
Serial.println(":");
Serial.print("It is ");
Serial.print(currentTemperature);
Serial.println("C. Ahhh, very nice temperature.");
}
else if (currentTemperature >= 60.0)
{
Serial.print("Sensor A");
Serial.print(i);
Serial.println(":");
Serial.print("It is ");
Serial.print(currentTemperature);
Serial.println("C. I feel like a hot tamale!");
}
}
}
Что это за суффикс D
? У вас есть какие-нибудь рекомендации по этому поводу?, @Edgar Bonet
@EdgarBonet Да, вы правы: суффикс D - это бессмыслица. В C ++ есть только F для float и L / LL для long double. литералы x.yyy по умолчанию имеют значение double . Иногда я смешиваю Java и C ++. Я изменил это в своем ответе. Спасибо вам за подсказку., @Peter Paul Kiefer
- Использование аналогового входа для чтения кнопки
- Преобразование строки в массив символов
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Bluetooth-модуль HC-05 не принимает AT-команды
- Как я могу прервать задержку() при нажатии кнопки?
- Объявление переменной внутри основного цикла
Моя текущая проблема в том, что он читает только A8"... это то , что вы сказали Arduino сделать ... смотрите
for (int i = 0; i < Цикл SAMPLE_NUMBER.... подумайте о переменной
adcSamples [i]`, @jsotolaвероятно , вам нужен 2D - массив ... используйте два вложенных цикла
for
для считывания значений датчиков в массив... несколько строкanalogRead()
не нужны, @jsotolaЯ бы лично подумал о том, чтобы объединить все данные и логику для одного термистора в "класс", а затем создать несколько классов для каждого термистора., @Majenko
для (s ...)
для (i ...)
adcSamples[i][s] = analogRead(термисторный вывод [i]);
...i
- это номер датчика ...s
- это номер образца, @jsotolaЗачем использовать восемь термисторов, если вы хотите измерить только одну температуру? Более разумным было бы использовать один хорошо откалиброванный термистор., @Edgar Bonet