LCD и датчик температуры DS1820

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Привет всем. у меня такой вопрос как можно вывести температуру на экран LCD

Искал информаю есть много хлама однотипного а библиотек не могу найти для него может кто подсказать как сделать.

LCD  стандарный 2х строчный текст на него уже выводил он работает а как можно запрограммировать так чтоб еще датчик было видно не понимаю, хотелось бы таких "DS1820" 4 шт. поставить.

mitos
Offline
Зарегистрирован: 11.12.2011

 так попробуй  юургу.com/термометр-на-arduino/

форум ссылки портит , вместо юургу.com подставляет arduino.ru

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

mitos пишет:

 так попробуй  юургу.com/термометр-на-arduino/

форум ссылки портит , вместо юургу.com подставляет arduino.ru

 

нет такой страницы.

step962
Offline
Зарегистрирован: 23.05.2011

dronsoft пишет:

нет такой страницы.

Таки есть.

Заходил и вчера, и сегодня (за минутку до отправки этой реплики).

dronsoft
Offline
Зарегистрирован: 02.06.2011

 может у меня чточ то не так.с браузером если не сложно скинь на мыло bratim@mail.ru

step962
Offline
Зарегистрирован: 23.05.2011

 Попробуйте отсюда зайти.

dronsoft
Offline
Зарегистрирован: 02.06.2011

Зашел спасибо но выдаент ошибку при компиляции

dim
Offline
Зарегистрирован: 09.01.2012

Смотрел этот скетч, аналогичная проблема - код не проходит проверку. 

 

step962
Offline
Зарегистрирован: 23.05.2011

dronsoft пишет:

Зашел спасибо но выдаент ошибку при компиляции

dim пишет:

Смотрел этот скетч, аналогичная проблема - код не проходит проверку.

Лечится элементарно заменой нескольких символов (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);
}

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 ок проверю завтра ибо спалил моник по той схеме и своему тупизму модели разные оказались моников

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Проверил но почемуто показывает одну и туже температуру причем не верную

dim
Offline
Зарегистрирован: 09.01.2012

Подскажите плис что нужно добавить в скетч, чтобы управлять реле для термостатирования? 



 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Это следующий этап

dronsoft
Offline
Зарегистрирован: 02.06.2011

step962 пишет:

dronsoft пишет:

Зашел спасибо но выдаент ошибку при компиляции

dim пишет:

Смотрел этот скетч, аналогичная проблема - код не проходит проверку.

Лечится элементарно заменой нескольких символов (x в шестнадцатиричном представлении числа и двойные кавычки), побитых "интеллектуальной" CMS:

Ошибка почти вылечилась но у меня датчик DS1820  и он показывает тупо температуру 85С* и не меняется

как эту проблему решить

dim
Offline
Зарегистрирован: 09.01.2012

Дак ты же неправильно подключил датчик. 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Дык вроде с ком портом все работало на другом коде тоесть с монитором на IDE

dim
Offline
Зарегистрирован: 09.01.2012

 Оцените мой первый скетч, ну и что что он по кускам стянут с разных ресурсов...

 

#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:"); 
          
                  
    
 }

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Что то я попробовал закомпилить и нифига не вышло. может что то стер пока редактировал копипас с форума 

dim
Offline
Зарегистрирован: 09.01.2012

 Вот скетч на 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();
   
}

 

ajk
Offline
Зарегистрирован: 11.09.2011

 В скетче взятом из robocraft.ru/blog/arduino/136.html, а он из arduino.cc, что, впрочем не важно, температура показывается не менее , чем на полградуса выше чем в вашем скетче (~24.05).

Может быть, это потому, что я опрашиваю чаще, у вас delay(2000)?

Вот, перезалил и уже 23.62.

Может быть датчик при опросе греется?

Китайский покупной показывает 23.3

Блин, спиртовой лучше. Там температура зависит от силы зрения. :)

 

 

dim
Offline
Зарегистрирован: 09.01.2012

Немного исправил скетч 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

dronsoft пишет:

 у меня датчик DS1820  и он показывает тупо температуру 85С* и не меняется

как эту проблему решить

Такая же беда - все перепробовал, и другой датчик ставил DS18B20 но все равно 85 градусов :(

mitos
Offline
Зарегистрирован: 11.12.2011

 85 градусов это не датчик дает , а его не правильное подключение .

стоит проверить провода 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

Что не так в этой схеме тогда?

mitos
Offline
Зарегистрирован: 11.12.2011

третья нога не должна висеть в воздухе 

либо на нее приходит плюс питания при трехпроводном подключении , либо она садится на общий если используется двухпроводное подключение с паразитным питанием 

 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

с третьей ноги дал на общий по 2х проводной схеме - результат тот же 85 градусов

mitos
Offline
Зарегистрирован: 11.12.2011

www.milesburton.com/?title=Dallas_Temperature_Control_Library 

проверь с этой библиотекой 

а с начала подключи тремя проводами датчик .

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011
#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); 

}

Так ей и пользуюсь

mitos
Offline
Зарегистрирован: 11.12.2011

проверил скетч со своим датчиком подключеным на три провода , все работает .

chaytan
Offline
Зарегистрирован: 02.02.2012

