#include <OneWire.h>
// температурный i/o чип DS18S20:
OneWire ds(10); // на 10-ом контакте
void setup(void) {
// инициализируем входы/выходы;
// запускаем последовательный порт:
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
ds.reset_search();
if ( !ds.search(addr)) {
Serial.print("No more addresses.\n"); // "Адресов больше нет.\n")
ds.reset_search();
return;
}
Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n"); // "CRC не корректен!\n")
return;
}
if ( addr[0] == 0x10) {
Serial.print("Device is a DS18S20 family device.\n"); // "Устройство принадлежит семейству DS18S20.\n")
}
else if ( addr[0] == 0x28) {
Serial.print("Device is a DS18B20 family device.\n"); // "Устройство принадлежит семейству DS18B20.\n")
}
else {
Serial.print("Device family is not recognized: 0x"); // "Семейство устройства не распознано.\n")
Serial.println(addr[0],HEX);
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // запускаем конверсию и включаем паразитное питание
delay(1000); // 750 миллисекунд может хватить, а может и нет
// здесь можно использовать ds.depower(), но об этом позаботится сброс
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // считываем scratchpad-память
Serial.print("P=");
Serial.print(present,HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // нам нужно 9 байтов
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print( OneWire::crc8( data, 8), HEX);
Serial.println();
}
/*Фрагмент кода для DS1820 с разрешением 0,5 градуса
Пример выше работает только с B-типом DS1820. Пример ниже демонстрирует, как работать с более низким разрешением DS1820 и множеством других сенсоров, выводящих значения на LCD.
Пример работает с 9-ым контактом Arduino, но для удобства можно воспользоваться каким-то другим. Учтите, впрочем, что 1-ый и 3-ий контакты DS1820 должны быть подключены к «земле». В этом примере резистор на 5 кОм подключен ко 2-ому контакту DS1820 и Vcc (+5V). О том, как подключить LCD к Arduino,
читайте документацию к библиотеке LiquidCrystal.
/*
#include <OneWire.h>
#include <LiquidCrystal.h>
// LCD=======================================================
// инициализируем библиотеку при помощи номеров контактов, формирующих собой интерфейс:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define LCD_WIDTH 20
#define LCD_HEIGHT 2
температурный i/o интерфейс DS18S20 */
/*OneWire ds(9); // на 9-ом контакте
#define MAX_DS1820_SENSORS 2
byte addr[MAX_DS1820_SENSORS][8];
void setup(void)
{
lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
lcd.setCursor(0,0);
lcd.print("DS1820 Test"); // "Тест DS1820"
if (!ds.search(addr[0]))
{
lcd.setCursor(0,0);
lcd.print("No more addresses."); // "Адресов больше нет."
ds.reset_search();
delay(250);
return;
}
if ( !ds.search(addr[1]))
{
lcd.setCursor(0,0);
lcd.print("No more addresses."); // "Адресов больше нет."
ds.reset_search();
delay(250);
return;
}
}
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char buf[20];
void loop(void)
{
byte i, sensor;
byte present = 0;
byte data[12];
for (sensor=0;sensor<MAX_DS1820_SENSORS;sensor++)
{
if ( OneWire::crc8( addr[sensor], 7) != addr[sensor][7])
{
lcd.setCursor(0,0);
lcd.print("CRC is not valid"); // "CRC не корректен"
return;
}
if ( addr[sensor][0] != 0x10)
{
lcd.setCursor(0,0);
lcd.print("Device is not a DS18S20 family device."); // "Устройство не принадлежит семейству DS18S20."
return;
}
ds.reset();
ds.select(addr[sensor]);
ds.write(0x44,1); // запускаем конверсию и включаем паразитное питание
delay(1000); // 750 миллисекунд может хватить, а может и нет
// здесь можно использовать ds.depower(),
// но об этом позаботится сброс
present = ds.reset();
ds.select(addr[sensor]);
ds.write(0xBE); // считываем scratchpad-память
for ( i = 0; i < 9; i++)
{ // нам нужно 9 байтов
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // проверяем значение в самом старшем бите
if (SignBit) // если число отрицательное
{
TReading = (TReading ^ 0xffff) + 1;
}
Tc_100 = (TReading*100/2);
Whole = Tc_100 / 100; // отделяем друг от друга целую и дробную порции
Fract = Tc_100 % 100;
sprintf(buf, "%d:%c%d.%d\337C ",sensor,SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract);
lcd.setCursor(0,sensor%LCD_HEIGHT);
lcd.print(buf);
}
}
*/