DS18S20 и LCD 16х2

Snecky
Offline
Зарегистрирован: 24.01.2012

доброе время суток) есть ардуино и термометры 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, ");

}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

датчики должны подключаться параллельно, а не последовательно:

А что не так с кодом? Визуально все нормально, кроме строк 18 и 21 - должна быть одна из них.

Upd: есть подозрение, что у тебя код для DS18B20 (источник, пост 2).

Snecky
Offline
Зарегистрирован: 24.01.2012

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Вот мой код, работает с двумя DS18B20:

#define ONE_WIRE_BUS 10      // назначаем пин для шины OneWire и датчиков температуры
#define TIME_REFRESH 2000       // Задаем время обновления показаний

// Подключаем библиотеку Dallas
#include <OneWire.h>
#include <DallasTemperature.h>

// 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);

// Переменная показаний температуры
float tempSensor1 = 22.2;
float tempSensor2 = 22.2;

// Подключаем стандартную библиотеку LiquidCrystal
#include <LiquidCrystal.h>
// Задаем размерность индикатора, 
// т.к. эти параметры в коде используются несколько раз
#define LCD_WIDTH 16
#define LCD_HEIGHT 2
// Задаем соответствие пинов индикатора
// Первый (VSS) — это земля. Соедините его с рельсой земли
// Второй (VDD) — питание. Соедините его с рельсой +5 В
// Третий (V0) — контрастность. Если нужна регулировка, повесьте на PWM. Либо переменный резистор 10-20 кОм
// Ток в цепи подсветки ограничивает резистор 6-8 Ом, ток около 100 мА, на +5В
//#define LCD_PIN3_CONTRAST 45  // он же V0
//#define LCD_PIN15_BACKLIGHT 44  // он же A
//byte contrastValue = 127;      // задаем контрастность, начинаем с половины, 0...253
//byte backlightValue = 253;     // задаем яркость подсветки, 0...253

