DS18S20 и LCD 16х2
- Войдите на сайт для отправки комментариев
Чт, 30/01/2014 - 20:30
доброе время суток) есть ардуино и термометры DS18S20 + LCD экран, датчики подключены последовательно, подскажите позжалуйста с кодом как вывести показания датчиков на LCD уже голову сломал ((
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void autoscroll(); byte zero[8] ={ B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000, }; #include <OneWire.h> OneWire ds(10); void setup(void) { lcd.begin(16, 2); lcd.createChar(1, zero); Serial.begin(9600); OneWire ds(8); } void loop(void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if ( !ds.search(addr)) { Serial.print("NO ADRES"); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for( i = 0; i < 8; i++) { Serial.write(' '); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; lcd.setCursor(0,0); lcd.print("AOUT="); lcd.print(celsius); lcd.print(" \1C, "); lcd.setCursor(0,1); lcd.print("Temp2 = "); lcd.print(celsius); lcd.print(" C, "); }
датчики должны подключаться параллельно, а не последовательно:
А что не так с кодом? Визуально все нормально, кроме строк 18 и 21 - должна быть одна из них.
Upd: есть подозрение, что у тебя код для DS18B20 (источник, пост 2).
в первом посте ошибся, да у меня действительно DS18B20,подключил по вашей схеме, а проблема в том что у меня только один датчик показывает на 2 строках LCD , не могу понять как сделать чтоб один датчик писал в первой строке а второй датчик на второй строке ну и т.д
Вот мой код, работает с двумя DS18B20:
Все проверки 1-Wire отсутствуют (мне были без надобности).
IDE ругается на 12 строчку
нужно подключить бибилиотеку DallasTemperature
спасибо те мил человек! все получилось, буду разбирать код для понимания
еще вопрс подключаю датчик по проводу длиной примерно 1 метр ! да экране температура показывает сначало норм тмп а потом на секунду показывает +85, контакты все проверил, скетч использую который выше !
Датчик подключен тремя или двумя проводами? Если двумя, то на большие расстояния можно не рассчитывать, максимум 30-40 см.
У меня трехпроводное подключение, вынесен на три метра, сбоев нет. Кто-то отписывался, что и на 150 м работает.
Ну или сам датчик дефектный. Резистор каким сопротивлением?
подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю
подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю
Провод возьми экранированный, например от USB провода.
Объясните, пожалуйста, как работает эта часть представленного выше кода?
выводит на ЖК и в Serial время и дату загрузки прошивки в МК. Я это использую для сравнения актуальности версий кода.
В C++ переменные, обрамленные двойным подчеркиванием, являются системными и глобальными, так почему их не использовать, раз все равно в памяти сидят? ;)
К слову, именно эти две переменные можно использовать для создания часов без применения внешних RTC (да, это костыли, но когда под рукой нет RTC, то сойдет).
подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю
Провод возьми экранированный, например от USB провода.
к сожалению большинство проводов usb не экранированы. нужен был экранированный. разрезал 2 кабеля. только 4 провода и все. китайцы блин
Экранированные обычно бывают в прозрачной изоляции - видно сеточку экрана.
Экранированные обычно бывают в прозрачной изоляции - видно сеточку экрана.
ага. дома только один такой прозрачный оказался. еще есть подозрение кабель от принтера тоже экранированный. но не факт
можно взять UTP кабель ("витая пара"), 6 незадействованных жил соединить вместе и на GND - за счет того, что они скручены, будет тот же экран.
Только там проводки одножильные, не переносят частых изгибов - ломаются.
подключал витой парой, в моем случае окозалось перебиты провода и коротили меж собой, после замены витушки на более не "китайскую" все стало работать хорошо, длина провода 4,5м
Объясните, пожалуйста, как работает эта часть представленного выше кода
Я иду ещё дальше...
Последняя строка - чтобы вспомнить, что за фигню я туда случайно прошил....
...... все стало работать хорошо, длина провода 4,5м........
http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#commen...
http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#commen...
Объясните, пожалуйста, как работает эта часть представленного выше кода
Я иду ещё дальше...
Последняя строка - чтобы вспомнить, что за фигню я туда случайно прошил....
Вы уж простите, но тоже не понятно что делает этот код)))
Попробовал такой простой примере , но в терминал выводитяся кракозяблины.
а зачем в loop() каждый раз объявлять Serial.begin(115200);, если оно уже объявлено в setup()?
P.S. на результат не повлияет, кракозябры останутся, но "не стоит кристалл мучать, ему еще придется первый закон робототехники объяснить..." :)
а зачем в loop() каждый раз объявлять Serial.begin(115200);, если оно уже объявлено в setup()?
P.S. на результат не повлияет, кракозябры останутся, но "не стоит кристалл мучать, ему еще придется первый закон робототехники объяснить..." :)
Это просто опечатка. В сетапе у меня инициализация.
В лишней инициализации и было дело. Теперь я поня назначение выше приведенного кусочка кода. Всем спасибо!!!
Уважаемый Tomasina ! При попытке загрузить Ваш скетч выскочили две ошибки. Что это может быть?
009 OneWire oneWire(ONE_WIRE_BUS);
а какие ошибки-то?
Сами библиотеки DallasTemperature и OneWire подключены?
Да, у меня же работает один датчик. И библиотеки подключены.
#include <OneWire.h>
выскакивают ошибки:
sketch_feb09b:9: error: 'OneWire' does not name a type
подключите библеотеки которые выше дал Tomasina а именно DallasTemperature и OneWire
у меня его скетч сразу заработал
А что, библиотеки разве не стандартны? Я об этом не знал.
нет, это бибилиотеки разработчиков протоколов OneWire и оборудования Dallas.
А вообще каждый лепит по-своему, из-за чего в инете встречаются библиотеки с одним названием, но разные версии, в результате не всегда работает, а скачаешь с другого сайта - работает.
После загрузки указанной библиотеки все пошло, но не библиотеку не удалось сразу импортировать из-за лишних символов в имени.