-
Вложений: 5
Цифровой датчик температуры на arduino.
Удобство цифрового датчика в том , что его показания не зависят от изменения напряжения питания и прочих парамметров, не требует калибровки, прост в реализации и повторяем.
Подключаем датчик DS18B20 к arduino nano по приведенной ниже схеме
Вложение 5459
Без библиотеки DallasTemperature компилироватся не будет.
Скачиваем и распаковываем Библиотеку, потом кладем ее в папку \arduino-0018\libraries\DallasTemperature
Скачать программу для PC.
Код для arduino Nano.
PHP код:
#include <DallasTemperature.h>
DallasTemperature tempSensor;
void setup(void)
{
Serial.begin(115200);
tempSensor.begin(12); //Вешаем Датчик на 12 порт
}
void loop(void)
{
switch(tempSensor.isValid())
{
case 1:
Serial.println("Invalid CRC");
tempSensor.reset(); // сбросить девайс
return;
case 2:
Serial.println("Invalid device");
tempSensor.reset(); // сбросить девайс
return;
}
Serial.print(tempSensor.getTemperature()); //отправить температуру
Serial.println(); //перенос строки
}
-
Re: Цифровой датчик температуры на Carduino.
Хотелось бы отметить, что у этого датчика есть еще один огромный плюс: можно включить достаточно большое количество датчиков параллельно, к одной ноге контроллера и считывать температуру любого из них.
-
Re: Цифровой датчик температуры на Carduino.
SBorovkov эту инф-ю уже писал Chip, напишите лучше как это делать, если не трудно)
Chip в схеме 12 порт, а в программе 2.
-
Re: Цифровой датчик температуры на Carduino.
-
Re: Цифровой датчик температуры на Carduino.
Ниже приведенный код делает следующее: берет температуру с каждого из датчиков ds18B20, выводит ее на LCD экран и печатает инфу в UART.
Мог маленько накосячить, ибо из сурсов выкидывал еще обработку сервы.
Стоит отметить, что на arduino.cc есть несколько библиотек для однопроводной связи и не все из них работают с большим количеством параллельно подключенных датчиков.
lcd4bit же использован потому, что штатная библиотека по-моему не умеет работать с более чем однострочными экранами.
Код:
#include <LCD4Bit.h>
#include <OneWire.h>
#include "WProgram.h"
void setup(void);
void loop(void);
LCD4Bit lcd = LCD4Bit(2); // две строки. Пины описаны в LCD4Bit.cpp.
OneWire ds(3); // on pin 3
void setup(void) {
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat
lcd.init();
Serial.begin(9600);
}
void loop(void)
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
if ( !ds.search(addr)) {
//Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
Serial.print("R="); //R=28 Not sure what this is
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
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("P=");
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(" ");
}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature
Temp=Temp;//divide by 16 to get pure celcius readout
Serial.print("T=");//output the temperature to serial port
Serial.print(Temp/16);
Serial.print(".");
Serial.print(((Temp%16)*100)/16);
Serial.print(" ");
Serial.print(" CRC=");
Serial.print( OneWire::crc8( data, 8), HEX);
Serial.println();
lcd.clear();
for ( i = 0; i < 8; i++) {
if (addr[i]<16) {
lcd.print("0");
}
lcd.print(addr[i],HEX);
}
lcd.cursorTo(2, 0); //line=2, x=0.
lcd.print("Temp=");
lcd.print(Temp/16,DEC);
lcd.print(".");
lcd.print(((Temp%16)*100)/16,DEC);
lcd.print("S ");
}
-
Re: Цифровой датчик температуры на Carduino.
SBorovkov Спасибо, когда будет 2й датчик испробую.
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
Сообщение от
Mr.DIRTer
SBorovkov Спасибо, когда будет 2й датчик испробую.
Учти, что бывают ds18s20 и ds18b20. Они очень сильно по точности и по команды у них разные. Правильные - c буквой B, они поддерживают преобразование 12 бит.
-
Re: Цифровой датчик температуры на Carduino.
А какой диапазон измерения? От скольки до скольки? :)
-
Re: Цифровой датчик температуры на Carduino.
Диапазон измеряемых DS18B20 температур от -55°C до +125°C
-
Re: Цифровой датчик температуры на Carduino.
как нибудь можно следать чтобы задержка при опросе датчика была поменьше? И еще чтобы он показывал не до сотых а до десятых или целых градусов, и дискретность сделать не 0,06, а 0,01?
-
Re: Цифровой датчик температуры на Carduino.
ds16b20 имеет минимальную дискретность 1/16 градуса. А задержку - можно сначала давать команду выполнить измерение, а затем - считывать результат. К примеру, можно выдать команду на измерение сразу всем датчикам, висящим на линии, а через секунду считать все результаты, сразу выдав команду на следующее измерение. В результате код будет выполняться быстро.
-
Re: Цифровой датчик температуры на Carduino.
а какова максимальная длина кабеля возможна? и подойдет ли витая пара? для примера датчик в бампере, а ардуина в панеле приборов. примерная длина 2 метра.
-
Re: Цифровой датчик температуры на Carduino.
Теоретически длина кабеля, соединяющего датчик с arduino, может достигать нескольких десятков метров
-
Re: Цифровой датчик температуры на Carduino.
небольшое уточнение: десятки метров при полноценном питании и десятки сантиметров по-моему при паразитном (подключение двумя проводами)
-
Re: Цифровой датчик температуры на Carduino.
скажите пожалуйста, а почему пауза происходит , при выводе значений на lcd?
-
Re: Цифровой датчик температуры на Carduino.
код:
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
return;
}
0x28 - это DS18B20, 0x10 - DS18S20
-
Re: Цифровой датчик температуры на Carduino.
Вопрос, кто -нибудь пытался прикорячить датчик температуры и влажности APC ap9335th ??? дома валяются парочка думаю как их приделать к кардуине...
-
Re: Цифровой датчик температуры на Carduino.
какого максимальная длина кабеля подключения к датчику? хочу сделать датчики выносные и интересует какой кабель лучше использовать и при какой длине кабеля не будет помех и т.д.?
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
Сообщение от
mebitek
скажите пожалуйста, а почему пауза происходит , при выводе значений на lcd?
не знаю как в Вашем коде, но у меня стоит задержка 100мс, видимо нужна для нормального опроса датчика
-
Re: Цифровой датчик температуры на Carduino.
Можно использовать витую пару, я проверял на расстоянии 20 метров, работает
-
Re: Цифровой датчик температуры на Carduino.
отлично, мне более и не надо) посмотрим как будут вести себя датчики, ведь у меня их 4 шт и весят параллельно
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
Сообщение от
SBorovkov
Ниже приведенный код делает следующее: берет температуру с каждого из датчиков ds18
B20, выводит ее на LCD экран и печатает инфу в UART.
Мог маленько накосячить, ибо из сурсов выкидывал еще обработку сервы.
Стоит отметить, что на arduino.cc есть несколько библиотек для однопроводной связи и не все из них работают с большим количеством параллельно подключенных датчиков.
lcd4bit же использован потому, что штатная библиотека по-моему не умеет работать с более чем однострочными экранами.
Код:
#include <LCD4Bit.h>
#include <OneWire.h>
#include "WProgram.h"
void setup(void);
void loop(void);
LCD4Bit lcd = LCD4Bit(2); // две строки. Пины описаны в LCD4Bit.cpp.
OneWire ds(3); // on pin 3
void setup(void) {
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat
lcd.init();
Serial.begin(9600);
}
void loop(void)
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
if ( !ds.search(addr)) {
//Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
Serial.print("R="); //R=28 Not sure what this is
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
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("P=");
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(" ");
}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature
Temp=Temp;//divide by 16 to get pure celcius readout
Serial.print("T=");//output the temperature to serial port
Serial.print(Temp/16);
Serial.print(".");
Serial.print(((Temp%16)*100)/16);
Serial.print(" ");
Serial.print(" CRC=");
Serial.print( OneWire::crc8( data, 8), HEX);
Serial.println();
lcd.clear();
for ( i = 0; i < 8; i++) {
if (addr[i]<16) {
lcd.print("0");
}
lcd.print(addr[i],HEX);
}
lcd.cursorTo(2, 0); //line=2, x=0.
lcd.print("Temp=");
lcd.print(Temp/16,DEC);
lcd.print(".");
lcd.print(((Temp%16)*100)/16,DEC);
lcd.print("S ");
}
по поводу библиотеки "LCD4Bit.h": читал на офф сайте, то она устаревшая и лучше использовать "LiquidCrystal.h". Недавно написал один проект так он тормозит ужасно, думаю что именно из-за нее так получается. на днях попробую передать под стандартную библиотеку, как сделаю - отпишусь
-
Re: Цифровой датчик температуры на Carduino.
Подскажите, как и на что нужно(?) крепить датчики, например для правильного замера температуры воздуха? В моем конкретном случае интересует температура в сухом террариуме размером 100х50х50см. Есть теплый и холодный углы (в теплом лампа накаливания). Повесил оба датчика на высоте в 2-3 сантиметра от грунта. Показания были 28 и 26 градуов.
Что бы не был оффотпик давайте будем считать, что замеряем температуру в салоне :)
-
Re: Цифровой датчик температуры на Carduino.
Датчики повесь там где нужно измерять температуру.
А ты дал время датчикам для того что бы они полностью уравнялись с температурой окружающей среды?
-
Re: Цифровой датчик температуры на Carduino.
Время опроса n датчиков DS1821 ~7 мс (периодичность опроса 1с) и практически не зависит от количества (подключены к портам параллельно). Но на такое подключение расходуются порты. Поэтому рассматриваю возможность использования DS18x20. Но поскольку при опросе этих датчиков используется уникальный 64 битный адрес, боюсь время опроса существенно возрастёт (актуально для разработок с использованием нескольких прерываний). Кто нибудь замерял минимальное время опроса датчика(ов) DS18x20? Разве необходимо каждый раз программировать режим работы и запуск измерения!? В DS1821 есть режим непрерывного измерения, т.е. раз запустил и считывай, пока не решил изменить режим работы.
-
Re: Цифровой датчик температуры на Carduino.
Из-за писецовой задержки опроса 18b20 был вынужден от них отказаться совсем.
Возможно, что-то криво было написано, но перепробовав кучу вариантов, плюнул.
Перешел на LM335. Но у меня задачи элементарные.
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
Сообщение от
Chip
Удобство цифрового датчика в том , что его показания не зависят от изменения напряжения питания и прочих парамметров, не требует калибровки, прост в реализации и повторяем.
Подключаем датчик DS18B20 к
Carduino nano(Arduino) по приведенной ниже схеме
Вложение 5459
Без библиотеки
DallasTemperature компилироватся не будет.
Скачиваем и распаковываем
Библиотеку, потом кладем ее в папку
\arduino-0018\libraries\DallasTemperature
Скачать программу для PC.
Код для Carduino Nano.
PHP код:
#include <DallasTemperature.h>
DallasTemperature tempSensor;
void setup(void)
{
Serial.begin(115200);
tempSensor.begin(12); //Вешаем Датчик на 12 порт
}
void loop(void)
{
switch(tempSensor.isValid())
{
case 1:
Serial.println("Invalid CRC");
tempSensor.reset(); // сбросить девайс
return;
case 2:
Serial.println("Invalid device");
tempSensor.reset(); // сбросить девайс
return;
}
Serial.print(tempSensor.getTemperature()); //отправить температуру
Serial.println(); //перенос строки
}
Наверно дуратский вопрос, но все таки куда ложить библиотеку написано в arduino-0018\libraries\DallasTemperature у меня таких папок нет! нужно ещё что то ставить?
Мои действия подключил к компу Carduino Nano к нему подключил датчик DS18B20 без резистора пока, скачал прогу запускаю вылетает ошибка. Что ещё нужно поставить что бы заработало, первый раз пробую Carduino Nano!
-
Re: Цифровой датчик температуры на Carduino.
Папка ...\libraries есть? Какая версия IDE?
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
Сообщение от
Chip
Папка ...\libraries есть? Какая версия IDE?
Есть, туда положил, но выдает ошибки
Цитата:
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:32:24: error: WConstants.h: No such file or directory
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp: In member function 'virtual float BSeries::getTemperature(NewOneWire*)':
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:43: error: 'byte' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:43: error: expected `;' before 'lowByte'
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:44: error: expected `;' before 'highByte'
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:48: error: 'highByte' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\DallasTemperature\BSeries. cpp:48: error: 'lowByte' was not declared in this scope
IDE использую последнею http://arduino.cc/en/Main/Software
Может есть инструкция для совсем новичков, какие IDE ставить и тд
-
Re: Цифровой датчик температуры на Carduino.
Скачал версию arduino-0018 скетч вроде бы загрузился, резистора 4.7К под рукой не нашлось, повесил на 27К вроде за показывало, вопрос из за резистора я так понимаю будет неправильно?
-
Re: Цифровой датчик температуры на Carduino.
Цитата:
из за резистора я так понимаю будет неправильно?
Тогда датчик тока
-
Re: Цифровой датчик температуры на Carduino.
Добрый день!
Купил Arduino Nano V7, работает в машине больше года, хочу расширить функции.
Вопрос: в авто установлены часы-вольтметр-термометр, нужно вместо существующего датчика температуры (Ds18b20) выводить на экран температуру охлаждающей жидкости.
Где взять сигнал? - с OBD2 через трансивер.
Хотел узнать, как можно получив сигнал с OBD2 на Arduino V7, с эмитировать сигнал датчика температуры на одном из выходов и выдать его на устройство часы-вольтметр-термометр?
Актуально зимой, когда прогреваешься.
Заранее спасибо!
-
Re: Цифровой датчик температуры на Carduino.
Подключится к OBD-II можно через переходник на двух транзисторах.
Если в авто есть CAN, то можно собрать или купить CAN-bus Shield т
-
Re: Цифровой датчик температуры на Carduino.
mps100seaz,
1. имхо, имитировать 1-wire можно конечно, но не лучше ли подключить индикатор к ардуино и выводить на него хоть напряжение, хоть температуру, хоть любую другую информацию? (тем более, по сравнению со снятием показаний OBD, это элементарная задача)
2. сам по себе трансивер ничего не даст. какая машина? протокол связи? есть информация по содержанию пакетов?
может проще на аналоговый выход датчика температуры подключиться (если таковой есть)?
-
Re: Цифровой датчик температуры на arduino.
У меня такой установлен на улице. Если на него светит солнце - врёт, хотя и установлен в герметичную белую тубу. Может стенки тубы тонковаты или вентиляцию сделать?
-
Re: Цифровой датчик температуры на arduino.
Датчик температуры установленный на солнечной стороне всегда будет врать. Солнце нагревает стены, а тепло от стен дома, будет искажать показания датчика. Нужно устанавливать в тени
-
Re: Цифровой датчик температуры на arduino.
Такой вопрос.
Между датчиком и ардуинкой будет расстояние метра 1.5...2. Резистор лучше ставить ближе к датчику или ардуинке?
-
Re: Цифровой датчик температуры на arduino.
Ставят обычно где удобно, например на плате, но на самом деле не имеет значения