Температурный датчик с выводом значения на смартфон

Статья расскажет о проекте термометра, основным отличием от похожих проектов будет то, что показания датчика температуры будут передаваться на смартфон по Bluetooth и отображаться на его экране. Такой датчик температуры можно разместить в недоступном месте, например за окошком, в холодильнике. И вы всегда сможете проверить температуру без визуального контакта с этим датчиком. Вы запускаете мобильное приложение, подключаетесь к датчику и на экране Смартфона или планшета контролируете температуру. Сам датчик будет реализован с помощью Arduino. Для реализации передачи значения температуры на смартфон мы используем библиотеку RemoteXY.

Для реализации электрической части устройства термометра вам потребуется любая плата Arduino, термистор 1кОм, резистор 1кОм, желательно так же батарейный отсек для автономного питания Arduino. Термистор подойдет на любое сопротивление от 1 до 100 кОм, но в этом случае сопротивление резистора должно быть аналогичным. Ниже приведена схема подключения всех элементов конструкции. Мы же все это собрали на макетной плате.

Термистор включен в цепь делителя напряжения, во втором плече которого находится постоянное сопротивление. Таким образом, при изменении температуры будет изменяться сопротивление термистора, а значит и одного плеча делителя напряжения. Напряжение делителя будет изменяться в след за температурой. Среднюю точку делителя напряжения мы подключили к аналоговому входу Arduino с номером A5.

Разработку программы мы начнем с калибровки нашего датчика. Калибровку мы выполним по двум точкам, и для этого нам понадобится эталонная температура. У меня в комнате стоит термометр, который показывает 25 градусов Цельсия, это будет первая эталонная температура. Так же я знаю что температура моего тела составляет 36.6 градусов Цельсия, и это будет вторая эталонная температура. Так же примем, что сопротивление нашего термистора в определенных пределах изменяется по линейному закону в зависимости от температуры. По этому, в дальнейшем, для вычисления текущей температуры будем использовать линейную интерполяцию.

Для выполнения калибровки нам необходимо определить, какое значение выдает АЦП Arduino при температурах датчика, которые мы выбрали эталонными. Используем Serial и монитор порта, для того что бы передавать значение АЦП на компьютер, что бы мы могли посмотреть, какое же оно при наших эталонных температурах. Для этого нам потребуется загрузить в Arduino следующий простой скетч.


void setup()  

  Serial.begin(9600);   


void loop()  
{  
  int sensorValue = analogRead(A5);
  Serial.println(sensorValue);
  delay(1); 
}

Данный скетч в каждом цикле программы измеряет напряжение аналогового вывода A5, оцифровывает его и отправляет в Serial. Вы можете подключиться монитором порта (Сервис/Монитор порта) и посмотреть, какие значения передаются. Теперь нам необходимо записать значения АЦП при выбранных эталонных температурах датчика. Первую эталонную температуру вы получаете сразу, если ваш термистор достаточно долго находился в комнате. Для получения второй эталонной температуры приложите термистор к своему телу и подержите его несколько минут. Перепишите значения АЦП, которые передаются в монитор порта при этих температурах. У нас получились следующие значения:

T=25.0°C АЦП=580

T=36.6°C АЦП=514

Заходим в онлайн редактор RemoteXY и создаем интерфейс управления. Он состоит из текстового поля, через которое будет передаваться измеряемая температура, и текстовой метки. Длина текстового поля, задаваемая в настройках, определяется максимальной длиной передаваемой строки. В нашем случае это могут быть значения "-40.0" или "100.0". То есть длина строки не может превышать 5 символов. Можно оставить предлагаемую по умолчанию системой длину в 10 символов.

Выбираем в настройках проекта целевую платформу Arduino (SoftwareSerial), library version и формируем исходный код нашего интерфейса. Не забудьте загрузить библиотеку RemoteXY и подключить ее к Arduino IDE (Скетч/Импортировать библиотеку/Add library...).

Для передачи значения температуры на экран смартфона мы должны получить текущее значение АЦП, получить значение текущей температуры, используя линейную интерполяцию по двум известным точкам, преобразовать полученное значение в строку и записать ее в поле text_1 структуры RemoteXY. Для преобразования числа типа double в строку используем функцию:

dtostrf (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf)

Задачу линейной интерполяции мы решим используя простую формулу:

Собрав все воедино мы получаем следующий исходный код - скетч для Arduino:


///////////////////////////////////////////// 
//        RemoteXY include library         // 
///////////////////////////////////////////// 

/* определение режима соединения и подключение библиотеки RemoteXY */ 
#define REMOTEXY_MODE__SOFTWARESERIAL 
#include <SoftwareSerial.h> 
#include <RemoteXY.h> 

/* настройки соединения */ 
#define REMOTEXY_SERIAL_RX 2 
#define REMOTEXY_SERIAL_TX 3 
#define REMOTEXY_SERIAL_SPEED 9600 

/* конфигурация интерфейса  */  
unsigned char RemoteXY_CONF[] = 
  { 0,11,27,0,1,5,67,0,24,23
  ,54,16,2,11,129,0,23,12,39,9
  ,0,84,101,109,112,44,32,194,176,67
  ,0 }; 
   
/* структура определяет все переменные вашего интерфейса управления */
struct { 

    /* output variable */
  char text_1[11];  /* =строка оканчивающаяся нулем UNICODE */

    /* other variable */
  unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY; 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 

/* первое замеренное значение - первая точка */
#define SENS_1_VAL 514
#define SENS_1_TMP 36.6

/* второе замеренное значение - вторая точка */
#define SENS_2_VAL 580
#define SENS_2_TMP 25.0

void setup()  

  RemoteXY_Init ();  
   
  Serial.begin(9600);   


void loop()  
{  
  RemoteXY_Handler (); 

  /* получаем значение АЦП */
  int sensorValue = analogRead(A5);    
  /* 
    вычисляем текущую температуру используя 
    линейную интерполяцию по двум известным точкам 
  */
  double temp = SENS_1_TMP + (SENS_2_TMP - SENS_1_TMP) / 
           (SENS_2_VAL - SENS_1_VAL) * (sensorValue - SENS_1_VAL);    
  /* 
    преобразуем значение температуры в строку 
    и помещаем ее сразу в поле text_1 структуры RemoteXY 
  */
  dtostrf(temp, 0, 1, RemoteXY.text_1);
  
  /* 
    отправляем значение  АЦП в Serial для того 
    что бы мы могли проверить значения 
  */
  Serial.println(sensorValue);
  delay(1);       
}

В данном коде вы должны изменить определяемые значения SENS_1_VAL, SENS_1_TMP, SENS_2_VAL, SENS_2_TMP, подставив вместо них ваши, которые вы получили при измерениях значений для калибровки.

Загрузите скетч в вашу Arduino. Загрузите в ваш смартфон или планшет приложение RemoteXY. И можете контролировать температуру находясь на удалении от изготовленного вами датчика, используя Bluetooth.