1-wire запись в устройство

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Обьясните  пожалуйста (на примере лучше ; )

каким способом реализовать включение-выключение 1-wire  устройства.

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Что значит "включение-выключение 1-wire устройства" ???

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

На шину повесил  DS2413, вот это _http://pics.livejournal.com/smart_andy/pic/00011g34

назвал его DeviceAddress SW_1 = { 0x26, 0x2A, 0xCA, 0x9A, 0x03, 0x00, 0x00, 0xE6 };

Теперь сижу думаю как же его включать, тоесть записать 1 или 0 по этому адресу... я и в интернете ничего не нашел не могу правильно сформулировать запрос в поисковке...

Нашлось вот это Команды, специфичные для DS2413, их всего две:

0x5A — PIO Write. Управление ключами. После команды должен быть передан байт, в котором младшие два бита отвечают за состояние двух каналов. Например, 0x01 — включить первый канал, 0x02 — второй, 0x00 — все выключить. Затем нужно передать тот же байт, но в инвертированном виде (было 0x02 — стало 0xFE) для защиты от ошибок.
0xF5 — PIO Read. DS2413 может не только управлять выходными портами, но и считывать с них значения.

maksim
Offline
Зарегистрирован: 12.02.2012

Вот здесь есть готовая библа для работы с DS2413. А в гугле надо было набрать "ds2413 arduino" и самая первая ссылка на этот же сайт.

maksim
Offline
Зарегистрирован: 12.02.2012

И вот пример из этой библы: 

// This program blinks a known device.

#include <OneWire.h>
#include <DS2406.h>
OneWire ow(7);
OneWireSwitch osw(&ow,
                  // Specify the serial number of your DS2406 here.
                  (uint8_t[]){0x12, 0xE, 0xF9, 0x16, 0, 0, 0, 0xF6});

void setup(void)
{
}

void loop(void)
{
    // Turn on the switch.
    osw.setSwitchState(true);
    delay(1000);
    // Turn off the switch.
    osw.setSwitchState(false);
    delay(1000);
}

 

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Беда в том, что я сам неразберусь, но попробую.

Для меня проще было бы увидеть кусочек кода :)

 

maksim
Offline
Зарегистрирован: 12.02.2012

Уж куда проще??? Качаете БИБЛИОТЕКУ распаковываете архив в ...\arduino\libraries, запускаете arduino.exe и выбираете пример: File/Examples/dustin-arduino-2406-227b524/Hello, все.

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Все работает,

спасибо

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Работает, но немогу понять,  как сделать чтобы включался и выключался только 1 выход из двух в DS2406,

срабатывают оба два.

Вопрос снят, разобрался

 

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Работает, но заметил ошибку при if (currenttemp < minimum) срабатывает тютелька в тютельку :)

при if (currenttemp > maximum) срабатывает на 1 градус выше,

можно конечно сделать так if (currenttemp > maximum- 1) , но считаю это не правильно. Подскажите где ошибка

вот код:



  
  #include <OneWire.h>
  #include <DallasTemperature.h>
 
  #define ONE_WIRE_BUS 10
  OneWire ds(10);
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
//==================================

  DeviceAddress T_1 = { 0x28, 0x4B, 0xF2, 0x14, 0x04, 0x00, 0x00, 0x1E };  //DS18B20  
  DeviceAddress SW_1 = { 0x12, 0x63, 0xEA, 0x63, 0x00, 0x00, 0x00, 0x64 }; // DS2406  
  DeviceAddress IN_1 = { 0x26, 0xA4, 0x18, 0x54, 0x01, 0x00, 0x00, 0xDE }; // DS2438
  
  float Thermometer1;
  //=========  CLIMAT ===================
  int currenttemp; // change minimum and maximum temperature in degrees C
  int minimum = 25; 
  int maximum = 26;
  
  //////LED CONTROL///////
  int ledPin = 13;
/////////////////////////
  void setup(void)
  {
  Serial.begin(9600);
  Serial.println("Start");
  
  sensors.begin();    
  sensors.setResolution(T_1, 12);
  
  
  //////LED CONTROL///////
  pinMode(ledPin, OUTPUT); //set up pin 13 for a warning LED
 
  
  }
