автоматическая запись адресов ds18b20
- Войдите на сайт для отправки комментариев
Ср, 11/05/2016 - 19:15
Добрый день! подскажите где ошибка.
пытаюсь реализовать автоматическую запись адресов 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();
}
во время писания первого сообщения посетила не одна идея которые я успел перепробовать... и всё не работают.
#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 получается что адрес не совпадает с уже записанными(хотя мы его только что записали). и запись новго датчика прекращается только когда заканчиваются пустые ячейки...
ядрена пассатижи... в самом начале упустил что адрес этого датчика прописан в первом же слоте... ёманарот, как сравниваются элементы массивов? что я делаю не так? моск опух, весь день как баран об ворота...
вот чем форум помогает. опишешь проблему, перечитаешь что написал и заметишь что неверно обращался к массиву...
byte
addr[8]={0x28,0xFF,0x35,0x86,0x90,0x15,0x04,0x94};как это правильно записать и считать с eeproma?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). Выбирайте по вкусу.
Побайтно записать и побайтно же считать.
спсибо за помощь, голова думать не может. весь день сегодня на работе ковыряюсь...)
в отдельном скетче всё заработало. надо разбираться в основном.
сделал так.
запись:
#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(" "); } }