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 x0; int x1; int x2; int x3; int x4; int x5; int x6; int x7; x1 = EEPROM_read_byte(0); x1 = EEPROM_read_byte(1); x1 = EEPROM_read_byte(2); x1 = EEPROM_read_byte(3); x1 = EEPROM_read_byte(4); x1 = EEPROM_read_byte(5); x1 = EEPROM_read_byte(6); x1 = EEPROM_read_byte(7); int myStr0; int myStr1; int myStr2; int myStr3; int myStr4; int myStr5; int myStr6; int myStr7; //String ad1 = String (aad1,HEX); // x1 = EEPROM_read_byte(0)HEX; itoa(x0, myStr0, 16); // int -> HEX itoa(x1, myStr1, 16); // int -> HEX itoa(x2, myStr2, 16); // int -> HEX itoa(x3, myStr3, 16); // int -> HEX itoa(x4, myStr4, 16); // int -> HEX itoa(x5, myStr5, 16); // int -> HEX itoa(x6, myStr6, 16); // int -> HEX itoa(x7, myStr7, 16); // int -> HEX DeviceAddress sens2 = {myStr0,myStr1,myStr2,myStr3,myStr4,myStr5,myStr6,myStr7};Что то вы невнятное объясняете. Считали восемь ячеек, загрузили в двумерный массив, считали следующие загрузили.....
проблема с приоброзованием 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 я так это кусок кода
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; }byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];
при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его
У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?
byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];
при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его
это вопрос ребята
У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?
Какой смысл переписывать адреса программе ? если Т1 –это одно помещение, а Т2 другое.
Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.
Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.
Я хочу разобраться с одним датчиком, потом епром я запишу на байт 8,9,10,и.тд
В нульвом байте храниться нульевой байт адреса 1 сенсора
Ребята всем спасибо проблема решена подачей 8 правильных байт
как вы не поймете я хочу адреса датчиков прописывать через код вот моя попытка сложно просто сказать что я не так делаю
Дербиш, чтобы Вас понять, сначала нужно расставить в Ваших сообщениях знаки препинания. И, вообще-то, это работа Ваша, а не читателя.
И проблема именно в этом: когда человек не заботится о том, чтобы писать грамотно, его никто не понимает - ни компилятор, ни другие люди.
Хотите, чтобы Ваши программы работали - научитесь писать грамотно. На всех языках, которыми пользуетесь.