//////////////////////////////////////////////////////////////////////

  void loop(void)

  {
    
//////LED CONTROL///////
if (currenttemp < minimum) 
digitalWrite(ledPin, LOW ); // so that the warning LED light goes on
if (currenttemp > maximum) 
digitalWrite(ledPin, HIGH);
  
  
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  byte status[0];

  status[0]=7;
  
  sensors.requestTemperatures();
  
  currenttemp = sensors.getTempC(T_1);
  
  float Thermometer1 = sensors.getTempC(T_1);
 
  
//Serial.print("Thermometer1:");
Serial.println(Thermometer1);

///////////////////////////////////////////
  ds.reset();
  ds.select(SW_1);
  ds.write(0x55);
  ds.write(0x07);
  ds.write(0);  
  if (currenttemp < minimum)
  ds.write(0x20,0xFF); 
  if (currenttemp  > maximum)
  ds.write(0x40,0xFF);   
  for ( i = 0; i < 10; i++) {
   data[i] = ds.read();
  }
  

  delay(1000);

}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 А привидете пример конкретных цифр когда срабатывает правильно, а когда нет. Может вы "неправильного ожидаете".

При каком currenttemp у вас срабатывает "правильно", по вашему мнению, а при каком "неправильно" (типа "я думаю при XXX должно было сработать, но не сработало").

Zaliv
Offline
Зарегистрирован: 05.03.2011

 а просто >= не подойдет вместо > ? Или я не понял вопроса?

leshak
Offline
Зарегистрирован: 29.09.2011

 Вообщем сейчас, судя по коду должно на 24 - выкючать светик, на 27 - включать, на 25 и 26 - ничего не делать (если горит, то будет продолжать гореть, если выключен - будет продолжать быть выключенным).

И еще, раз вы объявили переменные int-тами, то у вас округляется температура путем отбрасывания дробной части.

То есть при движениях на 0.1 градуса вниз - условие будут срабатывать, а вверх - нет. температура 24.9, обработается как 24 и выключит светик, а вот вверх - уже нет. 26.1 будет восприниматся как 26 (ничего не делать), до тех пор пока не дойдет до 27.

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Дано

int minimum = 25;
int maximum = 26;

на 25 включается DS2406 PIO-A  срабатывает точно. вернее выключается так как например температура 23 градуса, температура растет, доходит до 25,05 канал выключился, далее растет температура

На 26  должен включаться PIO-B , но срабатывает на 27 градусах

и так же обратно, температура падает PIO-B выключается на 26,90

температура падает до 25 срабатывает PIO-A

не могу понять почему :(

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Я наверно опять чего-то не понял. У Вас

int maximum = 26;
........
........
if (currenttemp > maximum)

Так как оно должно сработать на 26? Вы же проверяете, что значение больше 26, а не больше или равно 26? Может все же >= оператор сравнения нужен. 

leshak
Offline
Зарегистрирован: 29.09.2011

 >На 26 должен включаться PIO-B , но срабатывает на 27 градусах

По коду - не должне. У вас же условие БОЛЬШЕ.  maximum = 26, при currenttemp=26, условие if(currenttemp>maximum) выолнится не может. 26 не больше 26, а равно ему. Так что если вы хотите сработки на 26, вам нужно больше ИЛИ РАВНО if(currenttemp>=maximum)

>на 25 включается DS2406 PIO-A срабатывает точно.

А вот это - уже чудо. как может выполнится условие 25<25 - не понятно. Скорее оно срабывается, все-таки где-то на 24.99

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Zaliv  спасибо   проверил помогло , работает как надо :)

>= оператор сравнения нужен.

 

Всем спасибки

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Или можно было бы пользоваться float- тоже бы работало около дела :)

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

AlexFisher

Если нетрудно покажите пример на моем коде.

Попробую ;)

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ничего особенного, просто

int currenttemp; // change minimum and maximum temperature in degrees C
int minimum = 25;
int maximum = 26;

меняете на

float currenttemp; // change minimum and maximum temperature in degrees C
float minimum = 25.0;
float maximum = 26.0;

 

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

AlexFisher

Спасибо, срабатывает как надо, даже не применяя   (>= сравнения)

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Что то, мне не нравиться в этом коде, хотя и работает

чувствую, что есть другое правильное решение :)

if (currenttemp > maximum)
{
  present = ds.reset();
  ds.select(SW_2); 
  ds.write(0x5A);
  ds.write(0xFE);	
  ds.write(1);  
  for ( i = 0; i < 10; i++)            
    data[i] = ds.read();   
  }
if (currenttemp < maximum)  
  {
  present = ds.reset();
  ds.select(SW_2); 
  ds.write(0x5A);
  ds.write(0xFF);	
  ds.write(0);
  Serial.print ("DS2413=");
  for ( i = 0; i < 10; i++)            
    data[i] = ds.read();
  Serial.print(data[i], HEX);
  Serial.print(" ");
  }