Amateur Radio Station R9AL Мельников Тимур

Цель работы: ознакомиться с использование 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 секунды), после этого открыть монитор порта и последовательно отправить команды, представленные ниже:
  1. AT+NAME=SLAVE (данная команда присваивает модулю название SLAVE)
  2. AT+PSWD="1234" (данная команда устанавливает для модуля пароль 1234)
  3. AT+UART=9600,0,0 (данная команда устанавливает скорость работы UART на 9600 Бод)
  4. AT+CMODE=1 (данная команда устанавливает режим подключения)
  5. AT+ADDR? (данная команда вернет адрес модуля в формате AAAA:BB:CCCCCC, его нужно записать, он пригодится при настройке второго модуля)
  6. AT+ROLE=0 (данная команда устанавливает роль модуля)
После последовательного ввода данных команд модуль перезапустится и будет готов к использованию. Теперь отключаем ардуино от компьютера и подключаем второй hc-05 модуль вместо первого и также вводим его в режим настройки. Открываем монитор порта и последовательно отправить команды:
  1. AT+NAME=MASTER (данная команда присваивает модулю название MASTER)
  2. AT+PSWD="1234" (данная команда устанавливает для модуля пароль 1234, пароль должен быть точно такой же, как и на втором модуле)
  3. AT+UART=9600,0,0 (данная команда устанавливает скорость работы UART на 9600 Бод)
  4. AT+CMODE=0 (данная команда устанавливает режим подключения)
  5. AT+BIND=AAAA,BB,CCCCCC (данная команда установит адрес устройства, к которому должен будет подключаться модуль. Вместо AAAA,BB,CCCCCC подставить адрес первого модуля)
  6. 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();
}




Тема форума: https://forum.msevm.ru/index.php?topic=8.0





Copyright © R9AL 2023 Все права защищены
Рейтинг@Mail.ru Яндекс цитирования