DS 18x20 oneWire

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

Здравствуйте!  Я новичок  у меня возникли трудности при написании кода

Работы с датчиком  температуру и вывод в сериал у меня получается и опрашивать несколько датчиков по отдельности  в общем проблема в том что нужно запоминать датчики т.е при подключении к линии датчика ардуино его запомнил и прописал  допустим как Т1 при подключении  следующих запомнил как Т2,Т3 ,Т4 и далее  это тоже не сложно но проблема в том что при отключении допустим Т2 все адреса сдвигаются т.е Т2 не держит за собой адрес датчика

Помогите пожалуйста сам не могу ни как догадаться как это сделать буду благодарен любой информации, или подсказке. 

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

А что Вы уже написали?

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

писал много и по разному но пока остоновился так

думаю то нужно  через код найти адрес датика и прописать его в сенсор2 нужно чтобы это делалось автоматиеский с сенсор3 и так далее

 


#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

OneWire oneWire(9); // вход датчиков 18b20
DallasTemperature ds(&oneWire);


DeviceAddress sensor1 = {0x10, 0x91, 0x15, 0xAF, 0x02, 0x08, 0x00, 0xD9};
  DeviceAddress sensor2 = {};


void setup() {
  Serial.begin(9600);
  ds.begin();
  lcd.begin(16, 2);
  lcd.clear(); 
}
 

void loop() {




  
  ds.requestTemperatures(); // считываем температуру с датчиков
  
    lcd.setCursor(0, 0);  
    lcd.print("Sensor 1: ");
  lcd.print(ds.getTempC(sensor1)); // отправляем температуру
    lcd.print("C");
  lcd.setCursor(0, 1);  
    lcd.print("Sensor 2: ");
    lcd.print(ds.getTempC(sensor2));

}

 

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

Ну, Вы же сказали, что можете несколько датчиков опрашивать. ну так покажите это. Я хочу видеть в чём у Вас проблема. а Вы мне что-то совсем другое подсовываете.

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

с этим кодом я пробывал несколько датиков но индекс свигаеться 

 
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
 
#include <SoftwareSerial.h> 
#include <OneWire.h> 
#include <DallasTemperature.h> 
OneWire oneWire(9);// пин 1 wire 
DallasTemperature ds(&oneWire); 
byte DSKI ;//Кол-во DS1820 
int i=0;
float temp=ds.getTempCByIndex(i);




void setup(){ 
  lcd.begin(16,2);
  
Serial.begin(9600); 

ds.begin();//поиск DS 
DSKI=ds.getDeviceCount();// кол-во найденых ds 
Serial.print("DAT4IKI KOL-BO  "); 
Serial.print(DSKI); 
 
 



} 
void loop () { 
ds.requestTemperatures();// считываем температуру 

for (int i =0; i < DSKI; i++){ // крутим цикл опроса 
Serial.print("Sensor"); 
Serial.print(i);// индекс ds 
Serial.print(": "); 
Serial.print(ds.getTempCByIndex(i));// отправляем температуру в порт 
Serial.println("C"); 
} 
Serial.println(); 

ds.requestTemperatures();
    
for (int i =0; i < DSKI; i++){
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
lcd.print("Sensor");
lcd.setCursor(7, 0);
lcd.print(i);
lcd.setCursor(11, 0);
lcd.print(ds.getTempCByIndex(i));
delay(1000);

}
}

 

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

Ну, Вы используете индекс в качестве уникального идентификатора датчика, потому они у Вас и сбиваются.

Используйте адрес. У датчика запрашиваете адрес и все "знакомые" адреса храните. Тогда Вы всегда сможете узнавать что какой-то отвалисля или какой-то новый появился.

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

вот в этом и проблема как правельно запросить адрес как хронить я и говорю то я новенький 

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

в каком типе данных их хронить?

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Да не мучайте Вы парня. 

Каждый датчик имеет свой код.  опроси каждый датчик и запиши их коды, потом используй. 

https://www.youtube.com/watch?v=eQAMgzAHUNM&t=9s

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

нет я хочу чтоб происходило это автоматом и не сбивалось 

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

derbish пишет:

нет я хочу чтоб происходило это автоматом и не сбивалось 

Ну интересно, тогда послежу за темой.. 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

у библиотеки OneWire есть пример опроса всех датчиков на шине с выводом для каждого датчика его уникального кода и температуры

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

как я понял нужно обядинить два этих кода

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

OneWire oneWire(15); // вход датчиков 18b20
DallasTemperature ds(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12};
DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};

void setup() {
//  Serial.begin(9600);
  ds.begin();
  lcd.begin(16, 2);
  lcd.clear(); 
}

void loop() {
  ds.requestTemperatures(); // считываем температуру с датчиков
    
    lcd.setCursor(0, 0);  
    lcd.print("Sensor 1: ");
    lcd.print(ds.getTempC(sensor1)); // отправляем температуру
    lcd.print("C");
    lcd.setCursor(0, 1);  
    lcd.print("Sensor 2: ");
    lcd.print(ds.getTempC(sensor2));
    lcd.print("C");

}
-=================================================
---------------------------------------------------------------------------------------------

#include <OneWire.h>

void setup()
{
  Serial.begin(115200);
  Serial.println("//\n// Start oneWireSearch.ino \n//");

  for (uint8_t pin = 2; pin < 13; pin++)
  {
    findDevices(pin);
  }
  Serial.println("\n//\n// End oneWireSearch.ino \n//");
}

void loop()
{
}

uint8_t findDevices(int pin)
{
  OneWire ow(pin);

  uint8_t address[8];
  uint8_t count = 0;


  if (ow.search(address))
  {
    Serial.print("\nuint8_t pin");
    Serial.print(pin, 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");
        Serial.print(address[i], HEX);
        if (i < 7) Serial.print(", ");
      }
      Serial.println("  },");
    } while (ow.search(address));

    Serial.println("};");
    Serial.print("// nr devices found: ");
    Serial.println(count);
  }

  return count;
}

 

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

результат

 

 
 
//
// Start oneWireSearch.ino 
//
 
uint8_t pin9[][8] = {
  {
0x10, 0x12, 0xDC, 0xAC, 0x02, 0x08, 0x00, 0x33  },
  {
0x10, 0xD6, 0x5C, 0xBA, 0x02, 0x08, 0x00, 0x8A  },
  {
0x10, 0x91, 0x15, 0xAF, 0x02, 0x08, 0x00, 0xD9  },
  {
0x26, 0x13, 0x34, 0x71, 0x01, 0x00, 0x00, 0x74  },
};
// nr devices found: 4
 
//
// End oneWireSearch.ino 
//
 
 
теперь вопрос как эти адреса хронить в EEPROM