Помогите оптимизировать код и пару вопросов по 1-Ware..
- Войдите на сайт для отправки комментариев
Написал программу, которая выводит информацию с 2-х датчиков температуры DALLAS 18B20 на экран WINSTAR.
Все работает, как и должно быть, но я чувствую, что у меня в коде много лишнего..
Я не до конца понимаю, как происходит опрос адресов датчиков и их выбор..
И как сбрасывать показания на дисплее?
Вот код
#include <OneWire.h>
#include <LiquidCrystal.h>
OneWire ds(10);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop()
{
byte i;
byte present = 0;
byte data[12]; // массив для хранения информации с датчика
byte addr[8]; // массив для хранения адреса датчика (или датчиков?)
if ( !ds.search(addr)) { // слабо понимаю этот момент?
ds.reset_search();
return;
}
ds.reset();
ds.select(addr); // выбираем датчик
ds.write(0x44,1); // запускаем конвертацию
delay(1000); // даем время, чтобы датчик сконвертировал температуру (min 750ms)
present = ds.reset();
ds.select(addr); // выбираем датчик
ds.write(0xBE); // считываем ОЗУ датчика
for ( i = 0; i < 9; i++) { // записываем 9 байт полученных с ОЗУ датчика
data[i] = ds.read();
}
// высчитываем температуру
int TempMSB, TempMSB2, TH, TL;
float T, TReading, TempLSB;
TempLSB = data[0];
TempMSB = data[1];
TH = data[2];
TL = data[3];
TempMSB2 = TempMSB << 4 ;
if (TempMSB2 > 1000) {
TempMSB2 = TempMSB2 - 3968;
TReading = TempMSB2 + TempLSB/16 - 128;
} else {
TReading = (TempMSB << 4) + TempLSB/16;
}
lcd.setCursor(0, 0);
lcd.print("Temp1 ");
lcd.print(TReading);
lcd.print(" C ");
lcd.setCursor(0, 1);
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
TempLSB = data[0];
TempMSB = data[1];
TH = data[2];
TL = data[3];
TempMSB2 = TempMSB << 4 ;
if (TempMSB2 > 1000) {
TempMSB2 = TempMSB2 - 3968;
TReading = TempMSB2 + TempLSB/16 - 128;
} else {
TReading = (TempMSB << 4) + TempLSB/16;
}
lcd.print("Temp2 ");
lcd.print(TReading);
lcd.print(" C ");
}