собрать термометр на DS18B20 и MT-16S2H

kriss
Offline
Зарегистрирован: 24.01.2014

 У меня работают датчики   DS1820 и  индикатор MT016S2H  с ардуино мега. Хочу сделать цифровой термометр.  В программировании пока  новичок, перелистал форум , но не нашел подобного примера.

Прошу дать ссылку.

kriss
Offline
Зарегистрирован: 24.01.2014

Уточняю. Отдельно работают с мега и датчик и табло.

Life23
Offline
Зарегистрирован: 10.08.2013

Вот таблица совместимости:

http://www.gaw.ru/html.cgi/txt/lcd/lcm/melt/cros.htm

Судя по ней, можно использовать обычную библиотеку LiquidCrystal.h (или I2C).

А вообще, мне кажеться, что Вы ничего так и не искали.. 

P.S.Не понятно почему вы тему создали в разделе "Проекты"..

kriss
Offline
Зарегистрирован: 24.01.2014

Вы меня наверно не поняли. Я нашел скетч,он компилируется, но вывода информации на табло нет. Отдельно табло и датчик работают.  Я предполагаю, что есть ошибка.  Если можете - пожалуйста подскажите.  Вот скетч:

   #include <OneWire.h>

  #include <LiquidCrystal.h>

  LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //у моего табло выводы 13, 12, 11, 10, 5, 4 -это здесь важно?
  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);
  }
ustas
Offline
Зарегистрирован: 12.03.2012

"Temp. OUT: " - на дисплей выводится? (строку инициализации дисплея нужно давать именно ту, с которой работает ;))

в сериал значения температуры (Whole) выводятся нормально? 

если на оба вопроса - "да", копать в сторону преобразования типов данных (lcd.print хочет строку в качестве параметра, а вы ему int скормить пытаетесь). 

Кстати, в вашем скетче отрицательные температуры вроде как не отрабатываются...

Life23
Offline
Зарегистрирован: 10.08.2013

Понял ровно столько, на сколько вы написали.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //у моего табло выводы 13, 12, 11, 10, 5, 4 -это здесь важно?

Конечно важно! Именно этими пинами и получает ваш LCD данные.

и еще  lcd.begin(16, 1); если я не ошибаюсь инициализация делается один раз в setup. И экран у Вас 2-х строчный, значит:lcd.begin(16, 2);

и перед выводом обычно используют: lcd.setCursor(0, 0); т.е. указывают куда "писать" данные. 0,0 - первый символ первой строки.

Возьмите как шаблон свой рабочий скетч, тот что работает с экраном и дописывайте свой DS18b20.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
  lcd.begin(16, 2);
  }

void loop()
{

  DHT.read22(DHT22_PIN);
  const byte tem1 = DHT.temperature ;
  lcd.setCursor(0, 0);
  lcd.print("t=");
  lcd.print(DHT.temperature,1);
}

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

 

kriss
Offline
Зарегистрирован: 24.01.2014

    Спасибо,Life23!   попробую.

kriss
Offline
Зарегистрирован: 24.01.2014

Уважаемый Life23!, у меня все получилось - еще раз спасибо за поддержку. Проблема была в указании используемых выводов.

Сразу все заработало.  Начальная установка курсора  убрала сдвиг текста.  Стал изменять текст   - тоже дает понимание операторов и я смог вставить комментарий. Но многие  функции   пока не понимаю, хотя хочется. например первый блок 1-10: 
       



        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++) {     //обрабатывем 9 байт
 	    data[i] = ds.read();
 	  }
 	 // Вычисляем температуру:
               
               LowByte = data[0];
 	  HighByte = data[1];         // что это 1 и 2?
 	  HighTemp = data[2];
 	  TReading = (HighByte << 8) + LowByte;
 	  Tc_100 = (6 * TReading) + TReading / 4;
 	  Whole = Tc_100 / 100;      //округление до целого
 	}
 	 


 
kriss
Offline
Зарегистрирован: 24.01.2014

Вам также большое  спасибо за подсказки,  ustas  -  сразу я их не  даже не осознал.  Теперь понимаю.   отрицательные значения я пока не знаю как обрабатывать. если можете - подскажите пожалуйста.

serpt
Offline
Зарегистрирован: 02.02.2014

Тоже интересует.