автоматическая запись адресов ds18b20

rapidshe
Offline
Зарегистрирован: 31.12.2015

Добрый день! подскажите где ошибка.

пытаюсь реализовать автоматическую запись адресов ds18b20.

т.е. втыкаем в выключенную ардуину один датчик, включаем, если его адрес не совпадает с уже известными адресами, то ищется первый "пустой" адрес в массиве (в качестве "пустого" адреса я прописал {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}) и на него пишется адрес нового датчика. так же этот адрес пишется в еепром (еепром пока не реализовал, но не думаю что с этим будут проблемы).

Сначала проходятся все маячки tut1 tut2 tut3, а потом всё время tut1 tut2, tut1 tut2... хотя должно только tut1 прилетать

#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
byte addr[4][8]={{0x28,0xFF,0x35,0x86,0x90,0x15,0x04,0x94},{0x28,0x63,0x8E,0x03,0x00,0x00,0x80,0xE9},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
byte ddr[8];
  
void setup(void) {
  Serial.begin(9600);
}

void loop(void) {

  byte ddr[8];
  if (ds.search(ddr)) 
      {
      Serial.println("tut1");
      if (ddr[0] == 0x28) 
          {
          if (ddr!=addr[0] && ddr!=addr[1] && ddr!=addr[2] && ddr!=addr[3])
             {
             Serial.println("tut2");
             for (byte n = 0; n<4; n++)
                 {
                 if (addr[n][0]== 0x00 && addr[n][1]== 0x00 && addr[n][2]== 0x00 && addr[n][3]== 0x00 && addr[n][4]== 0x00 && addr[n][5]== 0x00 && addr[n][6]== 0x00 && addr[n][7]== 0x00)
                     {
                     Serial.println("tut3");
                     Serial.println(n);
                     for(byte m = 0; m < 8; m++) {addr[n][m] = ddr[m];  Serial.println(addr[n][m], HEX);}
                     break;
                     }
                 }
             }
          }   
      }
    Serial.println();
}

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

во время писания первого сообщения посетила не одна идея которые я успел перепробовать... и всё не работают. 

 

#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
byte addr[4][8]={{0x28,0xFF,0x35,0x86,0x90,0x15,0x04,0x94},{0x28,0x63,0x8E,0x03,0x00,0x00,0x80,0xE9},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
byte newaddr[8];

  
void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  if (ds.search(newaddr)) 
      {
      Serial.println("tut1");
      if (newaddr[0] == 0x28) //если это ds18b20
          {
          //если адрес найденного датчика совпадает с одним из прописанных адресов, присылаем маячек и уходим минуя else 
          if ((newaddr[0]==addr[0][0] && newaddr[1]==addr[1][0] && newaddr[2]==addr[2][0] && newaddr[3]==addr[3][0] && newaddr[4]==addr[4][0] && newaddr[5]==addr[5][0] && newaddr[6]==addr[6][0] && newaddr[7]==addr[7][0])
            ||(newaddr[0]==addr[0][1] && newaddr[1]==addr[1][1] && newaddr[2]==addr[2][1] && newaddr[3]==addr[3][1] && newaddr[4]==addr[4][1] && newaddr[5]==addr[5][1] && newaddr[6]==addr[6][1] && newaddr[7]==addr[7][1])
            ||(newaddr[0]==addr[0][2] && newaddr[1]==addr[1][2] && newaddr[2]==addr[2][2] && newaddr[3]==addr[3][2] && newaddr[4]==addr[4][2] && newaddr[5]==addr[5][2] && newaddr[6]==addr[6][2] && newaddr[7]==addr[7][2])
            ||(newaddr[0]==addr[0][3] && newaddr[1]==addr[1][3] && newaddr[2]==addr[2][3] && newaddr[3]==addr[3][3] && newaddr[4]==addr[4][3] && newaddr[5]==addr[5][3] && newaddr[6]==addr[6][3] && newaddr[7]==addr[7][3]))
            { Serial.println("tut0");//просто маячок}
          
          else {  //иначе ищем первую пустую ячейку массива (с адресом "все нули") и пишем туда адрес нового датчика          
             Serial.println("tut2");
             for (byte n = 0; n<4; n++)
                 {
                 if (addr[n][0]== 0x00 && addr[n][1]== 0x00 && addr[n][2]== 0x00 && addr[n][3]== 0x00 && addr[n][4]== 0x00 && addr[n][5]== 0x00 && addr[n][6]== 0x00 && addr[n][7]== 0x00)
                     {
                     Serial.println("tut3");
                     Serial.println(n);
                     for(byte m = 0; m < 8; m++)
                        {
                        addr[n][m] = newaddr[m];
                        Serial.println(addr[n][m], HEX);}
                     break;
                     }
                     
                 }
             }
          }   
      }
    Serial.println();
}

и вот что прилетьает в монитор. т.е. после записи адреса нового датчика при проверке стр19 получается что адрес не совпадает с уже записанными(хотя мы его только что записали). и запись новго датчика прекращается только когда заканчиваются пустые ячейки...

tut1
tut2
tut3
2
28
FF
35
86
90
15
4
94


tut1
tut2
tut3
3
28
FF
35
86
90
15
4
94


tut1
tut2


tut1
tut2


tut1
tut2


tut1
tut2


tut1
tut2


tut1
tut2

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

ядрена пассатижи... в самом начале упустил что адрес этого датчика прописан в первом же слоте... ёманарот, как сравниваются элементы массивов? что я делаю не так? моск опух, весь день как баран об ворота...

rapidshe
Offline
Зарегистрирован: 31.12.2015

вот чем форум помогает. опишешь проблему, перечитаешь что написал и заметишь что неверно обращался к массиву...

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

byte addr[8]={0x28,0xFF,0x35,0x86,0x90,0x15,0x04,0x94};

как это правильно записать и считать с eeproma?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

rapidshe пишет:

byte addr[8]={0x28,0xFF,0x35,0x86,0x90,0x15,0x04,0x94};

как это правильно записать и считать с eeproma?

Можно побайтово:

void write_to_eeprom(int addr, byte* data, int dataLen)
{
  for(int i=0;i<dataLen;i++)
    EEPROM.write(addr++, *data++);
}

write_to_eeprom(0,addr,sizeof(addr));

Можно - юзая eeprom_write_block. Можно - EEPROM.put(0,addr). Выбирайте по вкусу.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Побайтно записать и побайтно же считать.

rapidshe
Offline
Зарегистрирован: 31.12.2015

спсибо за помощь, голова думать не может. весь день сегодня на работе ковыряюсь...)

в отдельном скетче всё заработало. надо разбираться в основном.

сделал так.

запись: 

#include <EEPROM.h>

byte addr[4][8]={{0x28,0xFF,0x30,0x86,0x90,0x15,0x04,0x94},{0x28,0x63,0x8E,0x03,0x00,0x00,0x80,0xE9},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
void setup() {
  
  for(byte i = 0; i < 4; i++){
      for(byte f = 0; f < 8; f++) {
           EEPROM.write(i*8 + f ,addr[i][f]);
          }
     }

}
void loop() {

}

чтение: 

#include <EEPROM.h>

byte addr[4][8];
void setup() {
    Serial.begin(9600);
  for(byte i = 0; i < 4; i++){
      for(byte f = 0; f < 8; f++) {
          addr[i][f]= EEPROM.read(i*8 + f );
          }
     }
    
}
void loop() {
      Serial.println(" "); 
   for(byte i = 0; i < 4; i++){
      for(byte f = 0; f < 8; f++) {
         Serial.print(addr[i][f],HEX);  Serial.print(" "); 
          } 
          Serial.println(" ");
     }
    
}