- Метеостанция на Arduino управляемая Смартфоном

Метеостанция на Arduino с удаленным управлением Android устройством через Bluetooth

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

1. Собрать устройство, которое на LCD индикатор выводит температуру внутри помещения (bmp180), температуру вне помещения (DS18B20), атмосферное давление (bmp180) и влажность воздуха (DHT22). Это устройство должно взаимодействовать со смартфоном на Андроиде через bluetooth и по командам со смартфона передавать на него метеоданные и управлять релейным модулем для включения и выключения электро устройств.

Это устройство собрано на базе представленного здесь в конце странички, но к нему добавлены bluetooth HC-05 и релейный модуль 2 Relay Module, которые представлены на рисунках 1 и 2.

Рис.1. Фото bluetooth модуля, распаянного на монтажной плате со светодиодом, который загорается при установки связи

Рис.2. Фото релейного модуля 2 Relay Module

На рисунке 3 показана схема подключения первого блока релейного модуля к Arduino в случаях подачи питания от внешнего источника питания(перемычка удалена и внешняя батарея подключается к JD-VCC и GND - безопасный случай) и при питании от Arduino (перемычка установлена).

Рис.3. Схема подключения блока модуля к Arduino

На рисунке 4 показана копия с экрана смартфона приложения, которое управляет устройством. Приложение при нажатии на соответствующие кнопки подключается к устройству, получает с него и высвечивает метеоданные, состояния каждого из двух реле модуля(включено или выключено), управляет релейным модулем(включает и выключает реле)

Рис.4. Screenshot Андроид приложения для управления устройством

На рисунке 5 показано фото собранного стенда работающего устройства. В отличии от стенда в конце этой странички здесь дополнительно установлены bluetooth модуль HC-05 и релейный модуль.

Рис.5. Фото работающего стенда

Подключение LCD индикатора и датчиков температуры, давления и влажности выполнялось как в предыдущем учебном материале. Bluetooth модуль выводами Tx, Rx подключался к выводам Ардуино Rx, Tx соответственно. 3.3V и GND модуля подключались к 3.3V и GND платы Ардуино. Это можно видеть из рисунков 1 и 5.

Релейный модуль выводами IN1 и IN2 подключались к выводам 7 и 9 Ардуино соответственно(рис.2 и рис.5).

При составлении программ для стенда на Ардуино и смартфона на андроиде учитывалось следующее:

1. При нажатии на кнопку включения реле результат выполнения команды пересылается смартфону от Ардуино. Таким образом выполнение любой команды подтверждается обратной пересылкой смартфону.

2. Распознавание полученных данных смартфоном(ответов на конкретные команды) выполняется по количеству байт, полученных от Ардуино.

3. Подключение bluetooth смартфона к bluetooth Ардуино выполняется по адресу bluetooth модуля Ардуино, который забит в приложении Андроид(для простоты).

4. Программа под Андроид написана на языке визуального программирования App Inventor 2.

5. Для срабатывания реле на входе релейного модуля должен быть установлен низкий уровень(LOW). Для возврата в исходное состояние - высокий уровень(HIGH).

Программа для Ардуино:

#include <SFE_BMP180.h>

#include <Wire.h>

#include <LiquidCrystal.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#include "DHT.h"

double T,P;

float h,Tout;

char inByte;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define ONE_WIRE_BUS 8

#define DHTPIN 6

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

SFE_BMP180 pressure;

void setup()

{

pinMode(7, OUTPUT); // 7 вывод работает на выход

pinMode(9, OUTPUT); // 9 вывод работает на выход

digitalWrite(7,HIGH); // Реле не срабатывает, если на входе IN1 (7) установлен высокий уровень

digitalWrite(9,HIGH); // Реле не срабатывает, если на входе IN2 (9) установлен высокий уровень

Serial.begin(9600);

lcd.begin(16, 2);

dht.begin();

sensors.begin();

pressure.begin();

}

void loop()

{

meter();

// Вывод метеоданных на LCD

lcd.setCursor(0, 0);

lcd.print("Ti=");

lcd.print(T,1);

lcd.print(" To=");

lcd.print(Tout,1);

lcd.print("C ");

lcd.setCursor(0, 1);

lcd.print("P=");

lcd.print(P/1.333,0);

lcd.print("mm");

lcd.print(" Hum=");

lcd.print(h,0);

lcd.print("% ");

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

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

if(inByte == '0') {

digitalWrite(7,HIGH); // если 0, то выключаем реле 1

Serial.print("Relay 1 down");

}

if(inByte == '1') {

digitalWrite(7,LOW); // если 1, то включаем реле 1

Serial.print("Relay 1 up");

}

if(inByte == '2') {

digitalWrite(9,HIGH); // если 2, то выключаем реле 2

Serial.print("Relay 2 down ");

}

if(inByte == '3') {

digitalWrite(9,LOW); // если 3, то включаем реле 2

Serial.print("Relay 2 up ");

}

if(inByte == '4') { // если 4, то считываем метеоданные и посылаем их на bluetooth

Serial.print("Tin="); Serial.print(T,1); Serial.print("C ");

Serial.print("Tout="); Serial.print(Tout,1); Serial.print("C ");

Serial.print("Pr=");Serial.print(P/1.333,1); Serial.print("mm ");

Serial.print("Hum=");Serial.print(h,0); Serial.print("%");

}

if(inByte == '5') {

// Вывод метеоданных на смартфон через bluetooth

if( digitalRead(7) == 0 && digitalRead(9) == 0) Serial.print("Relay 1 up & Relay 2 up");

if( digitalRead(7) == 1 && digitalRead(9) == 0) Serial.print("Relay 1 down & Relay 2 up");

if( digitalRead(7) == 0 && digitalRead(9) == 1) Serial.print("Relay 1 up & Relay 2 down");

if( digitalRead(7) == 1 && digitalRead(9) == 1) Serial.print("Relay 1 down & Relay 2 down");

}

}

}

double meter() // Функция для определения температуры, давления, влажности

{

char status;

sensors.requestTemperatures();

h = dht.readHumidity();

Tout = sensors.getTempCByIndex(0);

status = pressure.startTemperature();

if (status != 0)

{

delay(status);

status = pressure.getTemperature(T);

if (status != 0)

{

status = pressure.startPressure(3);

if (status != 0)

{

delay(status);

status = pressure.getPressure(P,T);

if (status != 0)

{

}

else lcd.print("error ");

}

else lcd.print("error ");

}

else lcd.print("error ");

}

else lcd.print("error ");

}

Программа для Андроид

Программирование выполняется в программной среде App Inventor 2