DS18B20

Тема в разделе "Arduino & Shields", создана пользователем Perun61, 15 ноя 2012.

  1. bester

    bester Нуб

    Пожалуйста, помогите добавить в данный скетч данные, чтоб например, по достижении на одном из датчиков температуры 30 градусов на одном из пинов ардуино появлялась логическая еденица на 10 минут?
     
  2. ton29

    ton29 Нуб

    Почитай здесь есть информация про правильное подключение этого датчика температуры к ардуино http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html. Подключить несколько датчиков температуры DS 18B20 к Arduino Processing LCD можно, через базу данных OneWirelibrary. Надеюсь помог как то.
     
  3. ИгорьК

    ИгорьК Гуру

    Крутейшая круть от менеджера по маркетингу.
    Помог - не помог, но удивил.
     
    sys нравится это.
  4. Oberon

    Oberon Нерд

    Я может поиском пользоваться не умею, может что-то другое со мной, но я не смог найти нормальный скетч, для опроса этих датчиков c максимальной скоростью и без далласовской библиотеки. Пришлось писать свой. Камнями не кидайтесь, к программированию имею весьма далекое отношение. Выкладываю то, что получилось. Как по мне, то наконец всё ясно и понятно и можно вставлять куда угодно. Для начинающих, самое оно.

    Код (C++):

    #include <OneWire.h>
    byte OneWirePin = 8; // пин на котором датчики
    byte addresa[20][8]; // 20 возможных датчиков хранятся локально
    byte tochnost = 11; // может принимать только 9(0.5°C),10(0.25°C),11(0.125°C),12(0.0625°C)
    OneWire ds (OneWirePin);
    byte kol; // количество датчиков ( сканирование )
    byte addr[8]; // адреса датчиков по запросу
    float temp;

    // //////////////////// ставим точность измерений /////////////////////////////
    void toch ()
    {
        for(byte i = 0; i < kol; i++)
          {
            ds.reset();
            ds.select(addresa[i]); // выбираем датчик
            ds.write(0x4E);  // команда на запись в датчик
            ds.write(0x4B); // верх и низ для аварийных температур
            ds.write(0x46); // верх и низ для аварийных температур
            if (tochnost==9)
               {
                 Serial.println(" tochnost 0.5 gradusa ");
                 ds.write(0x00); // это разрядность конвертации
               }  
            if (tochnost==10)
               {
                 Serial.println(" tochnost 0.25 gradusa ");
                 ds.write(0x20); // это разрядность конвертации
               }  
            if (tochnost==11)
               {
                 Serial.println(" tochnost 0.125 gradusa ");
                 ds.write(0x40); // это разрядность конвертации
               }  
            if (tochnost==12)
               {
                 Serial.println(" tochnost 0.0625 gradusa ");
                 ds.write(0x60); // это разрядность конвертации
               }  
          }
         ds.reset();
         ds.write(0xCC); //Обращение ко всем датчикам
         ds.write(0x48); // переносим из оперативки датчика в EEPROM датчика
    }
    /////////////отправляем все датчики сети на расчет температуры//////////////////////////////////
    void otpravNaRasch()
    {
      ds.reset();                  // Сбрасываем линию
      ds.write(0xCC); //Обращение ко всем датчикам
      ds.write(0x44);            // Пишем 0x44 - команда на расчет температуры, паразитное питание не допустимо
    }
    ///////////////выясняем сколько у нас датчиков на пине OneWirePin и заносим их адреса в массив//////////////
    void kolDatch()
    {
      kol = 0;
      while ( ds.search(addr))
      {
        for (byte i = 0; i < 8; i++) {
        addresa[kol][i] = addr[i];
        }
        kol = kol + 1;
      }
      ds.reset_search();

    }

    // ////////////////////  расчет температуры ///////////////////////
    void tempa (byte u)
    {
        ds.reset();
        ds.select(addresa[u]);
        ds.write(0xBE);              // Команда датчику, чтобы он начал отдавать данные.  
        temp = (ds.read() | ds.read()<<8); //так и не понял как оно там считается, главное работает
        temp = (float)temp / 16.0;
       
    }

    //  -------------------setup-----------------
    void setup()
    {
      Serial.begin(9600);
      kolDatch();
      Serial.print(" kol= ");
      Serial.println(kol);
      toch ();
      otpravNaRasch();
    }
    // ----------------end setup ------------------
    void loop()
    // ------------------- цикл (loop) ---------------------------
    {
     // kolDatch();
      if (ds.read_bit()) // если расчет температуры закончен, то начинаем считывать
      {
      //  Serial.println (" raschitali ");
         for(byte i = 0; i < kol; i++)
          {
               tempa (i);
               Serial.print(" tempa= ");
               Serial.println(temp);
               
          }
        Serial.println(' ');
        otpravNaRasch(); // сразу отправляем на новый расчет
      }

    }
    //----------------------  конец цикла (loop)---------------------
     
     
    Последнее редактирование: 9 мар 2017
  5. alekseev2017

    alekseev2017 Нерд

    В чём заключается ваш вопрос то?
     
  6. Oberon

    Oberon Нерд

    а вопроса не было, было желание поделиться рабочим скетчем.. может кому и пригодится
     
  7. alekseev2017

    alekseev2017 Нерд

    Понятно.. Тогда спасибо :)
     
  8. Tim308

    Tim308 Нерд

    Лучше все в одну функцию затащить, для удобства переноса между проектами.
    Ну или вообще библиотеку сделать, по феншую ;)
     
    Последнее редактирование модератором: 9 мар 2017
  9. rkit

    rkit Гуру

    Библиотека называется DallasTemperature
     
  10. Oberon

    Oberon Нерд

    так идея как раз и заключалась в том, что бы не использовать данную библиотеку, там delay(1000) в ней
     
  11. rkit

    rkit Гуру

    Идея в том, чтобы не читать документацию. Все задержки там замечательно отключаются.
     
  12. alp69

    alp69 Форумчанин

    А Вы вообще в курсе для чего он нужен?
    Да, поиском Вы пользоваться не умеете.
     
    Последнее редактирование: 16 мар 2017
  13. Oberon

    Oberon Нерд

    Не в курсе и не собираюсь быть в курсе, всё читать - голова лопнет. Факт, что задержка есть и этого достаточно для того, что бы мне не нравиться.
    Там та же задержка...
     
    ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    Возьму на вооружение :) Благодарность за науку выразил кнопкой :)
     
  15. alp69

    alp69 Форумчанин

    Тогда не стоило и начинать...;)
     
  16. Oberon

    Oberon Нерд

    Что за бессмысленные указания кому что надо и кому что не надо ? Нет чтоб сказать, что в далласовской библиотеке задержка стоит для того что бы.....отключить её можно так и так, а ты мол был и не в курсе, а я молодец, подсказал, вот тогда бы это было полезно и не только мне.. А вот эти интриги, мол там всё, что тебе надо есть, но я нифига не скажу где и как, потому что я прочитал тонну макулатуры и теперь этим горжусь, а ты, нуб, сиди и мучайся, оставьте при себе !
     
  17. ИгорьК

    ИгорьК Гуру

    Правильно. Учить этих зажравшихся гиков.
    Слушай сюда. Датчику нужно 750 мс для преобразования температуры после запроса, если он питается по двум проводам и 50 - когда по трем.
    Если читать данные сразу - будет или ошибка или данные прошлого измерения.
    Уяснил? Это важно понимать, если ты оиправляешь данные кудато раз в 10 - 15 минут. Всегда будешь оправлять старые.
    Теперь самая сложная вещь - как ты узнаешь что написано в этом посте, если ничего не читаешь?
    Чем злобнее юзер - тем больший он нуб. Это правило.
     
    SergeiL и alp69 нравится это.
  18. Oberon

    Oberon Нерд

    Я конечно не специалист и читать не умею, но судя по всему и вы тоже.
    разрешение 9 бит, 93.75 мс
    разрешение 10 бит, 187.5 мс
    разрешение 11 бит, 375 мс
    разрешение 12 бит, время преобразования - 750 мс,
    другими словами время зависит не от питания, а от разрешения преобразования.
    И смысл моего скетча был в том, чтобы без использования delay и millis получить темпу.
    Я не правильно сделал ? С удовольствием выслушаю критику, если все правильно, то давайте не толочь воду в ступе.
    P.S. Я с вами на брудершафт не пил, на ВЫ, будьте любезны.
     
    Последнее редактирование: 16 мар 2017
  19. ИгорьК

    ИгорьК Гуру

    "Не в курсе и не собираюсь быть в курсе, всё читать - голова лопнет".
    Уверен, эта мудрая цитата обрадует ее автора и поразит вежливостью.
     
  20. Oberon

    Oberon Нерд

    Вам заняться нечем ? Так напишите мне за деньги то, что мне надо. Мне не доставляет никакого удовольствия ковыряться с этой ардуинкой. Просто никто не может сделать то, что мне надо или сумма совсем не адекватная. Вот и приходится мучиться. А вам бы спасибо сказать, а не упражняться в краснословии.