// Инициализируем дисплей, передаём использованные для подключения контакты на Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte gradus[8] = 
{                // символ градуса
  0b01000,
  0b10100,
  0b01000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

void setup() 
{
  Serial.begin(9600);     
  Serial.println("Setup...");

  lcd.begin(LCD_WIDTH, LCD_HEIGHT); // Инициация дисплея
//  analogWrite (LCD_PIN15_BACKLIGHT, 128); 
//  analogWrite (LCD_PIN3_CONTRAST, 96); 

  // Start up the Dallas Temperature library
  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
  
  lcd.createChar(1, gradus);   // формируем пользовательские символы
  screenInit();                // Заставка
  screenShowTemplate();        // Вывод сетки
  
  Serial.println("Setup complete.");
}


void loop() 
{ 
  Serial.println("\n\r\n\r******** loop() begin ********");
  sensorTempRead();  // Опрос датчика температуры
  screenShowData();  // Вывод показаний датчиков
  delay (TIME_REFRESH);
}


// Заставка при включении
void screenInit()
{ 
  Serial.println("Show intro data...");
  lcd.clear();
  lcd.print("-= Hello =-");  
  delay(TIME_REFRESH); 
  
  lcd.clear();
  lcd.print("Software");
  lcd.setCursor(0,1);
  lcd.print("version:");    
  Serial.print("Software version: ");
  delay(TIME_REFRESH);
    
  lcd.clear();
  lcd.print(__DATE__);
  Serial.print(__DATE__);
  Serial.print(" ");
  lcd.setCursor(0,1);
  lcd.print(__TIME__);
  Serial.println(__TIME__);
  delay(TIME_REFRESH * 2); 
}

// Вывод сетки параметров

void screenShowTemplate()
{
  Serial.println("Screen: Show Template");

  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print("Tinside  ???");

  lcd.setCursor(0,1);
  lcd.print("Toutside ???");
}


// Вывод показаний датчиков
void screenShowData() 
{
  Serial.println("Screen: Show Data on LCD");

  //Вывод показаний температуры датчика 1
  lcd.setCursor(9,0);          
  lcd.print("    ");
  lcd.setCursor(9,0);
  if (tempSensor1 > 0) lcd.print("+");
  if (tempSensor1 == -127.00) lcd.print("errr");
  else
  { 
    lcd.print(tempSensor1, 1); 
    lcd.write(1);
    lcd.print("C");
  }

  //Вывод показаний температуры датчика 2
  lcd.setCursor(9,1);         
  lcd.print("     ");
  lcd.setCursor(9,1);
  if (tempSensor2 > 0) lcd.print("+");
  if (tempSensor2 == -127.00) lcd.print("errr");
  else
  { 
    lcd.print(tempSensor2, 1); 
    lcd.write(1);
    lcd.print("C");
  }
}


// Опрос датчиков температуры
void sensorTempRead()
{   
  Serial.println("Reading sensors...");
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  tempSensor1 = sensors.getTempCByIndex(0);
  tempSensor2 = sensors.getTempCByIndex(1);

  Serial.print("Tsensor1: ");
  Serial.println(tempSensor1);
  Serial.print("Tsensor2: ");
  Serial.println(tempSensor2);
}

Все проверки 1-Wire отсутствуют (мне были без надобности).

Snecky
Offline
Зарегистрирован: 24.01.2012

 IDE ругается на 12 строчку 

 error: no matching function for call to 'DallasTemperature::DallasTemperature(OneWire*)'

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

нужно подключить бибилиотеку DallasTemperature

Snecky
Offline
Зарегистрирован: 24.01.2012

спасибо те мил человек! все получилось, буду разбирать код для понимания

Snecky
Offline
Зарегистрирован: 24.01.2012

еще вопрс подключаю датчик по проводу длиной  примерно 1 метр ! да экране температура показывает сначало норм тмп а потом на секунду показывает +85, контакты все проверил, скетч использую который выше ! 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Датчик подключен тремя или двумя проводами? Если двумя, то на большие расстояния можно не рассчитывать,  максимум 30-40 см.

У меня трехпроводное подключение, вынесен на три метра, сбоев нет.  Кто-то отписывался,  что и на 150 м работает. 

Ну или сам датчик дефектный. Резистор каким сопротивлением?

Snecky
Offline
Зарегистрирован: 24.01.2012

подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик  без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю

msg31
Offline
Зарегистрирован: 01.12.2013

Snecky пишет:

подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик  без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю

Провод возьми экранированный, например от USB провода.

demon969
Offline
Зарегистрирован: 24.04.2012

Объясните, пожалуйста, как работает эта часть представленного выше кода?

lcd.print(__DATE__);
  Serial.print(__DATE__);
  Serial.print(" ");
  lcd.setCursor(0,1);
  lcd.print(__TIME__);
  Serial.println(__TIME__);

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

выводит на ЖК и в Serial время и дату загрузки прошивки в МК. Я это использую для сравнения актуальности версий кода.
В C++ переменные, обрамленные двойным подчеркиванием, являются системными и глобальными, так почему их не использовать, раз все равно в памяти сидят? ;)
К слову, именно эти две переменные можно использовать для создания часов без применения внешних RTC (да, это костыли, но когда под рукой нет RTC, то сойдет).

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

msg31 пишет:

Snecky пишет:

подключен 3мя проводами , резистоор 4,7кОм , дело в том что сам датчик  без провода нормально работает , вот заметилон так глючит если резко сменить положения с комноты на улицу или обратно, т.е. резкое изменение температуры ((( резет МК не помогает, чсас попробую сменить датчик и посмотрю

Провод возьми экранированный, например от USB провода.

к сожалению большинство проводов usb не экранированы. нужен был экранированный. разрезал 2 кабеля. только 4 провода и все. китайцы блин

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Экранированные обычно бывают в прозрачной изоляции - видно сеточку экрана.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Tomasina пишет:

Экранированные обычно бывают в прозрачной изоляции - видно сеточку экрана.

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

можно взять UTP кабель ("витая пара"), 6 незадействованных жил соединить вместе и на GND - за счет того, что они скручены, будет тот же экран.

Только там проводки одножильные, не переносят частых изгибов - ломаются.

Snecky
Offline
Зарегистрирован: 24.01.2012

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

demon969 пишет:

Объясните, пожалуйста, как работает эта часть представленного выше кода

  Serial.begin(115200);
  Serial.print(F("Version    "));
  Serial.println(ver);
  Serial.print(F(__DATE__));
  Serial.print("   ");
  Serial.print(F(__TIME__));
  Serial.print("   ");
  Serial.println(F(__FILE__));

Я иду ещё дальше...

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Snecky пишет:

...... все стало работать хорошо, длина провода 4,5м........

http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#commen...

http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#commen...

 

demon969
Offline
Зарегистрирован: 24.04.2012

trembo пишет:

demon969 пишет:

Объясните, пожалуйста, как работает эта часть представленного выше кода

  Serial.begin(115200);
  Serial.print(F("Version    "));
  Serial.println(ver);
  Serial.print(F(__DATE__));
  Serial.print("   ");
  Serial.print(F(__TIME__));
  Serial.print("   ");
  Serial.println(F(__FILE__));

Я иду ещё дальше...

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

Вы уж простите, но тоже не  понятно что делает этот код)))

Попробовал такой простой примере , но в терминал выводитяся кракозяблины.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT); 
  Serial.begin(9600);
  Serial.print(__DATE__);
  Serial.print(" ");
  Serial.println(__TIME__);  
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
  
  Serial.begin(115200);
Serial.print(F("Version    "));

Serial.print(F(__DATE__));
Serial.print("   ");
Serial.print(F(__TIME__));
Serial.print("   ");
Serial.println(F(__FILE__));
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а зачем в loop() каждый раз объявлять Serial.begin(115200);, если оно уже объявлено в setup()?

P.S. на результат не повлияет, кракозябры останутся, но "не стоит кристалл мучать, ему еще придется первый закон робототехники объяснить..." :)

demon969
Offline
Зарегистрирован: 24.04.2012

Tomasina пишет:

а зачем в loop() каждый раз объявлять Serial.begin(115200);, если оно уже объявлено в setup()?

P.S. на результат не повлияет, кракозябры останутся, но "не стоит кристалл мучать, ему еще придется первый закон робототехники объяснить..." :)

Это просто опечатка. В сетапе у меня инициализация.

В лишней инициализации и было дело. Теперь я поня назначение выше приведенного кусочка кода. Всем спасибо!!!

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

   Уважаемый Tomasina !     При попытке загрузить Ваш скетч  выскочили две ошибки. Что это может быть? 

  009 OneWire oneWire(ONE_WIRE_BUS);

  158  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а какие ошибки-то?

Сами библиотеки DallasTemperature и OneWire подключены? 

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

Да, у меня же работает один датчик.  И библиотеки подключены.

#include <OneWire.h>

#include <DallasTemperature.h>
 

 

выскакивают ошибки:

sketch_feb09b:9: error: 'OneWire' does not name a type

sketch_feb09b:12: error: 'DallasTemperature' does not name a type
sketch_feb09b.ino: In function 'void setup()':
sketch_feb09b:59: error: 'sensors' was not declared in this scope
sketch_feb09b.ino: In function 'void sensorTempRead()':
sketch_feb09b:158: error: 'sensors' was not declared in this scope
Snecky
Offline
Зарегистрирован: 24.01.2012

подключите библеотеки которые выше дал Tomasina  а именно  DallasTemperature и  OneWire 

у меня его скетч сразу заработал 

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

 А что, библиотеки разве не стандартны?  Я об этом не знал.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

нет, это бибилиотеки разработчиков протоколов OneWire и оборудования Dallas.

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

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

После загрузки  указанной библиотеки все пошло, но не  библиотеку не удалось сразу импортировать из-за лишних символов в имени.