- Ардуино для школьников. Термометр, управляемый смартфоном

Ардуино для школьников. Термометр на Ардуино, управляемый смартфоном на Андроиде

Практика для школьников. Мясищев А.А.

Седьмой урок: Организация взаимодействия термометра на Ардуине со Смартфоном на Андроиде через Bluetooth HC-05

Нужно собрать и запрограммировать устройство на Ардуино, которое выводит на индикатор TM1637 температуру с датчика DS18B20 и выполняет включение и выключение мощного светодиода (0.5Вт). Команды на Ардуино должны поступать со Смартфона на Андроиде. Связь должна быть организована через Bluetooth устройства. Смартфон также должен запрашивать с Ардуино температуру и отображать ее у себя на экране.

Ниже на рисунке 1 показана схема подключения устройств к Ардуино. В качестве Bluetooth используется HC-05, который подключается к Ардуино через последовательный порт. Поскольку используется мощный светодиод, то он подключается через транзистор BC547

Рис.1. Схема подключений

На рисунке 2 показано фото собранного термометра, управляемого со Смартфона.

Рис.2. Фото термометра с Bluetooth

Программа на Ардуино использует прерывание по таймеру 1 как здесь. Каждую секунду с основной программы (loop) управление передается программе обработки прерывания по таймеру(ISR(TIMER1_COMPA_vect)), где считываются данные с датчика температуры DS18B20. Далее управление опять передается главному циклу loop, в котором постоянно опрашивается приход символа в буфер последовательного порта. Если пришли символы либо 0, либо 1, либо 2, выполняются действия, описанные в комментариях программы. Вышеописанные символы приходят со Смартфона (см. программу для Смартфона)

Программа для Arduino UNO (c++)

#include <OneWire.h>

#include <DallasTemperature.h>

#include <avr/interrupt.h>

#include <avr/io.h>

#include <TM1637Display.h>

// Подключение TM1637

#define CLK 2

#define DIO 3

#define LED 11 // Сюда подключается исполнительный механизм - светодиод

#define ONE_WIRE_BUS 10 // Подключение датчика температуры к 10 выводу

TM1637Display display(CLK, DIO);

const uint8_t data[] = {0,0,0,SEG_A | SEG_F | SEG_G | SEG_B}; //Формируется символ знака температуры

float cel=0;

int s=0;

OneWire oneWire(ONE_WIRE_BUS); // Создание экземпляра класса

DallasTemperature sensors(&oneWire); // Создание экземпляра класса

void setup() {

// Устанавливаем регистры для прерывания по таймеру 1 при совпадении по сравнению в регистре А

TCCR1A=0b00000000; // Регистр TCCR1 Задает режим работы Time 1, т.е. его

TCCR1B=0b00000000; // предварительно обнуляем и

TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10); //настраиваем тактирование

// таймера на 16000000/1024 (16МГц)

TCNT1H=0x00; // В этих регистрах происходит

TCNT1L=0x00; // счет

// 16000000/1024 = 15625 = 0х3D09

OCR1AH=0x3D; // Регистры сравнения А. Старший байт 0x3D. Настройка на 1 секунду

OCR1AL=0x09; // Регистры сравнения. Младший байт 0x09

TIMSK1 |= (1 << OCIE1A); // В регистре TIMSK1 устанавливаем бит OCIE1A для прерывания по сравнению

Serial.begin(9600);

sensors.begin();

display.clear();

display.setBrightness(7); // Макс. яркость

pinMode(LED,OUTPUT);

digitalWrite(LED,LOW);

}

ISR(TIMER1_COMPA_vect) // Функция обработки прерывания

{

TCNT1H=0; // Каждый раз обнуляем регистры счета

TCNT1L=0;

if(s==60) s=0;

if( s==0|| s==15 || s==30 || s==45 ){

sensors.requestTemperatures();

cel=sensors.getTempCByIndex(0); // Определение температуры

float celo=round(cel); // Округление температуры до целого

display.showNumberDec(celo,false,3,0);//Вывод 3-х символов celo без отступа слева. Выводятся только

// целые значения. Если cel отрицательный, будет стоять -, если положительный - пробел. Вещественные

// числя не округляются. Отбрасывается дробная часть.

display.setSegments(data+3,1,3);// 4-м символом будет значёк температуры. Будет выведен один символ

// с тремя отступами слева

//Serial.print(celo); Serial.print(" ");Serial.println(cel);

}

s++;

}

void loop() {

if (Serial.available() > 0) { //если пришли данные

char inByte = Serial.read(); // считываем байт

if(inByte == '0') { // если 0, то считываем температуру и посылаем ее на bluetooth

Serial.print("T = ");

Serial.print(cel);

}

if(inByte == '1') { digitalWrite(LED,HIGH);// Если со Смартфона приходит единица, включаем светодиод

}

if(inByte == '2') { digitalWrite(LED,LOW);// Если со Смартфона приходит двойка, выключаем светодиод

}

}

}

Программа для Смартфона (Андроид) написана на языке визуального программирования App Inventor 2

Рассмотрим работу блоков программы. Когда нажата кнопка Buttom1, выполняется оператор if. Выполняется попытка подключения по адресу 98:D3:31:B0:86:16. В случае подключения в поле Label7 выводится текст - Bluetooth подключен.

При нажатии на кнопки Button3, Button4, Button5 выполняется пересылка символов 0, 1, 2 со Смартфона на Ардуино.

На Смартфоне запущен таймер со временем срабатывания в 1 секунду. Каждую секунду выполняется проверка, подключен ли к Смартфону Bluetooth Arduino (первый if). Если подключен, второй if проверяет, пришел ли байт с Ардуино. Третий if проверяет длину полученного сообщения с Ардуино. Если длина в байтах находится в пределах от 5 до 12, тогда в поле Label5 выводится текстовое сообщение от Ардуино, например T = -1.25

Задание.

1. Изменить программы на Ардуино и Смартфоне так, чтобы можно было запросить состояние светодиода - выключен он или включен. То есть при нажатии на кнопку на Смартфоне было выведено сообщение включен или выключен светодиод.

2. Предусмотреть кнопку на Смартфоне, при нажатии на которую будет уменьшаться яркость свечения индикатора TM1637. Например, при нажатии 7 раз яркость уменьшиться до минимума.

04.01.2019