Возникла проблема с 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();
}
@Peter Broomfield, 👍-1
Обсуждение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]);
}
,
@hcheung
Смотрите также:
- Установка значения float до двух знаков после запятой
- ESP-01 неправильно просыпается после глубокого сна
- Ошибка компиляции в nodeMCU вместе с датчиком температуры oneWire ds18b20 и ЖК-дисплеем 2x16 (не I2C)
- DS1820 плохие показания 4-го датчика
- Wemos D1R2 - переход Onewire 2 DS18B20 на переменную
- DS1820B возвращает только -127
- DS18b20 Заказ датчиков на кабеле
- Датчик температуры не выдает правильных значений
пожалуйста, без картинок текста...удали картинку и добавь текст, @jsotola
Пройдите руководство по адресу https://lastminuteengineers.com/multiple-ds18b20-arduino-tutorial. Попробуйте использовать их код для чтения нескольких датчиков по адресу (или индексу, но вы пытаетесь читать по адресу). Попробуйте сделать цикл чтения так, как это делают они, и использовать массивы uint8_t - это не повредит. Дайте нам знать, как это происходит, пожалуйста., @DrG
это не то, как этот сайт работает ... пожалуйста, опубликуйте обновленный код в ответе и объясните, как проблема была решена ... откатите свое редактирование, @jsotola