LCD и датчик температуры DS1820
- Войдите на сайт для отправки комментариев
Сб, 07/01/2012 - 18:33
Привет всем. у меня такой вопрос как можно вывести температуру на экран LCD
Искал информаю есть много хлама однотипного а библиотек не могу найти для него может кто подсказать как сделать.
LCD стандарный 2х строчный текст на него уже выводил он работает а как можно запрограммировать так чтоб еще датчик было видно не понимаю, хотелось бы таких "DS1820" 4 шт. поставить.
так попробуй юургу.com/термометр-на-arduino/
форум ссылки портит , вместо юургу.com подставляет arduino.ru
так попробуй юургу.com/термометр-на-arduino/
форум ссылки портит , вместо юургу.com подставляет arduino.ru
нет такой страницы.
нет такой страницы.
Таки есть.
Заходил и вчера, и сегодня (за минутку до отправки этой реплики).
может у меня чточ то не так.с браузером если не сложно скинь на мыло bratim@mail.ru
Попробуйте отсюда зайти.
Зашел спасибо но выдаент ошибку при компиляции
Смотрел этот скетч, аналогичная проблема - код не проходит проверку.
Зашел спасибо но выдаент ошибку при компиляции
Смотрел этот скетч, аналогичная проблема - код не проходит проверку.
Лечится элементарно заменой нескольких символов (x в шестнадцатиричном представлении числа и двойные кавычки), побитых "интеллектуальной" CMS:
#include <OneWire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); OneWire ds(8); // датчик ds18b20 pin на 8 входе Ардуино byte i; byte present = 0; byte data[12]; byte addr[8]; int HighByte, LowByte, Whole, Fract, TReading, Tc_100, HighTemp ; void setup(void) { if ( !ds.search(addr)) { delay(1000); ds.reset_search(); return; } if ( OneWire::crc8( addr, 7) != addr[7]) { delay(1000); return; } } void getTemp() { ds.reset(); ds.select(addr); ds.write(0x44,1); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; HighTemp = data[2]; TReading = (HighByte << 8) + LowByte; Tc_100 = (6 * TReading) + TReading / 4; Whole = Tc_100 / 100; } void printTemp(void) { lcd.begin(16, 1); lcd.print("Temp. OUT: "); lcd.print(Whole); } void loop(void) { getTemp(); printTemp(); delay(2000); }ок проверю завтра ибо спалил моник по той схеме и своему тупизму модели разные оказались моников
Проверил но почемуто показывает одну и туже температуру причем не верную
Подскажите плис что нужно добавить в скетч, чтобы управлять реле для термостатирования?
Это следующий этап
Зашел спасибо но выдаент ошибку при компиляции
Смотрел этот скетч, аналогичная проблема - код не проходит проверку.
Лечится элементарно заменой нескольких символов (x в шестнадцатиричном представлении числа и двойные кавычки), побитых "интеллектуальной" CMS:
Ошибка почти вылечилась но у меня датчик DS1820 и он показывает тупо температуру 85С* и не меняется
как эту проблему решить
Дак ты же неправильно подключил датчик.
Дык вроде с ком портом все работало на другом коде тоесть с монитором на IDE
Оцените мой первый скетч, ну и что что он по кускам стянут с разных ресурсов...
#include <LiquidCrystal.h> #include <DallasTemperature.h> #include <OneWire.h> #include <WProgram.h> #include <Wire.h> #define temp 10 OneWire oneWire(temp); DallasTemperature sensors(&oneWire); float tempext = 0; float tempe = 1; int ledPin = 13; int t1, TempFormat; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { pinMode(ledPin, OUTPUT); sensors.begin(); lcd.begin(4, 16); lcd.clear(); } void termostat() { if (tempext < 23) { digitalWrite(ledPin, HIGH); } else if (tempext > 25) { digitalWrite(ledPin, LOW); } else { } } void loop() { sensors.requestTemperatures(); tempext=sensors.getTempCByIndex(0); tempe=sensors.getTempCByIndex(1); TempFormat=(int(tempe*10))/10; termostat(); lcd.setCursor(2, 0); lcd.print(tempext); lcd.setCursor(0, 0); lcd.print("1:"); lcd.setCursor(2, 1); lcd.print(TempFormat); lcd.setCursor(0, 1); lcd.print("2:"); }Что то я попробовал закомпилить и нифига не вышло. может что то стер пока редактировал копипас с форума
Вот скетч на 4 датчика
#include <LiquidCrystalRus.h> #include <OneWire.h> #include <EEPROM.h> byte i; byte n; byte m=0; byte t=0; float T[]={0,0,0,0}; float Tp[]={0,0,0,0}; float TD[]={0,0,0,0}; byte data[9]; byte TotalDS=0; byte addr[4][8] = { {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, }; OneWire ds(10); LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(2, 16); } void Menu() { lcd.clear(); lcd.print("1:"); lcd.print(T[0]); lcd.setCursor(8,0); lcd.print("2:"); lcd.print(T[1]); lcd.setCursor(0,1); lcd.print("3:"); lcd.print(T[2]); lcd.setCursor(8,1); lcd.print("4:"); lcd.print(T[3]); i = 0; n=0; while (i != 1 ) { if ( ds.search(addr[n]) != 1) { ds.reset_search(); i = 1; } else { n++; TotalDS = n; } } } void Gettemp() { ds.reset(); ds.write(0xCC,1); ds.write(0x44,1); for( n = 1; n < 90; n++) { delay(10); } for( n = 0; n < 4; n++) { ds.reset(); ds.select(addr[n]); ds.write(0xBE); for ( i = 0; i < 9; i++) {data[i] = ds.read();} Tp[n] = float((data[1] << 8) + data[0])/16; if (Tp[n] == 85) {} else {T[n]=Tp[n];} } byte write_DS() ;{ for (i=0; i<8; i++) { if (m==0) {EEPROM.write(128+t*8+i,0);} else {EEPROM.write(128+t*8+i,addr[m-1][i]);} } } byte read_DS(); { for (n=0; n<4; n++) { for (i=0; i<8; i++) { addr[n][i] = EEPROM.read(128+n*8+i); } } } } void loop() { Menu(); Gettemp(); }В скетче взятом из robocraft.ru/blog/arduino/136.html, а он из arduino.cc, что, впрочем не важно, температура показывается не менее , чем на полградуса выше чем в вашем скетче (~24.05).
Может быть, это потому, что я опрашиваю чаще, у вас delay(2000)?
Вот, перезалил и уже 23.62.
Может быть датчик при опросе греется?
Китайский покупной показывает 23.3
Блин, спиртовой лучше. Там температура зависит от силы зрения. :)
Немного исправил скетч
у меня датчик DS1820 и он показывает тупо температуру 85С* и не меняется
как эту проблему решить
Такая же беда - все перепробовал, и другой датчик ставил DS18B20 но все равно 85 градусов :(
85 градусов это не датчик дает , а его не правильное подключение .
стоит проверить провода
Что не так в этой схеме тогда?
либо на нее приходит плюс питания при трехпроводном подключении , либо она садится на общий если используется двухпроводное подключение с паразитным питанием
с третьей ноги дал на общий по 2х проводной схеме - результат тот же 85 градусов
www.milesburton.com/?title=Dallas_Temperature_Control_Library
проверь с этой библиотекой
а с начала подключи тремя проводами датчик .
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 7 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); int ledPin = 13; // select the pin for the LED int val = 0; // variable to store the value coming from the sensor void setup(void) { // start serial port Serial.begin(38400); // Start up the library sensors.begin(); pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus //Serial.print(" Requesting temperatures..."); //sensors.requestTemperatures(); // Send the command to get temperatures //Serial.println("DONE"); //Serial.print("Temperature for Device is: "); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" Celcius;");// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire delay (1000); }Так ей и пользуюсь
проверил скетч со своим датчиком подключеным на три провода , все работает .
такая вот фигня- имею дисплейчик VDO,16Т202ДА1Е, подключаю к АРДУИНО НАНО в3.
так вот, мало того что от индикатора никаких признаков жизни так и вообще ни один скетч не канает....
что может быть???
вариант с глюком монитора отпадавет, даже при отключеном все тоже самое...
может датчик я не так включил?
вот если смотреть на датчик как на рисунке bottom view - вид снизу
у меня сейчас так включено:
1 нога - земля
2 нога - общий
3 нога - на 2ую ногу
касательно этой цитаты - вот пример схемы http://robocraft.ru/blog/algorithm/208.html в ней как раз обозначено, что 3я нога в воздухе балтается...
касательно этой цитаты - вот пример схемы http://robocraft.ru/blog/algorithm/208.html в ней как раз обозначено, что 3я нога в воздухе балтается...
Ну, мало ли что понапишут robocraft'ы и mitos'ы. Смотреть надо в первоисточник (в простонародии - datasheet), стр. 6. А первоисточник - почувствуйте разницу - настоятельно рекомендует цеплять третью ногу за первую (GND: " VDD must be grounded for operation in parasite power mode" на стр. 2).
И, кстати: уж коль мы открыли первоисточник, то стоит также прислушаться к рекомендациям производителя относительно питания в этом варианте подключения и обеспечить дополнительный подвод энергии в линию. В даташите это изображено очень схематично, более подробный вариант pullup-MOSFET-питания выглядит так:
в чем плюсы 2 проводного способа подключения перед трехпроводным
Проводов требуется в полтора раза меньше.
можно ли считать, что при использовании различных схем подключения датчик все равно показывает 85 - что датчик умер?
можно ли считать, что при использовании различных схем подключения датчик все равно показывает 85 - что датчик умер?
Как данные-то читаете? Example-скетчем из раздела OneWire ("DS18x20_Temperature") или чем-то доморощенным? Если скетчем примера, то там информации поболе выводится - приведите весь блок.
А вообще-то, если от датчика еще какая-то информация идет, то его еще не совсем убили. Так что скорее нужно говорить не "датчик умер", а "программист не родился".
http://arduino.ru/forum/programmirovanie/lcd-i-datchik-temperatury-ds182...
в этом посте код скетча по датчику
ВОт нашел пример еще одного скетча
http://robocraft.ru/blog/arduino/136.html
по нему температуру показывает и реагирует на изменение температуры...что же тогда происходит не могу уловить :(
ищя разницу между моим скетчем и из примера по ссылке - прихожу к мнению что библиотека DallasTemperature криво работаетну или я к ней коряво обращаюсь
Ну теперь вы, по крайней мере, знаете, что датчик не умер.
А что вы так держитесь именно за неработающий вариант скетча? Какие возможности имеются в нем, которых нет в других вариантах?
Может быть проще будет работающий вариант под свои нужды адаптировать, а не пытаться неработающий скетч оживить?
да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение
попробовал сейчас запустить код из ранее не работающего скетча и что удивительно он показывает температуру, НО она равна последнему значению температуры из работающего ранее скетча....т.е. такое впечатление, что просто температуру считывает из памяти датчика
У меня так работает
#include <stdio.h> #include <string.h> #include <DS1302.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystalRus.h> LiquidCrystalRus lcd(13, 14, 15, 16, 17, 18, 19); // Data wire is plugged into port 6 on the Arduino #define ONE_WIRE_BUS 12 uint8_t CE_PIN = 6; uint8_t IO_PIN = 7; uint8_t SCLK_PIN = 8; // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN); int r=0; int g=0; int b=0; int Kt=40; float K=255/Kt; float tempC_Street = 0; // holds temp in C float tempC_Home = 0; // holds temp in C char buf[9]; byte grad[8] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000, }; void setup(void) { Serial.begin(9600); // Start up the library sensors.begin(); lcd.begin(2,20); // rows, columns. use 2,20 for a 2x20 LCD, etc. lcd.clear(); // start with a blank screen lcd.createChar(0, grad); lcd.write(0); rtc.write_protect(false); rtc.halt(false); } void loop() { sensors.requestTemperatures(); tempC_Street = sensors.getTempCByIndex(1); tempC_Home = sensors.getTempCByIndex(0); LCD(); RGB(); buf_time(); UART(); } void LCD() { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus lcd.clear(); lcd.setCursor(0,0); // set cursor to column 0, row 0 lcd.print(tempC_Street); lcd.write(0); lcd.print("C"); lcd.setCursor(9,0); // set cursor to column 0, row 0 lcd.print(tempC_Home); lcd.write(0); lcd.print("C"); lcd.setCursor(4,1); lcd.print(buf); /* // Debug lcd.setCursor(0,2); lcd.print("R="); lcd.print(r); lcd.setCursor(6,2); lcd.print("G="); lcd.print(g); lcd.setCursor(12,2); lcd.print("B="); lcd.print(b); */ } void RGB() { if(tempC_Street<0){ tempC_Street=tempC_Street*(-1); b=tempC_Street*K; g=(Kt-tempC_Street)*K; r=0; } else { r=tempC_Street*K; g=(Kt-tempC_Street)*K; b=0; } analogWrite(9,r); analogWrite(10,g); analogWrite(11,b); } void buf_time() { /* Get the current time and date from the chip */ Time t = rtc.time(); /* Format the time and date and insert into the temporary buffer */ snprintf(buf, sizeof(buf), "%02d:%02d:%02d", t.hr, t.min, t.sec); } void UART() { Serial.println("Temp:"); // Serial.println(sensors.getTempCByIndex(0)); Serial.println(tempC_Street); Serial.println(tempC_Home); Serial.println(buf); }да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение
....т.е. такое впечатление, что просто температуру считывает из памяти датчика
Но в неработающем-то, похоже, код недостаточен.
Ребят, начал собирать окончательный вариант своего устройства на ардуино совместимой плате, припаял провода от шлейфа к плате и непосредственно к экрану, и тут началась мистика. Иногда на экране мигает курсор, иногда темнеет весь экран, а бывает все в нулях, мои предположения: либо гдето неконтакт? либо гдето сгорело. отпаял провода, проверил блинком все выводы - все нормально, припаял все назад - не работает.
ага...
вот тоже прикольчик на днях....
както давненько был прикупил дисплейчик VFD, юзался он в составе девайсика подключеного к компу...
ну а тут решил его с ардуинкой подружить....
да вот незадачка получилась.... из-за шлейфа крякнул выходной каскад преобразователя для питания накала....
вот так вот может плохой контакт наделать головной боли... теперь лежит себе.... пытаюсь найти как починить.... вот только схем найти немогу...
завтра поеду за обычным лсд....
да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение
попробовал сейчас запустить код из ранее не работающего скетча и что удивительно он показывает температуру, НО она равна последнему значению температуры из работающего ранее скетча....т.е. такое впечатление, что просто температуру считывает из памяти датчика
Весьма похоже, что пропущен шаг "запуск преобразования", который перед "чтением температуры из датчика"
да все уже перепробовал
вот код скетча
В оригинале (в примере) есть мтрока:
Вот ее то Вам и не хватает!
включал - не помагает :(
Что-то я этой строки в Вашем скетче не наблюдаю. Вы ее внутри цикла перед чтением датчика, надеюсь, включали?
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 7 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); //Photocell int photocellPin = 2; // select the input pin for the photocell int ledPin = 13; // select the pin for the LED int val = 0; // variable to store the value coming from the sensor void setup(void) { // start serial port Serial.begin(38400); // Start up the library sensors.begin(); pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT } void loop(void) { //Photocell val = analogRead(photocellPin); // read the value from the sensor Serial.print(val); Serial.println(" Light;"); if(val<=600){ digitalWrite(ledPin, HIGH); } else{ digitalWrite(ledPin, LOW); } delay(1000); // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus //Serial.print(" Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures //Serial.println("DONE"); //Serial.print("Temperature for Device is: "); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" Celcius;");// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire delay (1000); }как же? вот же она строка 45
Вот таки с участием форумного и вселенского разума и чуткой остатков своего додумался таки после 45 строки выставить
delay (1000);
и теперь температура показывается верно с библиотекой DallasTemperature.h
Отлично. Значит просто паузы не хватало :)