Как использовать в цикле for названия переменных, чтобы они перебирались по очереди
- Войдите на сайт для отправки комментариев
Втр, 26/03/2019 - 19:31
Здравствуйте.
у меня есть много датчиков ds18b20 пока 15, но в дальнейшем будет еще больше, их адреса известны и объявлены как byte,
byte addr1[8]={0x28,0xFF,0x94,0x84,0x24,0x17,0x03,0x5D};
каждый получает температуру и записывает в свою переменную t1,t2,t3 и так далее,(объявлены как volatile int) как облагородить такой кусок кода
ds.reset();
ds.select(addr1);
ds.write(0xBE); // Read Scratchpad (чтение регистров)
t1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта
ds.reset();
ds.select(addr2);
ds.write(0xBE); // Read Scratchpad (чтение регистров)
t2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта
ds.reset();
ds.select(addr3);
ds.write(0xBE); // Read Scratchpad (чтение регистров)
t3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта
ds.reset();
ds.select(addr4);
ds.write(0xBE); // Read Scratchpad (чтение регистров)
t4 = ds.read() | (ds.read()<<8); //прочитаны 2 байта
и вот такой на вывод
Serial.print(t1/16.0); // выводим как десятичное число - то же, что и формат "DEC"
Serial.print(" t2= ");
Serial.print(t2/16.0);
Serial.print(" t3= ");
Serial.print(t3/16.0);
Serial.print(" t4= ");
Serial.print(tt4);
плюс, я хочу это все на sd карту писать и там тоже будет такая простыня
пытался гуглить, но не сумел
пробовал вот так, не работает
for (int i=1; i<15;i++){
Serial.print(" t[i]= ");
Serial.print(t[i]/16.0);
}
говорит "'t' was not declared in this scope"
вот такая проблемка, прошу помочь.
Надо использовать одномерный массив для температур и двухмерный массив доя адресов.
Спасибо, так и думал, что что-то здесь не то, буду разбираться с массивами
окажу медвежью услугу... один из первых моих кодов... хотя проще самому написать ИМХО ... с мусором и delay
//100% рабочий алгоритм // одновременный старт на конвертацию всех датчиков #include <OneWire.h> OneWire ds(A2); // линия 1-Wire будет на этом пине byte ndT = 9; // сколько датчиков подключили // список адресов моих датчиков для теста byte DeviceAddres[9][8]={ // ...а датчиков у мня 7 штук в наличии {0x28, 0xB2, 0x29, 0xD7, 0x8, 0x0, 0x0, 0xDE}, // датчик с нулевым адресом, 1й {0x28, 0x96, 0x66, 0xFA, 0x8, 0x0, 0x0, 0xDF}, // адрес 1, 2й второй по порядку {0x28, 0x3F, 0x43, 0xD6, 0x8, 0x0, 0x0, 0x5D}, // 3й {0x28, 0xD, 0xFD, 0xD7, 0x8, 0x0, 0x0, 0xBC}, // 4й {0x28, 0x28, 0x88, 0xD6, 0x8, 0x0, 0x0, 0xD1}, // 5й {0x28, 0xF1, 0xD0, 0xFA, 0x8, 0x0, 0x0, 0xD7}, // 6й - нет такого у меня, просто для теста кода {0x28, 0x2B, 0xB7, 0xF7, 0x8, 0x0, 0x0, 0x9C}, // 7й {0x28, 0xF1, 0xD0, 0xF7, 0x8, 0x0, 0x0, 0xD7}, // 8й {0x28, 0xF1, 0xF1, 0xF1, 0x8, 0x0, 0x0, 0xD7}, // 9й - нет такого у меня, просто для теста кода }; byte CheckDevicePresent[9]= {0, 0, 0, 0, 0, 0, 0, 0, 0}; // заняли место в памяти под проверку датчиков и переменные byte data[12]; // переменная для данных из датчика int SignBit; // знак температуры int Tc_100; // умножено на 100 целочисленное значение температуры, т.е. запятая "подвинута >>" на 2 знака byte conversion_T = 0; // разнести по времени обращение и прием данных из датчика void setup(void) { Serial.begin(9600); } void loop() { for (byte i = 0; i < ndT; i++) // чИпЯтаем шапку таблЫцЫ { Serial.print( "Device №" ); Serial.print( i ); Serial.print( " " ); } Serial.println( " " ); start_conversion_T (); // for (byte i = 0; i < ndT; i++) // проверяем все датчикии, запускаем АЦП // { // start_conversion_T (i); // } delay (1000); // задержка на конвертацию if (conversion_T == 1) // задержка на конвертацию { conversion_T = 2; // место для нормального кода без delay } if (conversion_T == 2) // если груши уже поспели - собираем урожай { for (byte i = 0; i < ndT; i++) // получаем и печатаем результаты { GETTEMP (i); // получаем температуру if (CheckDevicePresent[i] != 0) //если датчик не нашли {Serial.print( " NC " );} else { if (SignBit) {Serial.print( " -" );} else {Serial.print( " " );} Serial.print( Tc_100 ); Serial.print( " " ); }}} conversion_T = 0; // прочитали все датчики можно заново запрашивать Serial.println( " " ); Serial.print( " " ); for (byte i = 0; i < ndT; i++) // печатаем для самоконтроля { Serial.print( CheckDevicePresent[i] , DEC ); Serial.print( " " ); } Serial.println( " " ); Serial.println( " " ); Serial.println( " " ); Serial.println( " " ); delay (10000); // задержка на конвертацию !!!!!! :)))))))))))))) } // конец loop void start_conversion_T () { if (conversion_T == 0) { ds.reset(); ds.write(0xCC); // обращение ко всем DS18x20 ds.write(0x44, 1); // Запускаем конвертацию (получение температуры) conversion_T = 1; // запустили конвертацию } } void GETTEMP (byte No) { ds.reset(); ds.select(DeviceAddres[No]); ds.write(0xBE); // Считываем ОЗУ датчика for (byte i = 0; i < 9; i++) // Обрабатываем 9 байт { data[i] = ds.read(); } if (data[4] == 255) // проверяем CRC 8 или CONFIG 4 если его нет, нет датчика = 255 (0xFF) // в конфиге бит 1 всегда 0, а CRC может быть 255 { CheckDevicePresent[No]= 1; // пишем, что датчика нет return; } CheckDevicePresent[No]= 0; // пишем, что датчик есть // Высчитываем температуру :) int TReading; TReading = (data[1] << 8) + data[0]; // собираем в кучку оба байта SignBit = TReading & 0x8000; // Проверяем дубак там или нет if (SignBit) // Если на улице дубак :) { TReading = (TReading ^ 0xffff) + 1; } // Tc_100 - это температура из датчика формата int со сдвинутой запятой на 2 знака Tc_100 = (6 * TReading) + TReading / 4; // Умножаем на (100 * 0.0625) или 6.25 // т.е. убираем 4 лишних бита } ////старая версия запроса на преобразование по адресам //void start_conversion_T (byte No) //{ // // ds.reset(); // ds.select(DeviceAddres[No]); // ds.write(0xBE); // Считываем ОЗУ датчика // // for (byte i = 0; i < 9; i++) // читаем в байты, 9 байт ОЗУ датчика // { data[i] = ds.read(); } // // if (data[4] == 255) // проверяем CRC 8 или CONFIG 4 если его нет, нет датчика = 255 (0xFF) // // в конфиге бит 1 всегда 0, а CRC может быть 255 // { // CheckDevicePresent[No]= 1; // пишем, что датчика нет // return; // } // // CheckDevicePresent[No]= 0; // датчик есть // ds.reset(); // ds.select(DeviceAddres[No]); // ds.write(0x44, 1); // Запускаем конвертацию (получение температуры) //}спасибо, проверку на crc у вас стыбрю, а то я сам не докумекал