Как назвать датчики температуры вместо адреса печати с помощью датчиков ds2482-100 и ds18b20 - Справка

Я использую 10 датчиков температуры DS18B20, используя с "DS2482-100" плата с I2C и Arduino поэтому, когда я получаю выход, как это:- "диск = 28 46 04 0d с 1Ф 00 00 74 96014B467FFF0A100A 25.3 2699 постоянного тока", поэтому вместо адреса я хочу назвать его "зонд-1", "Зонд-2" нравится, что любой учебник или помощь будет оценили.

  1. `* Библиотека 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");
       }
    
    
       }
    

, 👍1

Обсуждение

Вы почти сделали это - но вы не можете сравнить один массив с другим, как вы бы сравнили два 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