Возникла проблема с DS18B20 getTempC с использованием массива, содержащего адреса датчиков

Я боролся с этим и совершенно не понимаю, почему это не работает. Вот моя программа:

#include <OneWire.h>
#include <DallasTemperature.h>

// Провод данных — это контакт Arduino A0
#define ONE_WIRE_BUS A0

// Настраиваем экземпляр oneWire
OneWire oneWire(ONE_WIRE_BUS);

// Передаем нашу ссылку oneWire в Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Определяем массив для хранения всех адресов датчиков и адресов загрузки.
//=============================================== ======================
DeviceAddress SensorAddr [13] = 
                 {
 ( 0x28, 0xAA, 0x30, 0x41, 0x38, 0x14, 0x01, 0x14 ), // Датчик 1
 ( 0x28, 0xAA, 0x24, 0x31, 0x38, 0x14, 0x01, 0xDF ), // Датчик 2
 ( 0x28, 0xAA, 0xE4, 0x30, 0x38, 0x14, 0x01, 0x72 ), // Датчик 3
 ( 0x28, 0xAA, 0xD4, 0xC2, 0x38, 0x14, 0x01, 0x80 ), // Датчик 4
 ( 0x28, 0xAA, 0x6C, 0xDA, 0x38, 0x14, 0x01, 0xD5 ), // Датчик 5
 ( 0x28, 0xAA, 0xCA, 0x39, 0x38, 0x14, 0x01, 0xBB ), // Датчик 6
 ( 0x28, 0xAA, 0x75, 0x28, 0x38, 0x14, 0x01, 0x2C ), // Датчик 7
 ( 0x28, 0xAA, 0xFB, 0xB2, 0x38, 0x14, 0x01, 0xBF ), // Датчик 8
 ( 0x28, 0xAA, 0x0F, 0x3A, 0x38, 0x14, 0x01, 0xC3 ), // Датчик 9
 ( 0x28, 0xAA, 0x6F, 0x26, 0x38, 0x14, 0x01, 0xF8 ), // Датчик 10
 ( 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x6A, 0x74, 0xF1 ), // Датчик 11
 ( 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x7D, 0x29, 0x55 ), // Датчик 12
 ( 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x73, 0xAC, 0x3A )  // Датчик 13
                   };
      
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  
// Проверяем адрес первого датчика — работает
//=======================================

  byte Sensor1Test[8] = { 0x28, 0xAA, 0x30, 0x41, 0x38, 0x14, 0x01, 0x14};
  Serial.print("Test Sensor 1: ");
  float tempTest = sensors.getTempC( Sensor1Test );
  Serial.print(tempTest, 2);
  Serial.print("\xC2\xB0"); // показывает символ градуса
  Serial.print("C");            
  Serial.println();     
}

void loop(void)
// Получить все температуры - Это не работает??
//============================================

{
  sensors.requestTemperatures();
  for (int S =0; S<13; S++)
      {
        Serial.print("Sensor # "); Serial.print(S+1); Serial.print(": ");
        float tempC = sensors.getTempC(SensorAddr [S]);
        Serial.print(tempC,2);
        Serial.print("\xC2\xB0"); // показывает символ градуса
        Serial.print("C");            
        Serial.println();
        delay(1000);
      }
 Serial.println();
}

Это результат

, 👍-1

Обсуждение

пожалуйста, без картинок текста...удали картинку и добавь текст, @jsotola

Пройдите руководство по адресу https://lastminuteengineers.com/multiple-ds18b20-arduino-tutorial. Попробуйте использовать их код для чтения нескольких датчиков по адресу (или индексу, но вы пытаетесь читать по адресу). Попробуйте сделать цикл чтения так, как это делают они, и использовать массивы uint8_t - это не повредит. Дайте нам знать, как это происходит, пожалуйста., @DrG

это не то, как этот сайт работает ... пожалуйста, опубликуйте обновленный код в ответе и объясните, как проблема была решена ... откатите свое редактирование, @jsotola


1 ответ


0

DeviceAddress внутри определяется как массив uint8_t (см. определение:

typedef uint8_t DeviceAddress[8];

То есть каждый адрес сам по себе является массивом.

DeviceAddress Sensor1 = { 0x28, 0xAA, 0x30, 0x41, 0x38, 0x14, 0x01, 0x14 };

Итак, если у вас есть 13 DeviceAdrress, вы имеете дело с двумерным массивом, и вам нужно объявить его как:

#define NUMBER_OF_SENSORS 13
DeviceAddress SensorAddr [NUMBER_OF_SENSORS] = {
 { 0x28, 0xAA, 0x30, 0x41, 0x38, 0x14, 0x01, 0x14 }, // Датчик 1
 { 0x28, 0xAA, 0x24, 0x31, 0x38, 0x14, 0x01, 0xDF }, // Датчик 2
 { 0x28, 0xAA, 0xE4, 0x30, 0x38, 0x14, 0x01, 0x72 }, // Датчик 3
 { 0x28, 0xAA, 0xD4, 0xC2, 0x38, 0x14, 0x01, 0x80 }, // Датчик 4
 { 0x28, 0xAA, 0x6C, 0xDA, 0x38, 0x14, 0x01, 0xD5 }, // Датчик 5
 { 0x28, 0xAA, 0xCA, 0x39, 0x38, 0x14, 0x01, 0xBB }, // Датчик 6
 { 0x28, 0xAA, 0x75, 0x28, 0x38, 0x14, 0x01, 0x2C }, // Датчик 7
 { 0x28, 0xAA, 0xFB, 0xB2, 0x38, 0x14, 0x01, 0xBF }, // Датчик 8
 { 0x28, 0xAA, 0x0F, 0x3A, 0x38, 0x14, 0x01, 0xC3 }, // Датчик 9
 { 0x28, 0xAA, 0x6F, 0x26, 0x38, 0x14, 0x01, 0xF8 }, // Датчик 10
 { 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x6A, 0x74, 0xF1 }, // Датчик 11
 { 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x7D, 0x29, 0x55 }, // Датчик 12
 { 0x28, 0xFF, 0x64, 0x1E, 0x1E, 0x73, 0xAC, 0x3A }  // Датчик 13
};

for (int s=0; s<NUMBER_OF_SENSORS; S++) {
  float tempC = sensors.getTempC(SensorAddr[s]);
}
,