Как использовать в цикле for названия переменных, чтобы они перебирались по очереди

devilneko
Offline
Зарегистрирован: 26.03.2019

Здравствуйте.

у меня есть много датчиков 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"

вот такая проблемка, прошу помочь.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Надо использовать одномерный массив для температур и двухмерный массив доя адресов.

devilneko
Offline
Зарегистрирован: 26.03.2019

Спасибо, так и думал, что что-то здесь не то, буду разбираться с массивами

Гриша
Offline
Зарегистрирован: 27.04.2014

окажу медвежью услугу... один из первых моих кодов... хотя проще самому написать ИМХО ... с мусором и 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);   // Запускаем конвертацию (получение температуры)
//}

 

devilneko
Offline
Зарегистрирован: 26.03.2019

спасибо, проверку на crc у вас стыбрю, а то я сам не докумекал