такая вот фигня- имею дисплейчик VDO,16Т202ДА1Е, подключаю к АРДУИНО НАНО в3.

так вот, мало того что от индикатора никаких признаков жизни так и вообще ни один скетч не канает....

что может быть???

вариант с глюком монитора отпадавет, даже при отключеном все тоже самое... 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

может датчик я не так включил?

вот если смотреть на датчик как на рисунке bottom view - вид снизу

у меня сейчас так включено:

1 нога - земля

2 нога - общий

3 нога - на 2ую ногу

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

mitos пишет:
третья нога не должна висеть в воздухе либо на нее приходит плюс питания при трехпроводном подключении , либо она садится на общий если используется двухпроводное подключение с паразитным питанием 

касательно этой цитаты - вот пример схемы http://robocraft.ru/blog/algorithm/208.html в ней как раз обозначено, что  3я нога в воздухе балтается...

step962
Offline
Зарегистрирован: 23.05.2011

vworld пишет:

касательно этой цитаты - вот пример схемы 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-питания выглядит так:

 

dim
Offline
Зарегистрирован: 09.01.2012

в чем плюсы 2 проводного способа подключения перед трехпроводным

step962
Offline
Зарегистрирован: 23.05.2011

 Проводов требуется в полтора раза меньше.

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

можно ли считать, что при использовании различных схем подключения датчик все равно показывает 85 - что датчик умер?

step962
Offline
Зарегистрирован: 23.05.2011

vworld пишет:

можно ли считать, что при использовании различных схем подключения датчик все равно показывает 85 - что датчик умер?

Как данные-то читаете? Example-скетчем из раздела OneWire ("DS18x20_Temperature") или чем-то доморощенным? Если скетчем примера, то там информации поболе выводится - приведите весь блок.

А вообще-то, если от датчика еще какая-то информация идет, то его еще не совсем убили. Так что скорее нужно говорить не "датчик умер", а "программист не родился". 

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

http://arduino.ru/forum/programmirovanie/lcd-i-datchik-temperatury-ds182...

в этом посте код скетча по датчику

ВОт нашел пример еще одного скетча

http://robocraft.ru/blog/arduino/136.html

по нему температуру показывает и реагирует на изменение температуры...что же тогда происходит не могу уловить :(

ищя разницу между моим скетчем и из примера по ссылке - прихожу к мнению что библиотека DallasTemperature криво работаетну или я к ней коряво обращаюсь

 

step962
Offline
Зарегистрирован: 23.05.2011

 Ну теперь вы, по крайней мере, знаете, что датчик не умер.

А что вы так держитесь именно за неработающий вариант скетча? Какие возможности имеются в нем, которых нет в других вариантах?

Может быть проще будет работающий вариант под свои нужды адаптировать, а не пытаться неработающий скетч оживить?

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение

попробовал сейчас запустить код из ранее не работающего скетча и что удивительно он показывает температуру, НО она равна последнему значению температуры из работающего ранее скетча....т.е. такое впечатление, что просто температуру считывает из памяти датчика

serenya
Offline
Зарегистрирован: 17.02.2012

У меня так работает

#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);
}

 

step962
Offline
Зарегистрирован: 23.05.2011

vworld пишет:

да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение

....т.е. такое впечатление, что просто температуру считывает из памяти датчика

Но в неработающем-то, похоже, код недостаточен.

dim
Offline
Зарегистрирован: 09.01.2012

Ребят, начал собирать окончательный вариант своего устройства на ардуино совместимой плате, припаял провода от шлейфа к плате и непосредственно к экрану, и тут началась мистика. Иногда на экране мигает курсор, иногда темнеет весь экран, а бывает все в нулях, мои предположения: либо гдето неконтакт? либо гдето сгорело. отпаял провода, проверил блинком все выводы - все нормально, припаял все назад - не работает. 

chaytan
Offline
Зарегистрирован: 02.02.2012

 ага...

вот тоже прикольчик на днях....

както давненько был прикупил дисплейчик VFD, юзался он в составе девайсика подключеного к компу...

ну а тут решил его с ардуинкой подружить....

да вот незадачка получилась.... из-за шлейфа крякнул выходной каскад преобразователя для питания накала....

вот так вот может плохой контакт наделать головной боли... теперь лежит себе.... пытаюсь найти как починить.... вот только схем найти немогу...

завтра поеду за обычным лсд....

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

vworld пишет:

да просто в работающем скетче код избыточен...когда надо измерить температуру и вывести значение

попробовал сейчас запустить код из ранее не работающего скетча и что удивительно он показывает температуру, НО она равна последнему значению температуры из работающего ранее скетча....т.е. такое впечатление, что просто температуру считывает из памяти датчика

Весьма похоже, что пропущен шаг "запуск преобразования", который перед "чтением температуры из датчика"

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

да все уже перепробовал

вот код скетча

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

В оригинале (в примере) есть мтрока:

sensors.requestTemperatures(); // Send the command to get temperatures

Вот ее то Вам и не хватает!

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

включал - не помагает :(

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

Что-то я этой строки в Вашем скетче не наблюдаю. Вы ее внутри цикла перед чтением датчика, надеюсь, включали?

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011
#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

 

 

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

Отлично. Значит просто паузы не хватало :)