Отображение нескольких температурных выходов с термисторами

Итак, я задал этот вопрос пару дней назад, но еще немного поработал с некоторыми кодировками, но я действительно застрял и нуждаюсь в некоторой помощи. Я пытаюсь отобразить температуру для каждого отдельного термистора с входных контактов 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!");
  } 
}

Любая помощь приветствуется, спасибо.

, 👍-1

Обсуждение

Моя текущая проблема в том, что он читает только 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


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