Pull to refresh

Bluetooth термометр

Developing for Arduino *

Наверно, уже каждый слышал об 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
Исходники
Tags:
Hubs:
Total votes 26: ↑22 and ↓4 +18
Views 34K
Comments Comments 24