Как назвать датчики температуры вместо адреса печати с помощью датчиков ds2482-100 и ds18b20 - Справка
Я использую 10 датчиков температуры DS18B20, используя с "DS2482-100" плата с I2C и Arduino поэтому, когда я получаю выход, как это:- "диск = 28 46 04 0d с 1Ф 00 00 74 96014B467FFF0A100A 25.3 2699 постоянного тока", поэтому вместо адреса я хочу назвать его "зонд-1", "Зонд-2" нравится, что любой учебник или помощь будет оценили.
`* Библиотека Arduino для управления DS2482-100 и DS2482-800 1-проводными мастерами. Использует библиотеку проводов для связи с DS2482, поэтому обязательно позвоните Wire.begin() перед использованием библиотеки. Быстрый пример, смоделированный по примеру Onewire: */
#include <OneWire.h> #include <Wire.h> #include <DS2482.h> #include <DallasTemperature.h> DS2482 ds(0); //channels ds2482-800 is 0 to 7, DS2482-100 is just set 0 byte data[12]; //holding for onewire capture byte addr[8]; //1wire wire address and CRC long time_temp; uint8_t sensor1[8] = { 0x28, 0x00, 0xF9, 0x1E, 0x0D, 0x00, 0x00, 0x76 }; uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 }; void setup() { Wire.begin(); ds.reset(); pinMode(13, OUTPUT); // start serial port Serial.begin(57600); time_temp = millis(); } void loop() { //do search if ( !ds.wireSearch(addr)) { if(addr == sensor1) { Serial.print("sensor1"); }; Serial.print("No more addresses.\n"); ds.wireResetSearch(); return; } Serial.print("ROM ="); for ( int i = 0; i < 8; i++) { Serial.write(' '); if (addr[i] < 16) Serial.print("0"); Serial.print(addr[i], HEX); } if (ds.crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } //test if device code DS18b20 if (addr[0] == 0x28) { //read temperature data. ds.wireReset(); ds.selectChannel(0); ds.wireSelect(addr); ds.configure(0x05); //set bus on strong pull-up after next write until next command ds.wireWriteByte(0x44); //convert temperature on this device delay(770); //wait for conversion 750ms Plus margin ds.wireReset(); ds.selectChannel(0); ds.wireSelect(addr); ds.wireWriteByte(0xbe); // Read Scratchpad command //display hex values of scratchpad Serial.print(" "); for ( int i = 0; i < 9; i++) { data[i] = ds.wireReadByte(); if (data[i] < 16)Serial.print("0"); Serial.print(data[i], HEX); } Serial.print(" "); //convert to decimal temperature int LowByte = data[0]; int HighByte = data[1]; int TReading = (HighByte << 8) + LowByte; int SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } int Tc_100 = (double)TReading * 0.0625 * 10; if (SignBit) // If its negative { Tc_100 = 0 - Tc_100; } //print temp for each device Serial.print(Tc_100 / 10); Serial.print("."); Serial.print(Tc_100 % 10); Serial.print(" "); Serial.print(millis() - time_temp); Serial.println(" Dc"); } }
@Khangesh, 👍1
Обсуждение0
Смотрите также:
- Как я могу прервать задержку() при нажатии кнопки?
- Варианты протокола для обмена данными между Arduino и ESP8266
- Программирование Arduino Uno R3 для срабатывания реле каждые 24 часа
- Соединение I2C с модулем камеры MT9D111, странные результаты после записи регистров через i2C
- Servo_Pointer' was not declared in this scope
- Преобразование int или float в массив байтов в ардуино
- Плата управления реле I2C от двух Arduino Uno
- Операторы If/Else на Arduino не выполняются
Вы почти сделали это - но вы не можете сравнить один массив с другим, как вы бы сравнили два int. Вместо этого вы должны сравнить их байт за байтом и проверить, что оба байта[0]совпадают, оба байта[1]совпадают, ... и т. Д., Пока не дойдете до конца массивов. Некоторые языки поддерживают сравнение или выполнение арифметических и массивных преобразований всего массива с помощью одного оператора. C++ этого не поддерживает., @JRobert
Как сказал Жробер, это не особенность языка. Он, однако, доступен вам в нескольких вариантах на ESP8266. Библиотека C (и, следовательно, C++) имеет [
memcmp()
](https://en.cppreference.com/w/c/string/byte/memcmp), который будет сравнивать последовательности байтов. ESP8266 также поставляется с довольно полной стандартной библиотекой C++, включая [std::equal
](https://en.cppreference.com/w/cpp/algorithm/equal), который можно использовать для сравнения массивов всего, что поддерживает==
., @timemageБольшое спасибо за ответ, я пробую его с 2 датчиками,так как я новичок в этом программировании, я не могу написать его правильно, и более того, я хочу использовать его для 10 или более 10 датчиков температуры, в этом случае можно использовать memcmp(). Спасибо!, @Khangesh