Цель работы: ознакомиться с использование Bluetooth для передачи
информации, а также научиться измерять температуру воздуха и передавать
измерения по Bluetooth.
Метеостанция состоит из двух частей: Платы Ардуино с подключенным к ней датчиком
температуры и платы Ардуино с подключенным дисплеем. Также к платам подключены
модули HC-05, с помощью которых первая плата передает показания термометра по
Bluetooth, а вторая плата принимает эти показания и отображает их на дисплее.
Настройка Bluetooth модулей.
Прежде всего необходимо настроить Bluetooth модули. Один модуль настроить как Master, а
второй модуль как Slave. Настроить их подключение друг к другу.
Модули HC-05 настраиваются через последовательный интерфейс (COM) при
помощи AT команд. Для того чтобы настроить модуль, нужно подключить его к
ардуино по следующей схеме:
Далее необходимо загрузить следующий скетч:
#include
const int arduino_rx = 5;
const int arduino_tx = 6;
SoftwareSerial mySerial (arduino_rx, arduino_tx);
void setup() {
pinMode(arduino_rx, INPUT);
pinMode(arduino_tx, INPUT);
Serial.begin(9600);
mySerial.begin(38400);
Serial.println( "«< Start! »>");
mySerial.println("AT")
}
void loop() {
if (mySerial.available()) {
char c = mySerial.read();
Serial.print(c);
}
if (Serial.available()) {
char c = Serial.read();
mySerial.print(c);
}
}
Суть работы скетча заключается в создании программного UART интерфейса и
передачи данных из программного UART в аппаратный и наоборот. После прошивки
ардуино нужно отключить плюс питания от Bluetooth модуля зажать кнопку на
модуле и подключить плюс обратно (при этом модуль войдет в режим настройки и
светодиод на модуле должен начать мигать с периодом в 2 секунды), после этого
открыть монитор порта и последовательно отправить команды, представленные ниже:
AT+NAME=SLAVE (данная команда присваивает модулю название SLAVE)
AT+PSWD="1234" (данная команда устанавливает для модуля пароль 1234)
AT+UART=9600,0,0 (данная команда устанавливает скорость работы UART на 9600 Бод)
AT+CMODE=1 (данная команда устанавливает режим подключения)
AT+ADDR? (данная команда вернет адрес модуля в формате AAAA:BB:CCCCCC, его нужно
записать, он пригодится при настройке второго модуля)
AT+ROLE=0 (данная команда устанавливает роль модуля)
После последовательного ввода данных команд модуль перезапустится и будет
готов к использованию. Теперь отключаем ардуино от компьютера и подключаем
второй hc-05 модуль вместо первого и также вводим его в режим настройки.
Открываем монитор порта и последовательно отправить команды:
AT+NAME=MASTER (данная команда присваивает модулю название MASTER)
AT+PSWD="1234" (данная команда устанавливает для модуля пароль 1234,
пароль должен быть точно такой же, как и на втором модуле)
AT+UART=9600,0,0 (данная команда устанавливает скорость работы UART на 9600 Бод)
AT+CMODE=0 (данная команда устанавливает режим подключения)
AT+BIND=AAAA,BB,CCCCCC (данная команда установит адрес устройства, к которому
должен будет подключаться модуль. Вместо AAAA,BB,CCCCCC подставить адрес первого модуля)
AT+ROLE=1 (данная команда устанавливает роль модуля)
Сборка проекта
Плату с дисплеем будем называть основной, а плату с датчиком вспомогательной.
Основная плата постоянно делает запрос температуры по Bluetooth со вспомогательной платы
и отображает результаты на экране. Вспомогательная же плата постоянно измеряет
температуру и при получении запроса с основной платы, отправляет результаты измерения по
Bluetooth.
Схема подключения дисплея и модуля HC-05 к основной плате:
Далее необходимо загрузить в основную плату следующий код:
#include "GyverTimers.h"
#include
GyverOLED oled;
int connectError = 0;
void setup() {
oled.init();
oled.clear();
oled.setScale(2);
oled.home();
Serial.begin(9600);
Timer1.setPeriod(1000000);
Timer1.enableISR();
}
void disp(String t, int error) {
oled.clear();
if (error == 0) {
oled.setCursor(0, 0);
oled.print("Температура");
oled.setCursor(0, 2);
oled.print(t);
oled.print(" C");
} else if (error == 1) {
oled.setCursor(0, 0);
oled.print("Ошибка");
oled.setCursor(0, 2);
oled.print("подключения");
} else if (error == 2) {
oled.setCursor(0, 0);
oled.print("Ошибка");
oled.setCursor(0, 2);
oled.print("датчика");
}
}
int g = 0;
void loop() {
delay(500);
String t = "";
if (g == 0) {
Serial.print("G");
g = 1;
Timer1.restart();
} else {
if (connectError == 1) {
g = 0;
disp(t, 1);
}
}
while (Serial.available()) {
Timer1.stop();
char c = Serial.read();
if (c == '$') {
disp(t, 2);
} else if (c == '#') {
disp(t, 0);
} else {
t += c;
}
connectError = 0;
g = 0;
}
}
ISR(TIMER1_A) {
connectError = 1;
}
Схема подключения датчика температуры и модуля HC-05 к вспомогательной плате:
Схема подключения датчика температуры и модуля HC-05 к вспомогательной плате:
Далее необходимо загрузить во вспомогательную плату следующий код:
#include "GyverTimers.h"
#include
MicroDS18B20<2> sensor;
void setup() {
Serial.begin(9600);
Timer1.setPeriod(2000000);
Timer1.enableISR();
pinMode(13, OUTPUT);
}
int t = 0;
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == 'G') {
if (t == 32767) {
Serial.println("$");
} else {
Serial.print(t);
Serial.println("#");
}
}
}
}
ISR(TIMER1_A) {
if (sensor.readTemp()) t = int(sensor.getTemp()); else t = 32767;
sensor.requestTemp();
}