ROM адрес
- Войдите на сайт для отправки комментариев
Вс, 19/02/2017 - 14:45
Стоит задача, нужно задать адреса для ds18s20 считываю ROM коды и сохраняю их в EEPROM
Потом считываю их от туда переобразовываю их в НЕХ и прописываю их в
DeviceAddress sens2 = {0xaad1, 0x91, 0x15, 0xAF, 0x02, 0x08, 0x00, 0xD9};
Если вместо 0xaad1 писать правильно адрес датчика то код проходит и температура считывается
Пробовал по разному но что то видимо делаю не так помогите пожалуйста
#include <EEPROM2.h> #include <LiquidCrystal.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //ДЛЯ ЗНАКА С #include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(9);// вход датчиков 18b20 DallasTemperature ds(&oneWire); #include <Arduino.h> #include <OneWire.h> #include <DS2438.h> byte aad1; String ad1 = String (aad1,HEX); DeviceAddress sens1 = {}; DeviceAddress sens2 = {}; DeviceAddress sens3 = {}; float Sensor1; float Sensor2; float Sensor3; float Sensor4; const uint8_t ONE_WIRE_PIN = 9; uint8_t DS2438_address[] = { 0x26, 0x13, 0x34, 0x71, 0x01, 0x00, 0x00, 0x74 }; OneWire ow(ONE_WIRE_PIN); DS2438 ds2438(&ow, DS2438_address); int humidity; float temperature; float heatindex; float dewpoint; int val = 0; int m=1; int kp=0; int ob=0; int i; int poick=0; void setup(void) { ds.requestTemperatures(); // считываем температуру с датчиков Sensor1=ds.getTempC(sens1); Sensor2=ds.getTempC(sens2); Sensor3=ds.getTempC(sens3); Serial.begin(9600); ds.begin(); ds2438.begin(); lcd.begin(16, 2); lcd.clear(); } void loop() { byte ad1; byte aad1; ad1= EEPROM_read_byte(0); String (ad1) = String (aad1,HEX); DeviceAddress sens1 = {aad1, 0x12, 0xDC, 0xAC, 0x02, 0x08, 0x00, 0x33}; DeviceAddress sens2 = {0xaad1, 0x91, 0x15, 0xAF, 0x02, 0x08, 0x00, 0xD9}; DeviceAddress sens3 = {0xaad, 0xD6, 0x5C, 0xBA, 0x02, 0x08, 0x00, 0x8A}; if (i==100&&kp==0){ ds2438.update(); if (ds2438.isError() || ds2438.getVoltage(DS2438_CHA) == 0.0) { Serial.println("Error reading from DS2438 device"); } else { temperature = ds2438.getTemperature(); heatindex = temperature; float rh = (ds2438.getVoltage(DS2438_CHA) / ds2438.getVoltage(DS2438_CHB) - 0.16) / 0.0062; humidity = (float)(rh / (1.0546 - 0.00216 * temperature)); if (humidity < 0.0) { humidity = 0.0; } else if (humidity > 100.0) { humidity = 100.0; } float tempK = temperature + 273.15; dewpoint = tempK / ((-0.0001846 * log(humidity / 100.0) * tempK) + 1.0) - 273.15; if (temperature >= 26.7 && humidity >= 40.0) { float t = temperature * 9.0 / 5.0 + 32.0; // heat index formula assumes degF rh = humidity; float heatindexF = -42.38 + 2.049 * t + 10.14 * rh + -0.2248 * t * rh + -0.006838 * t * t + -0.05482 * rh * rh + 0.001228 * t * t * rh + 0.0008528 * t * rh * rh + -0.00000199 * t * t * rh * rh; heatindex = (heatindexF - 32.0) * 5.0 / 9.0; } if (heatindex < temperature) heatindex = temperature; }} if (i==50||i==98||i==150||i==198||i==198||i==250||i==298){lcd.clear();} if (i==300){ ds.requestTemperatures(); // считываем температуру с датчиков Sensor1=ds.getTempC(sens1); Sensor2=ds.getTempC(sens2); Sensor3=ds.getTempC(sens3); } i++;if (i>300){i=0;} val = analogRead(A0) ; //КНОПКИ if (val>1020){kp=0;} if (val>900&&val<905){kp=2;} if (val>872&&val<876){kp=1;} if (val>831&&val<836){kp=3;} if (val==0&&val<10){kp=4;} if (val>908&&val<912){kp=5;} if (m>4){m=1;}if (m<1){m=4;} if (kp==1){delay(20); ob=1; } if (kp==0&&ob==1){ob=0; m++;} // if (kp==3){delay(20); ob=1; if (kp==0&&ob==1){ob=0; m--;} } if (m==1) { lcd.setCursor(0, 0); lcd.print("m 1"); lcd.setCursor(5, 1); lcd.print(Sensor2); lcd.setCursor(8, 1); } if (m==2) { lcd.setCursor(0, 0); lcd.print(EEPROM_read_byte(0),HEX ); lcd.print(EEPROM_read_byte(1), HEX); lcd.print(EEPROM_read_byte(2), HEX); lcd.print(EEPROM_read_byte(3), HEX); lcd.print(EEPROM_read_byte(4), HEX); lcd.print(EEPROM_read_byte(5), HEX); lcd.print(EEPROM_read_byte(6), HEX); lcd.print(EEPROM_read_byte(7), HEX); lcd.setCursor(0, 1); lcd.print(aad1); lcd.setCursor(5, 1); lcd.print(ad1); } if (m==3) { lcd.setCursor(0, 0); lcd.print("m 3"); lcd.setCursor(5, 1); lcd.print(Sensor3); lcd.setCursor(0, 1); lcd.print(i); lcd.setCursor(6, 0); lcd.print(val); lcd.setCursor(13, 0); lcd.print(kp); } if (m==4) { lcd.setCursor(0, 0); lcd.print("m 4"); lcd.setCursor(0, 1); lcd.print(humidity); lcd.setCursor(6, 1); lcd.print(temperature); lcd.setCursor(3, 1); lcd.print("%"); } Serial.println(val); if (poick==1) { OneWire ow(9); uint8_t address[8]; uint8_t count = 0; if (ow.search(address)) { Serial.print("\nuint8_t pin"); Serial.print(9, DEC); Serial.println("[][8] = {"); do { count++; Serial.println(" {"); for (uint8_t i = 0; i < 8; i++) { Serial.print("0x"); if (address[i] < 0x10) Serial.print("0"); EEPROM_write_byte(i, address[i]),HEX; Serial.print ( EEPROM_read_byte(i), HEX); if (i < 7) Serial.print(", "); } Serial.println(" },"); } while (ow.search(address)); Serial.println("};"); Serial.println(count); } return count; } }
Если вместо 0xaad1 писать правильно адрес датчика то код проходит и температура считывается
Так и пишите правильно. Что мешает-то?
Все DS18B20 начинаются с 0х28, зачем какую то отсебятину рисовать?
если писать правильно, то все ок проходит, смысл в том что я хочу хронить адреса и прописывать их не в ручную
Все DS18B20 начинаются с 0х28, зачем какую то отсебятину рисовать?
это понятно смысл в другом
И что вам мешает? Первые девять ячеек - первый+принадлежность и т.д.
если писать правильно, то все ок проходит, смысл в том что я хочу хронить адреса и прописывать их не в ручную
Так храните и прописывайте, в чём проблема-то? Вы можете толком объяснить?
И что вам мешает? Первые девять ячеек - первый+принадлежность и т.д.
я просто хочу подставить адрес получаный мной который хрониться в EEPROM в эти ячейки адреса
Что то вы невнятное объясняете. Считали восемь ячеек, загрузили в двумерный массив, считали следующие загрузили.....
тепрь код такой здесь более ясней
Что то вы невнятное объясняете. Считали восемь ячеек, загрузили в двумерный массив, считали следующие загрузили.....
проблема с приоброзованием INT в НЕХ
Да, так действительно "более ясней".
проблема с приоброзованием INT в НЕХ
Нет, проблема гораздо глубже :)
-----------------------
bwn, предоставляю это Вам, сам же пойду за попкорном и покурю по дороге :)))))
А у вас в восемь бит int помещается?
Да, так действительно "более ясней".
проблема с приоброзованием INT в НЕХ
Нет, проблема гораздо глубже :)
-----------------------
bwn, предоставляю это Вам, сам же пойду за попкорном и покурю по дороге :)))))
как вы не поймете я хочу адреса датчиков прописывать через код вот моя попытка сложно просто сказать что я не так делаю
А у вас в восемь бит int помещается?
через сериал я код датчека 0х10 вижу как просто как 10
Откуда в байте взялся int? В одну ячейку EEPROM, int никак невпихуется. А МК похрену в какой системе счисления вы пропишете, просто отдайте ему восемь правильных байт.
Откуда в байте взялся int? В одну ячейку EEPROM, int никак невпихуется. А МК похрену в какой системе счисления вы пропишете, просто отдайте ему восемь правильных байт.
как????
byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];
Откуда в байте взялся int? В одну ячейку EEPROM, int никак невпихуется. А МК похрену в какой системе счисления вы пропишете, просто отдайте ему восемь правильных байт.
чтобы дать нужно откудато вять правельно считал и записал в EEPROM я так это кусок кода
byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];
при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его
У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?
byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];
при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его
это вопрос ребята
У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?
Какой смысл переписывать адреса программе ? если Т1 –это одно помещение, а Т2 другое.
Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.
Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.
Я хочу разобраться с одним датчиком, потом епром я запишу на байт 8,9,10,и.тд
В нульвом байте храниться нульевой байт адреса 1 сенсора
Ребята всем спасибо проблема решена подачей 8 правильных байт
как вы не поймете я хочу адреса датчиков прописывать через код вот моя попытка сложно просто сказать что я не так делаю
Дербиш, чтобы Вас понять, сначала нужно расставить в Ваших сообщениях знаки препинания. И, вообще-то, это работа Ваша, а не читателя.
И проблема именно в этом: когда человек не заботится о том, чтобы писать грамотно, его никто не понимает - ни компилятор, ни другие люди.
Хотите, чтобы Ваши программы работали - научитесь писать грамотно. На всех языках, которыми пользуетесь.