Показано с 1 по 10 из 38

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Модератор
    Регистрация
    06.07.2008
    Возраст
    48
    Сообщений
    414
    Вес репутации
    462

    По умолчанию 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 ");
    
    }
    Последний раз редактировалось SBorovkov; 24.10.2009 в 01:07.

  2. #2
    Местный
    Регистрация
    27.03.2009
    Сообщений
    148
    Вес репутации
    242

    По умолчанию Re: Цифровой датчик температуры на Carduino.

    SBorovkov Спасибо, когда будет 2й датчик испробую.

  3. #3
    Модератор
    Регистрация
    06.07.2008
    Возраст
    48
    Сообщений
    414
    Вес репутации
    462

    По умолчанию Re: Цифровой датчик температуры на Carduino.

    Цитата Сообщение от Mr.DIRTer Посмотреть сообщение
    SBorovkov Спасибо, когда будет 2й датчик испробую.
    Учти, что бывают ds18s20 и ds18b20. Они очень сильно по точности и по команды у них разные. Правильные - c буквой B, они поддерживают преобразование 12 бит.

  4. #4
    Пользователь
    Регистрация
    01.11.2010
    Возраст
    44
    Сообщений
    57
    Вес репутации
    203

    По умолчанию Re: Цифровой датчик температуры на Carduino.

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Ниже приведенный код делает следующее: берет температуру с каждого из датчиков 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 ");
    
    }
    по поводу библиотеки "LCD4Bit.h": читал на офф сайте, то она устаревшая и лучше использовать "LiquidCrystal.h". Недавно написал один проект так он тормозит ужасно, думаю что именно из-за нее так получается. на днях попробую передать под стандартную библиотеку, как сделаю - отпишусь

  5. #5
    Пользователь
    Регистрация
    05.03.2009
    Сообщений
    29
    Вес репутации
    218

    По умолчанию Re: Цифровой датчик температуры на Carduino.

    Подскажите, как и на что нужно(?) крепить датчики, например для правильного замера температуры воздуха? В моем конкретном случае интересует температура в сухом террариуме размером 100х50х50см. Есть теплый и холодный углы (в теплом лампа накаливания). Повесил оба датчика на высоте в 2-3 сантиметра от грунта. Показания были 28 и 26 градуов.

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

  6. #6
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Цифровой датчик температуры на Carduino.

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

  7. #7
    Новичок
    Регистрация
    25.11.2011
    Сообщений
    1
    Вес репутации
    0

    По умолчанию Re: Цифровой датчик температуры на Carduino.

    Время опроса n датчиков DS1821 ~7 мс (периодичность опроса 1с) и практически не зависит от количества (подключены к портам параллельно). Но на такое подключение расходуются порты. Поэтому рассматриваю возможность использования DS18x20. Но поскольку при опросе этих датчиков используется уникальный 64 битный адрес, боюсь время опроса существенно возрастёт (актуально для разработок с использованием нескольких прерываний). Кто нибудь замерял минимальное время опроса датчика(ов) DS18x20? Разве необходимо каждый раз программировать режим работы и запуск измерения!? В DS1821 есть режим непрерывного измерения, т.е. раз запустил и считывай, пока не решил изменить режим работы.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •