ROM адрес

derbish
Offline
Зарегистрирован: 16.02.2017

Стоит задача, нужно задать адреса для 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;
}


}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

derbish пишет:

Если вместо 0xaad1 писать правильно адрес датчика то код проходит  и температура считывается

Так и пишите правильно. Что мешает-то?

bwn
Offline
Зарегистрирован: 25.08.2014

Все DS18B20 начинаются с 0х28, зачем какую то отсебятину рисовать?

derbish
Offline
Зарегистрирован: 16.02.2017

если писать правильно, то все ок проходит, смысл в том что я хочу хронить адреса и прописывать их не в ручную

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

Все DS18B20 начинаются с 0х28, зачем какую то отсебятину рисовать?

это понятно смысл в другом

bwn
Offline
Зарегистрирован: 25.08.2014

И что вам мешает? Первые девять ячеек - первый+принадлежность и т.д.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

derbish пишет:

если писать правильно, то все ок проходит, смысл в том что я хочу хронить адреса и прописывать их не в ручную

Так храните и прописывайте, в чём проблема-то? Вы можете толком объяснить?

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

И что вам мешает? Первые девять ячеек - первый+принадлежность и т.д.

я просто хочу подставить адрес получаный мной который хрониться в EEPROM в эти ячейки адреса 

bwn
Offline
Зарегистрирован: 25.08.2014

Что то вы невнятное объясняете. Считали восемь ячеек, загрузили в двумерный массив, считали следующие загрузили.....

derbish
Offline
Зарегистрирован: 16.02.2017

тепрь код такой здесь более ясней

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};

 

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

Что то вы невнятное объясняете. Считали восемь ячеек, загрузили в двумерный массив, считали следующие загрузили.....

проблема с приоброзованием  INT в НЕХ

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, так действительно "более ясней".

derbish пишет:

проблема с приоброзованием  INT в НЕХ

Нет, проблема гораздо глубже :)

-----------------------

bwn, предоставляю это Вам, сам же пойду за попкорном и покурю по дороге :)))))

bwn
Offline
Зарегистрирован: 25.08.2014

А у вас в восемь бит int помещается?

derbish
Offline
Зарегистрирован: 16.02.2017

ЕвгенийП пишет:

Да, так действительно "более ясней".

derbish пишет:

проблема с приоброзованием  INT в НЕХ

Нет, проблема гораздо глубже :)

-----------------------

bwn, предоставляю это Вам, сам же пойду за попкорном и покурю по дороге :)))))

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

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

А у вас в восемь бит int помещается?

через сериал я код датчека 0х10 вижу как  просто как 10

bwn
Offline
Зарегистрирован: 25.08.2014

Откуда в байте взялся int? В одну ячейку EEPROM, int никак невпихуется. А МК похрену в какой системе счисления вы пропишете, просто отдайте ему восемь правильных байт.

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

Откуда в байте взялся int? В одну ячейку EEPROM, int никак невпихуется. А МК похрену в какой системе счисления вы пропишете, просто отдайте ему восемь правильных байт.

как????

bwn
Offline
Зарегистрирован: 25.08.2014

byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];

derbish
Offline
Зарегистрирован: 16.02.2017

derbish]</p> <p>[quote=bwn пишет:

Откуда в байте взялся 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;
}

 

 

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];

при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его 

bwn
Offline
Зарегистрирован: 25.08.2014

У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?

derbish
Offline
Зарегистрирован: 16.02.2017

derbish пишет:

bwn пишет:

byte addr[10][8]; и заполняйте по 8 байт десять датчиков. Вызов addr[i];

при этом у меня сохронятся номер датчека за адресом после перезагрузки если допустим на щине нет его 

это вопрос ребята

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

У вас датчики сами мигрируют? В таком случае прога должна либо переписать все адреса по новой, либо отказаться работать. А самое интересное, как с таким подходом вы собираетесь определять, где какой датчик стоит?

Какой смысл переписывать адреса программе ? если Т1 –это одно помещение,  а Т2 другое.  

bwn
Offline
Зарегистрирован: 25.08.2014

Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.

derbish
Offline
Зарегистрирован: 16.02.2017

bwn пишет:

Откуда программа записав в епром адреса знает, к какому помещению они относятся? Она их по возрастанию сортирует и все.

Я хочу разобраться с одним датчиком, потом епром я запишу на байт 8,9,10,и.тд  

derbish
Offline
Зарегистрирован: 16.02.2017

В нульвом байте храниться нульевой байт адреса 1 сенсора

derbish
Offline
Зарегистрирован: 16.02.2017

Ребята всем спасибо проблема решена подачей  8 правильных байт  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

derbish пишет:

 

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

Дербиш, чтобы Вас понять, сначала нужно расставить в Ваших сообщениях знаки препинания. И, вообще-то, это работа Ваша, а не читателя.

И проблема именно в этом: когда человек не заботится о том, чтобы писать грамотно, его никто не понимает - ни компилятор, ни другие люди.

Хотите, чтобы Ваши программы работали - научитесь писать грамотно. На всех языках, которыми пользуетесь.