Bluetooth термометр


    Наверно, уже каждый слышал об Arduino. Поиграться с этой платформой решил и я, и сделать Bluetooth термометр, показания которого можно смотреть на телефоне или компьютере, оснащенным блютуз модулем.


    Принцип действия


    К Arduino подключен Bluetooth по UART, который эмулируется софтово (используется библиотека SoftwareSerial). Этим освобождаем хардварный порт, что дает возможность одновременного считывания данных через кабель и через блютуз. Также к Arduino подключен термодатчик.
    Считываются показания с термодатчика и отправляются в блютуз и по кабелю на компьютер(при необходимости). Любое устройство, оснащенное блютуз и поддерживающее протокол btspp, принимает данные от блютуз-модуля Arduino. А дальше прикладной софт на основе этих данных может строить графики, вести статистику или просто выводить на экран текущую температуру.

    Железо


    Купил на robocraft.ru:
    ORduino Nano (ATmega168) — 500 руб
    Блютуз модуль HC-05 — 330 руб
    Аналоговый температурнй датчик LM335 — 40 руб
    На радиорынке покупал:
    1 резистор на 2,2 КОма, стабилизаторы на 3.3 B и на 5.5 В, конденсаторы для них ~ 30 руб

    Датчик LM335 аналоговый, поэтому, чтобы рассчитать сколько вольт приходит от него, необходимо знать напряжение питания. Если мы ошибемся в вольтаже даже на 0.01 В, то датчик уже даст ошибку в 1 градус, а чем больше заданное значение напряжения будет отличатся от действующего напряжения, тем больше будет погрешность. Не говоря про то что датчик сам имеет погрешность в 1 градус. Необходим высоко стабилизированный источник питания. И лучший результат тут покажут обычные батарейки (точнее батарея из гальванических элементов) подключенные через стабилизатор напряжения к Arduino (в Nano этого стабилизатора нет). Но схемка потребляет 60-70 мА. Для батареек это многовато («Крону» посадит примерно за час-полчаса, но для тестов подойдет). А сетевые блоки питания выдают не такое стабильное напряжение. Из-за пульсаций показания датчика будут сильно прыгать.
    Самый простой выход из этой ситуации использовать цифровые датчики температуры. Например, 1-Wire датчик DS18B20.

    Софт


    Надо заметить, что Блютуз-модуль HC-05 мне пришел со скоростью 9600 (заявленная 38400). Благо её можно поменять через AT-команды. Для работы с модулем в режиме AT-команд можно воспользоваться нехитрым скетчем, предварительно подключив PIO11 к +5 В через резистор 220 Ом.

    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(2, 3); // указываем пины rx и tx соответственно
    
    void setup()  
    {
      Serial.begin(9600);
      mySerial.begin(9600);
    }
    
    void loop()
    {
      if (mySerial.available())
      {
        int c = mySerial.read(); // читаем из software-порта
        Serial.write(c); // пишем в hardware-порт
      }
      if (Serial.available())
      {
        int c = Serial.read(); // читаем из hardware-порта
        mySerial.write(c); // пишем в software-порт
      }
    }


    Скетч для работы с термодатчиком и Bluetooth тоже не сложный. Данные передаем в бинарном формате, пакетами. Каждый пакет начинается с
    0xDEAD

    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(2, 3);
    
    const double opVoltage = 4.98; // опорное напряжение (напряжение питания)
    const byte tmpPin = 0; // номер пина, на котором сидит термодатчик
    
    void setup()
    {
      Serial.begin(9600); 
      mySerial.begin(9600);
      pinMode(13, OUTPUT); 
    }
    
    void loop()
    {
        double vl = (analogRead(tmpPin)*opVoltage)/1024; // значение напряжения на пине
        int tempK = vl*100; // расчет температуры в кельвинах
        int tempC = tempK - 273; // перевод температуры в градусы цельсия
        byte packet[] = {0xDE, 0xAD, tempC >> 8, tempC & 0xFF }; // формируем пакет
            
        // отправляем пакет
        Serial.write(packet, 4); // на компьютер
        mySerial.write(packet, 4); // блютуз-модулю
    	
        // индикация работы - помигаем светодиодом
        digitalWrite(13, HIGH);
        delay(500);
        digitalWrite(13, LOW);
        delay(1500);
    }
    


    Мидлет для телефона написан на J2ME (на чём же ещё. это же мидлет), плюс в том что будет работать на любом телефоне с поддержкой jsr82. Но, зная про «кросплатформенность» J2ME, по крайней мере должен работать :)
    Обратите внимание, что в мидлете указан адрес моего блютуз-модуля.

    Исходники мидлета, а также скетчи Arduino можно найти здесь

    Схема


    Блютуз подключается к пинам D2 и D3.
    Напряжение с датчика температуры снимается на пин A0.






    Заключение


    Термометр можно использовать как домашний или как уличный, только тогда всё устройство нужно защитить от агрессивной окружающей среды. И не надо сверлить никаких дырок в стене под провод.

    А ещё можно написать клиент для мобильного телефона и получить доступ в Интернет или отправлять смс. И не надо никаких GSM/GPRS шилдов и AT-команд. Лишь телефон с блютузом, но это уже совсем другая история…

    Полезные ссылки


    Bluetooth-модуль HC-05
    Аналоговый датчик температуры – LM335
    Температурный 1-Wire датчик DS18S20
    Исходники
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 24

      +1
      Датчик LM335 аналоговый, поэтому, чтобы рассчитать сколько вольт приходит от него, необходимо знать напряжение питания.… Необходим высоко стабилизированный источник питания.
      А в чем сложность измерять одним каналом АЦП напряжение с датчика, а другим — напряжение питания и вводить поправку?
      Или вообще запитывать датчик от источника тока.
        0
        нельзя померить напряжение аналоговым входом не зная какое напряжение питания. Если мы подключим аналоговый вывод к +5v источника, то получим значение 1024. а если напряжение питания упадет до 4v, то значение всё так же останется 1024
          +2
          А, я понял. Напряжение питания используется в качестве опорного для АЦП. Так делать не нужно. В атмеге есть встроенный ИОН, напряжение которго не зависит от напряжения питания. Если он по каким-то причинам не подходит, можно подключить внешний к входу AREF. Не уверен, правда, что эта нога выведена в Arduino.
            0
            Есть, клемма называется REF.
              +3
              пруф:
                0
                тогда проще запитать от 6-7 аккумуляторов по 1.2v через стабилизатор на 5v (в Arduino в стандартном форм-факторе он уже имеется)
                +1
                >>>Необходим высоко стабилизированный источник питания. И лучший результат тут покажут обычные батарейки (точнее батарея из гальванических элементов) подключенные через стабилизатор напряжения к Arduino (в Nano этого стабилизатора нет).

                Лучший и единственно верный вариант это микросхема с референсным напряжением на выходе. Так же советую почитать непосредственно даташит на мегу в области её генератора опорного напряжения и ужаснуться тому что разработчики микросхемы ничего не гарантируют относительно эталонности этого напряжения, посему никогда не используйте аналоговые датчики на атмегах без внешней микросхемы опорного напряжения. В комментариях ниже верно указали что в ардуине есть даже ножка для подачи внешнего опорного напряжения.
                p.s: если требуются конкретные примеры микросхем, говорите — напишу, но позже (сейчас лень искать по памяти, а от проектов мая далековато).
              +5
              Любая вещь становится лучше с блютусом.
                0
                А готовые термометры с блютузом продают? И прочие мелкие штучки интересны. )
                  0
                  готовых с блютузом не встречал, а вот обычные купить дешевле, чем делать на Arduino
                    0
                    Не скажите, «термометр» с беспроводным датчиком — так, чтобы датчик разместить там, где можно адекватно замерять температуру (*), а «шкалу» там, где на нее удобно смотреть — в розничных магазинах стоит обычно от $50. А такой, который можно было бы подключить к компу и собирать статистику/рисовать графики/голосом материться на морозы — так вообще пару сотен. А такой, что к компу подключался беспроводно — ну вы сами написали.

                    * А не по советскому обычаю за кухонным окном под прямыми лучами солнца.
                  0
                  Давно хотел спросить как обстоят дела у адруино с I2C. Как?
                  +1
                  Что-то я не понял. Можно, в двух словах, что к чему подключено и что куда отправляет? Принципальную схему проекта. А то это какая-то инструкция для тех, кто всё и так знает.
                    0
                    дописал в посте
                    +1
                    ORduino Nano (ATmega168) — 500 руб

                    Можно купить даже ATmega8 голую(в том же RoboCraft они есть, хотя, можно найти и дешевле) — стоимость изделия снизится(да и сломать не жалко, если что). Программируется элементарно через программатор, который можно собрать на коленке, либо через Arduino(или любой ее клон). Из обвязки потребуется немного мелочевки и стабилизатор напряжения копеечный.
                      0
                      А еще можно купить блютуз модуль напрямую у китайцев, выйдет 200р вместо 330р.
                        0
                        согласен, что дешевле сделать самому, кто знаком с паяльником и азами схемотехники. а ещё не у всех есть com-порт на компьютере (у меня нетбук)
                          0
                          Получить USB-UART переходник можно как минимум тремя путями:
                          1. Вынуть из Arduino микроконтроллер и превратить ее в USB COM-порт;
                          2. Спаять самому(купить микросхему и подпаять несколько деталей к ней). Нужно небольшое знание матчасти, да;
                          3. Купить. Я так и поступил, посмотрев на цены на микросхемы и задолбавшись вытаскивать мк из ардуины. Братья китайцы продают за $3-$4.

                          Это все при том условии, что в микроконтроллер прошит загрузчик Arduino, конечно. Именно он позволяет прошиваться через COM-порт. Если такого счастья нет(и нет под рукой ардуины) — нужен программатор. У китайцев есть и они.
                            0
                            Программатор довольно несложно сделать и самому. Как и USB — UART переходник.
                            FTBB Programmer
                            «FTBB Programmer»
                        0
                        Проект хороший. Стоит только отметить, что при определенной сноровке Arduino из него можно исключить. Датчик температуры в чип BlueCore тоже встроен, так что для замера температуры с некоторой погрешностью ничего кроме самого модуля и батареек не нужно. Заливаем «скетч» и готово ;-)

                        Я вот сейчас потихоньку пописываю прошивку, позволяющую превратить HC-04 в универсальную беспроводную сенсорную/управляющую ноду.
                          0
                          Подскажите, пожалуйста, следующие моменты:
                          1) какой стабилизатор использовался
                          2) номиналы конденсаторов
                          3) что это у вас припаяно в верхнем левом углу модуля блутус?
                            0
                            1) Приходите на радио-рынок и спрашиваете стабилизатор на 3.3 В и 100 мА
                            2) Конденсаторы там для фильтрации, электролитические, по 10 мкФ хватит, но можно и без них.
                            3) В левом углу идут rx и tx блютуза, они идут к Ардуйно к пинам D2 и D3. В посте об этом упоминалось
                              0
                              1) Ардуино Дуемланова на борту имеет +3,3В, т.е. получается стабилизатора и конденсаторов не требуется?
                              2) Красный проводок на фото, который зачем в схеме? (вот он как раз одним концом подключен к ардуино нано, а второй в непонятно что такое)
                              Суть в том, что я понимаю из поста, что блутус подключается:
                              1) D2
                              2) D3
                              3) GND
                              4) +3,3В
                              5) свтодиод — как понимаю для индикации
                              З.Ы. порекомендовал бы схемы для ардуино рисовать в fritzing.org

                          Only users with full accounts can post comments. Log in, please.