Наверно, уже каждый слышал об Arduino. Поиграться с этой платформой решил и я, и сделать Bluetooth термометр, показания которого можно смотреть на телефоне или компьютере, оснащенным блютуз модулем.
Железо
Купил на 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 — выводы Arduino.
Заключение
Термометр можно использовать как домашний или как уличный, только тогда всё устройство нужно защитить от агрессивной окружающей среды. И не надо сверлить никаких дырок в стене под провод.
А ещё можно написать клиент для мобильного телефона и получить доступ в Интернет или отправлять смс. И не надо никаких GSM/GPRS шилдов и AT-команд. Лишь телефон с блютузом, но это уже совсем другая история…
Полезные ссылки
Bluetooth-модуль HC-05
Аналоговый датчик температуры – LM335
Температурный 1-Wire датчик DS18S20
Исходники
Автор: om2804