• Nenhum resultado encontrado

Комплексный контроль сна новорожденного ребенка

N/A
N/A
Protected

Academic year: 2023

Share "Комплексный контроль сна новорожденного ребенка"

Copied!
50
0
0

Texto

(1)

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение

высшего образования

«Южно-Уральский государственный университет (НИУ)»

«Институт естественных и точных наук»

Физический Факультет

Кафедра физики наноразмерных систем РАБОТА ПРОВЕРЕНА

Рецензент, с.н.с., доцент ____________/Клебанов И.И./

«____»____________ 2020г.

ДОПУСТИТЬ К ЗАЩИТЕ

Заведующий кафедрой д.ф-м н. проф.

____________/Воронцов А.Г./

«____»____________ 2020г.

Комплексный контроль сна новорожденного ребенка ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА

ЮУрГУ – 11.04.04.2020.021 ПЗ ВКР

Руководитель, к.ф.-м.н., доцент ________________/Подгорнов Ф.В./

"____"_______________ 2020г.

Автор, студент группы ЕТ – 263 _________________/Батурин Е.К./

"____"_______________ 2020г.

Нормоконтролер, к.т.н., доцент _______________/Колмакова Н.С./

"____"_______________ 2020г.

(2)

АННОТАЦИЯ

Батурин Е.К. Контроль сна

новорождѐнного ребенка. – Челябинск:

ЮУрГУ, ИЕТН, ЕТ-263; 2020, 53 с.11 ил., библиогр. список – 7 наим.

Цель выпускной квалификационной работы – разработка устройства, позволяющее контролировать сон новорождѐнного ребенка, для людей с ограниченными физическими возможностями.

В данной работе был проведен анализ научный статьей, в которых описывается принцип работы микроконтроллеров, аппаратоно-програмной платформы Arduino, модулей, используемых в данной работе. Было смоделировано, собрано и протестировано устройство, помогающее контролировать сон ребенка. Был проведен анализ полученных результатов, и сделан вывод о необходимых модификациях устройства.

(3)

ОГЛАВЛЕНИЕ

АННОТАЦИЯ ... 5

ВВЕДЕНИЕ ... 7

1 ЛИТЕРАТУРНЫЙ ОБЗОР ... 9

1.1 Arduino ... 9

1.1.1 Arduino Nano ... 9

1.2 Модуль GSM M590 ... 13

1.3 Звукозаписывающий модуль ISD1820 ... 14

1.4 Высокочувствительный датчик воды ... 16

2 ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ ... 18

2.1 Основные этапы моделирования ... 18

2.1.1 Определение наличия воды ... 19

2.1.2 Звуковое извещение ... 20

2.1.3 Отправка SMS-сообщений ... 22

2.1.3.1 SMS-сообщения на латинице ... 29

2.1.3.2 USSD, SMS на русском (PDU) ... 32

2.1.4 Итоговый скетч... 40

2.2 Функциональность ... 50

ЗАКЛЮЧЕНИЕ ... 52

БИБЛИОГРАФИЧЕСКИЙ СПИСОК ... 53

(4)

ВВЕДЕНИЕ

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

Одна из важнейших задач технологического прорыва - это использование всех достижений современности, чтобы люди, с ограниченными физическими возможностями, в современных реалиях были полноправными членами общества.

Обзавестись семье, в настоящее время, благодаря бурному развитию интернета и других способов коммуникации, становится легче. А о том, чтобы обзавестись ребенком, для людей с ограниченными физическими возможностями, стоит гораздо острее, т.к. в зависимости от принадлежности к той или иной группе инвалидности, возникают вопросы ухода и организации полноценного контроля за ребенком в первые годы жизни. Т.к. новорожденному ребенку требуется максимальное количество внимания, а инвалидам по здоровью (тем, кто лишен зрения, слуха, способности спокойно перемещаться) довольно проблематично, помимо основных домашних дел (уборка, стирка, глажка, готовка), быстро и часто проверять спящего ребенка.

Таким образом, цель данной работы - разработка устройства, позволяющего контролировать сон новорождѐнного ребенка, для людей с ограниченными

(5)

2. Создать модель и алгоритм работы устройства.

3. Написать скетч и собрать готовое устройство на базе Arduino.

4. Проанализировать полученное устройство на недоработки и внести изменения.

(6)

1 ЛИТЕРАТУРНЫЙ ОБЗОР 1.1 Arduino

За последние несколько лет, наблюдается рост интереса к такой платформе для проектирования, как Arduino.

Arduino — это эффективная аппаратно-программная платформа для проектирования и создания новых устройств, разработанная компанией Arduino Software, предназначенная для более плотного взаимодействия с окружающей физической средой, чем стандартные ПК.

Arduino создана на базе языков программирования C/C++ и является бесплатной программной интегрированной средой разработки. Наличие нескольких типов плат Arduino и Arduino - совместимых плат, многократно увеличивает пользовательские возможности разработки с применением аппаратных и программных компонентов.

1.1.1 Arduino Nano

В качестве контроллера в нее встроен микропроцессор ATmega 328[1].

(7)

В плате применен чип FTDI FT232RL для USB-Serial преобразования и применяется mini-USB кабель для связи с ардуино. Связь с различными устройствами обеспечивают UART, I2C и SPI интерфейсы.

Микроконтроллер ATmega 328

Рабочее напряжение

(логическая уровень) 5 В

Входное напряжение

(рекомендуемое) 7-12 В

Входное напряжение

(предельное) 6-20 В

Цифровые Входы/Выходы

14 (6 из которых могут использоваться как выходы

ШИМ)

Аналоговые входы 8

Постоянный ток через вход/выход

40 mAh с одного вывода и 500 mAh со всех выводов

Флеш-память

32 Кб (ATmega328) при этом 2 Кб используются для

загрузчика

ОЗУ 2 Кб (ATmega328)

EEPROM 1 Кб (ATmega328)

Тактовая частота 16 МГц

Размеры 1.85 см x 4.2 см

Таблица 1.1. Характеристики Arduino Nano[2].

(8)

Arduino Nano имеет 8 аналоговых входов, которые могут использоваться как цифровой выход, 14 цифровых, из которых 6 могут работать как широтно- импульсный модулятор (ШИМ), два задействованы под I2C и три под SPI.

Выходы Digital 2 и 3 могут быть использованы для внешних прерываний. Это сигналы, которые сообщают микроконтроллеру о каком-либо событии. По этим сигналам вызывается программа обработки прерывания и выполняются необходимые действия.

Питание Arduino Nano может быть реализовано различными источниками:

подключение через Mini-B USB компьютера, от обычного нерегулируемого источника питания 6-20 В (pin 30), или регулируемого 5 В (pin 27). Плата автоматически выберет питание с самым высоким напряжением.

Стабилизация питания происходит благодаря LM1117IMPX-5.0[3] с напряжением 5В. При подключении через USB, используется диод Шоттки.

Рис. 1.1. Схема питания.

(9)

У Arduino Nano распиновка выполнена следующим образом:

Рис. 1.2. Распиновка Arduino Nano[2].

1 – TX (передача UART) или порт D0;

2 – RX (прием UART) или порт D1;

3,28 – сброс (RESET);

4,29 – земля;

5…16 – порты D3…D13;

17 – напряжение 3,3 В;

18 – опорное напряжение АЦП;

19…26 – 8 каналов АЦП A0…A7;

27 – напряжение 5,0 В;

30 – плюс питания модуля 2-20 В

Вывод №1 и №2 используются как порты для двоичных данных либо для связи по классическому последовательному интерфейсу с другим устройством.

В Arduino Nano распиновка 5…16 выводов, кроме указанных, имеет дополнительные функции:

5 – прерывание INT0;

6 – прерывание INT1 / ШИМ / AIN0;

(10)

7 – таймер-счетчик T0 / шина I2C SDA / AIN1;

8 – таймер-счетчик T1 / шина I2C SCL / ШИМ;

9,12,13,14 – ШИМ;

16 – светодиод.

1.2 Модуль GSM M590

Neoway M590E - двухдиапазонный GSM-модуль без поддержки голосовой связи. M590E поддерживает GPRS class 10, имеет встроенный стек TCP/IP.

Позволяет отправить/получить SMS сообщения и данные gprs, делать звонки.

Шина TTL позволяет подключить как непосредственно к компьютеру, так и к ардуино

Рис 1.3. GSM/GPRS модуль NEOWAY M590.

(11)

Напряжение 3.7 - 4.2В

Частота 900, 1800 мГц

Ожидания ток <10 мА

Рабочий ток <2000 мА

Скорость передачи

данных 115200

Интерфейс TTL 2.8В

Команды регулярные AT-команды

Антенна съемная с IPEX разъемом Температура рабочая от -30 C до 80 C

Таблица. 1.2. GSM/GPRS модуль NEOWAY M590[4].

Более подробная схема вводов-выводов и принципиальную схему платы найдете в Приложении 2

1.3 Звукозаписывающий модуль ISD1820

Электронное устройство для записи и воспроизведения краткого голосового сообщения.

Частотные характеристики модуля ориентированы на запись и воспроизведение речи. На плате установлен разъем SP1 для подключения динамика. Записанный звук можно проконтролировать и переписать. Звуковая информация находится в памяти длительного хранения микросхемы ISD1820PY[5]. Благодаря установке микросхемы в панель звукозаписывающий модуль ISD1820 можно использовать как рекордер для записи множества различных сообщений в разные микросхемы.

Второй режим работы – трансляция, предназначен для использования модуля в качестве усилителя. Благодаря наличию АРУ и полосового фильтра качество звука выше, чем при использовании обычного микрофонного усилителя.

(12)

Рис. 1.4. ISD1820.

Питание 3 – 5 В

Длительность записи или воспроизведения

10 с

Предельное расстояние для

записи голоса не более 0,2 м

Динамик 0,5 Вт, 8 Ом

Предельная температура

окружающего воздуха Предельная температура окружающего воздуха 0

Размер платы 38 x 42,5 мм

Таблица. 3. Характеристики ISD1820.

(13)

1.4 Высокочувствительный датчик воды

Датчик воды предназначен для определения наличия воды.

Рис. 1.5. Датчик воды.

Напряжение

питания 3.3-5 В

Ток потребления

20 мА Выход

аналоговый Зона

обнаружения 16×30 мм

Размеры 62×20×8 мм

Рабочая температура

10 – 30 °С

Таблица. 4. Технические характеристики модуля.

«+» (вход питания) – должен совпадать для соединенной схемы ардуино по напряжению и току.

«-» – заземление;

(14)

«S» – аналоговый выход;

Аналоговый. Значение, получаемое контроллером, будет варьироваться от 0 до 1023. Где 1023 – максимальная влажность, 0 – максимальная сухость.

(15)

2 ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ 2.1 Основные этапы моделирования

Этапы создания устройства, промежуточные испытания и ожидаемые результаты, несомненно, зависят от требуемого функционала задуманного устройства.

Первоначально, необходимо обеспечить возможность инвалидам по зрению вовремя получать формацию об актах дефекации и деуринации новорожденного ребенка и реагировать на нее.

Способы получения информации в данном случае следующие: звуковое оповещение, оповещение через систему SMS, входящий звонок по сотовому телефону.

Так как в 90 % случаях у новорожденного ребенка при акте дефекации происходит акт деуринации, то присутствие мочи является индикатором.

Вещества Процентное содержание, %

Вода 98-99

Белки, жиры, гликоген Отсутствует

Глюкоза 0-0,1

Натрий(ионы) 0,4

Хлор(ионы) 0,7

Калий(ионы) 0,15

Сульфаты(ионы) 0,18

Магний(ионы) 0,006

Мочевина 2,0

Мочевая кислота 0,05

Таблица. 2.5. Химический состав мочи.

(16)

Из таб. 2.5 видно, что основную массу, вне зависимости от времени суток, состояния здоровья, пола, массы, а так же от параметров окружающей среды, таких, как температура и влажность воздуха, составляет вода. Поэтому применение датчика, реагирующего на H2O, будет наиболее рационально.

2.1.1 Определение наличия воды

На этапах моделирования используется высокочувствительный датчик воды HW-038.

Рис. 2.6. Схема подключение HW-038 к Arduino Nano.

Скетч для определения наличия воды:

void setup() { Serial.begin(9600);

pinMode(A0,INPUT);

}

void loop()

(17)

На порт А0 приходит информация с датчика воды в диапазоне от 0 до 1023.

Но, учитывая погрешность датчика, влажность воздуха и т.д., необходимо установить минимальное значение, превышение которого, будет обозначать присутствие воды на датчике, введением условия.

void setup() { Serial.begin(9600);

pinMode(A0,INPUT);

}

void loop() int i =

analogRead(A0);

if(i>500){

Serial.println(i);

Serial.println("На датчике есть вода");

} }

При уменьшении значения i меньше 500, программа не будет ничего выводить на экран, т.е. считать, что на датчике нет воды.

2.1.2 Звуковое извещение

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

(18)

Рис. 2.7. Схема подключение ISD1820, HW-038 к Arduino Nano.

Скетч для извещения через динамик о наличии воды:

void setup() { Serial.begin(9600);

pinMode(A0,INPUT);

pinMode(11, OUTPUT);

}

void loop()

int i = analogRead(A0);

if(i>500){

Serial.println(i);

Serial.println("На датчике есть вода");

digitalWrite(11,1);

Serial.println("Идет звук через динамик");

(19)

Порт 11 запрограммирован как информационный выход, к которому подключен вход P-E (PLAYE) платы ISD1820. При выходе из 11 порта логической единицы, ISD1820 начнет воспроизведение заранее записанного файла.

2.1.3 Отправка SMS-сообщений

Для возможности отправки текстовых сообщений на телефон, используется модуль GSM M590.

Питание GSM модуля производится от Arduino Nano:

NEOWAY<>Arduino Nano GND<>GND

VCC<>+5V

Взаимодействие с модулем осуществляется по интерфейсу UART (Serial) при помощи специальных AT-команд. Для реализации обмена по UART-интерфейсу на пинах, отличных от стандартных RX(0)/TX(1) (они как правило заняты подключением к компьютеру), понадобится стандартная Arduino- библиотека SoftwareSerial.h

NEOWAY<>Arduino Nano RX<>TX(7)

TX<>RX(8)

Т.к. цифровой выход платы Arduino выдает +5В, а на вход RX модуля M590 необходимое напряжение в диапазоне 2.1-3.1 В, необходимо применить делитель напряжения из двух резисторов одинакового номинала в диапазоне 1-10КОм.

(20)

Рис. 2.8. Схема подключение GSM M590 к Arduino Nano.

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

#include <SoftwareSerial.h>

SoftwareSerial m590(8, 7);

String otvetMod = "";

void setup() {

Serial.begin(9600);

m590.begin(115200);

Serial.println("Start!");

sendATCommand("AT", true);

String a = "+79925275058

String strTest = "Сейчас с номером 91";

sendSMSinPDU(a, strTest);

}

void loop() {

if (m590.available()) { otvetMod = waitResponse();

otvetMod.trim();

(21)

}

void sendSMSinPDU(String phone, String message) {

Serial.println("Отправляем сообщение: " + message);

String *ptrphone = &phone;

String *ptrmessage = &message;

String PDUPack;

String *ptrPDUPack = &PDUPack;

int PDUlen = 0;

int *ptrPDUlen = &PDUlen;

getPDUPack(ptrphone, ptrmessage, ptrPDUPack, ptrPDUlen);

Serial.println("PDU-pack: " + PDUPack);

Serial.println("PDU length without SCA:" + (String)PDUlen);

sendATCommand("AT+CMGF=0", true);

sendATCommand("AT+CMGS=" + (String)PDUlen, true);

sendATCommand(PDUPack + (String)((char)26), true);

}

void getPDUPack(String *phone, String *message, String *result, int *PDUlen) {

*result += "01";

*result += "00";

*result += getDAfield(phone, true);

*result += "00";

*result += "08";

String msg = StringToUCS2(*message);

*result += byteToHexString(msg.length() / 2);

*result += msg;

*PDUlen = (*result).length() / 2;

*result = "00" + *result;

}

(22)

String getDAfield(String *phone, bool fullnum) { String result = "";

for (int i = 0; i <= (*phone).length(); i++) { if (isDigit((*phone)[i])) {

result += (*phone)[i];

} }

int phonelen = result.length();

if (phonelen % 2 != 0) result += "F";

for (int i = 0; i < result.length(); i += 2) { char symbol = result[i + 1];

result = result.substring(0, i + 1) + result.substring(i + 2);

result = result.substring(0, i) + (String)symbol + result.substring(i);

}

result = "91" + result;

result = byteToHexString(phonelen) + result;

return result;

}

String sendATCommand(String cmd, bool waiting) { String resp = "";

Serial.println(cmd);

m590.println(cmd);

if (waiting) { resp = waitResponse();

if (resp.startsWith(cmd)) {

resp = resp.substring(resp.indexOf("\r", cmd.length()) + 2);

(23)

String waitResponse() { String resp = "";

long timeout = millis() + 10000;

while (!m590.available() && millis() < timeout) {};

if (m590.available()) { resp = m590.readString();

}

else {

Serial.println("Timeout...");

}

return resp;

}

String UCS2ToString(String s) { String result = "";

unsigned char c[5] = "";

for (int i = 0; i < s.length() - 3; i += 4) {

unsigned long code = (((unsigned int)HexSymbolToChar(s[i])) << 12) + (((unsigned int)HexSymbolToChar(s[i + 1])) << 8) +

(((unsigned int)HexSymbolToChar(s[i + 2])) << 4) + ((unsigned int)HexSymbolToChar(s[i + 3]));

if (code <= 0x7F) { c[0] = (char)code;

c[1] = 0;

} else if (code <= 0x7FF) {

c[0] = (char)(0xC0 | (code >> 6));

c[1] = (char)(0x80 | (code & 0x3F));

c[2] = 0;

} else if (code <= 0xFFFF) {

c[0] = (char)(0xE0 | (code >> 12));

c[1] = (char)(0x80 | ((code >> 6) & 0x3F));

c[2] = (char)(0x80 | (code & 0x3F));

c[3] = 0;

} else if (code <= 0x1FFFFF) { c[0] = (char)(0xE0 | (code >> 18));

c[1] = (char)(0xE0 | ((code >> 12) & 0x3F));

c[2] = (char)(0x80 | ((code >> 6) & 0x3F));

c[3] = (char)(0x80 | (code & 0x3F));

c[4] = 0;

}

result += String((char*)c);

}

(24)

return (result);

}

unsigned char HexSymbolToChar(char c) {

if ((c >= 0x30) && (c <= 0x39)) return (c - 0x30);

else if ((c >= 'A') && (c <= 'F')) return (c - 'A' + 10);

else return (0);

}

String StringToUCS2(String s) {

String output = "";

for (int k = 0; k < s.length(); k++) { byte actualChar = (byte)s[k];

unsigned int charSize = getCharSize(actualChar);

char symbolBytes[charSize + 1];

for (int i = 0; i < charSize; i++) symbolBytes[i] = s[k + i];

symbolBytes[charSize] = '\0';

unsigned int charCode = symbolToUInt(symbolBytes);

if (charCode > 0) {

output += byteToHexString((charCode & 0xFF00) >> 8) + byteToHexString(charCode & 0xFF);

}

k += charSize - 1;

if (output.length() >= 280) break;

}

return output;

}

unsigned int getCharSize(unsigned char b) { if (b < 128) return 1;

(25)

}

unsigned int symbolToUInt(const String& bytes) { unsigned int charSize = bytes.length();

unsigned int result = 0;

if (charSize == 1) { return bytes[0];

} else {

unsigned char actualByte = bytes[0];

result = actualByte & (0xFF >> (charSize + 1));

result = result << (6 * (charSize - 1));

for (int i = 1; i < charSize; i++) { actualByte = bytes[i];

if ((actualByte >> 6) != 2) return 011111

result |= ((actualByte & 0x3F) << (6 * (charSize - 1 - i)));

}

return result;

} }

String byteToHexString(byte i) { String hex = String(i, HEX);

if (hex.length() == 1) hex = "0" + hex;

hex.toUpperCase();

return hex;

}

Весь код для отправления сообщений, условно делится на 2 этапа:

1) Отправка SMS-сообщения на латинице

2) Процесс отправки SMS-сообщений в PDU-формате на языках отличных от латиницы.

(26)

2.1.3.1 SMS-сообщения на латинице

Существует набор команд[6] при помощи которых можно определить состояние/готовность GSM-модуля совершать конкретные действия, а также получить другую полезную информацию диагностического характера. Команды, используемые в данном скетче, представлены в таблице:

Описан

ие Команда Параметр(ы) Структура

ответа Готовн

ость

модуля к работе

AT OK

Выбор формата SMS

AT+CMGF

=<mode>

<mode> — формат сообщений, значения:

0 — PDU-формат (по умолчанию)

1 — текстовый формат

Отправ ить SMS

AT+CMGS

=<da>[,<toda>

]<CR>текст сообщения<ctr

<da> — телефон адресата в международном формате, в

кавычках

<toda> — дополнительный номер (не используется)

<CR> — начало строки, после отправки модуль переходит в

+CMGS:

<n>

(27)

либо <ctrl-Z> для отправки сообщения, Программно, сочетание

клавиш Ctrl+Z можно заменить как (char)26 либо <ESC> для

отмены.

Таблица. 2.6. AT команды.

В ниже приведенном примере, скетч отличается от полной версии отправления сообщений на русском языке, приведенной выше, с цель более наглядного и

подробного изучения функции отправки сообщений.

#include<SoftwareSerial.h>

SoftwareSerial m590(8,7);

void sms_send(String text, String phone){

m590.println("AT+CMGS=\"" + phone + "\"");

delay(500);

m590.print(text);

delay(500);

m590.print((char)26);

delay(500);

}

void setup() {

m590.begin(115200);

m590.println("AT+CMGF=1");

delay(500);

(28)

m590.println("AT+CSCS=\"GSM\

"); delay(500);

Serial.begin(9600);

pinMode(A0,INPUT);

}

void loop() {

int i = analogRead(A0);

Serial.println(i);

if (i>500) { digitalWrite(5,1);

Serial.println("Идет отправка сообщени о тос, что на датчике присутсвует вода");

m590.println("AT+CPAS=0");

delay(500);

sms_send(String("BoDa Ha DaT4IKE"),

String("+79925275058"));

for(int y = 0; i>500; y++){

i = analogRead(A0);

} } }

Как видно, SMS – сообщение пришло именно в том виде, в котором он

(29)

sms_send(String("Вода на датчике"), String("+79925275058"));

сообщение будет пустым.

2.1.3.2 USSD, SMS на русском (PDU)

Для отправки SMS-сообщений на русском языке, необходимо применить специальный формат PDU, к которому необходимо привести сообщение, которое требуется получить на телефоне, на русском языке, а так же конвертировать необходимый текст сообщения в UCS2 строку.

Формирования PDU пакета

Для освоения формирования PDU-пакета[7], требуется понимание его структуры — из каких полей он состоит, и какой длины эти поля могут быть.{ссылка)

Рис. 2.7. Структура PDU-пакета.

Каждое поле имеет свою длину, представленную в байтах. Каждый байт PDU- пакета представляется в шестнадцатеричном виде, т.е. кодируется двумя знаками.

Название поля Длина, байт Описание

SCA (Service Center Addr ess)

1...12 Номер телефона

Центра SMS

PDU Type 1 Тип PDU

MR (Message Reference) 1 Порядковый

номер сообщения DA (Destination Address) 2...12 Номер телефона

(30)

получателя сообщения

PID (Protocol Identifier) 1 Идентификатор

протокола

DCS (Data Coding Scheme) 1 Кодировка

сообщения

VP (Validity Period) 0,1 или 7 Время жизни SMS

UDL (User Data Length) 1 Длина поля

User Data в байтах

UD (User Data) 0...140 Сообщение

Таблица. 2.8. Описание полей PDU-пакета.

Пример формирования PDU-пакета.

Необходимо организовать отправку сообщения: «Вода на датчике», на номер 79925275058.

Поле SCA кодирует номер SMS центра. так как номер SMS-центра (SMSC) по умолчанию зашит в SIM-карте, значение должно быть равно 00.

PDU-type – в нем побитово задаются следующее настройки:

(31)

SCA PDU MR DA PID DCS VP UDL UD

Рис 2.5. Структура DPU-type.

RP (Reply Path) - путь для ответа:

0 — не определен,

1 — определен, используется тот же SMSC (центр отправки SMS).

UDHI (User Data Header Included) - содержит ли поле User Data, помимо сообщения, дополнительный заголовок:

0 — не содержит, 1 — содержит.

SRR (Status Report Request) - запрос статуса сообщения:

0 — не запрашивается, 1— запрашивается.

VPF (Validity Period Format) - формат поля VP (Validity Period, время жизни SMS):

00— поле VP отсутствует, 01— зарезервировано,

10— поле VP содержит временные данные в относительном формате, 11— поле VP содержит временные данные в абсолютном формате.

RD (Reject Duplicates) - правила обращения с дубликатами сообщений (при одинаковых полях MR и DA). Используется в случаях, когда в SMS-центр поступает сообщение с такими же значениями полей MR и DA, что и у предыдущего сообщения:

0— переслать сообщение, 1— отклонить сообщение.

MTI (Message Type Indicator) - тип сообщения:

RP UDHI SRR VPF RD MTI

(32)

00— принимаемое сообщение или подтверждение приема отправленного SMS,

01— отправляемое сообщение или подтверждение отправки SMS, 10— отчет о доставке SMS или SMS-команда (от модуля к SMSC), 11— зарезервировано.

Биты поля PDU-type в случае отправляемого SMS-сообщения:

PDU пакет принимает вид:

MR (MessageReference)

Данный параметр автоматически присваиваемый модулем идентификатор (порядковый номер) сообщения. Значение поля MR принимается равным 00.

PDU пакет принимает вид:

DA (Destination Address)

Специальным образом закодированный номер телефона адресат, состоит из 3 полей:

SCA PDU MR DA PID DCS VP UDL UD

(33)

PL (Phone Length) — в данном параметре указывается количество цифр в данном номере телефона адресата, без знаков типа "+". Н.п. для телефона 79925275058 количество цифр - 11. Значение поля PL в шестнадцатиричном формате должно быть 0B.

PT (Phone Type) — тип номера получателя. В основном используются 2 значения:

91 — международный формат (как в примере +79925275058), 81 — местный формат, либо короткие номера.

RP (Recipient's Phone) — специально обработанный номер адресата.

Необходимо оставить только цифры: +79925275058 → 79925275058. Далее, если количество цифр нечетное, то в конце необходимо добавить букву F:

79925275058 → 79925275058F. Последним этапом, необходимо каждую пару цифр поменять местами: 79925275058F → 972925255750F8

Таким образом поле DA примет вид:

PDU пакет принимает вид:

PID (Protocol Identifier)

Идентификатор протокола. Для задач, определенных данным примерам, поле принимается равным 00:

PDU пакет принимает вид:

(34)

DCS (Data Coding Scheme) — кодировка сообщения[9]. Для отправки сообщений кириллическими символами необходимо использовать кодировку UCS2. Поэтому значение поля DCS в данном примее следует установить равным 08 (обычное SMS) или 18 (flash-SMS, которое сразу выводится на экран телефона вместо сохранения в памяти).

PDU пакет принимает вид:

VP (Validity Period) — время жизни сообщения. Это время, по истечении которого сообщение уничтожается (стирается из памяти SMSC), если не было доставлено адресату. Это поле связано с битами VPF поля PDU Type, из трех существующих вариантов их совместного использования[7], для данного примера это поле не понадобится.

UDL (User Data Length) — длина поля UD в байтах. При использовании кодировки UCS2 значение поля UDL вычисляется следующим образом:

перемножением количества символов в передаваемом сообщении на 2, т.к.каждй символ сообщения (включая пробелы) кодируется двумя байтами. Для сообщения

«Вода на датчике» значение поля UDL равно 1e (30 в десятичной системе счисления).

PDU пакет принимает вид:

UD (User Data) — сообщение. Для того, чтобы сообщение было на русском языке, требуется использовать кодировку UCS2, в данной кодировке каждая буква

(35)

Рис. 2.7. Кодировка UCS2.

Кодировка UCS2 представлена на рис. 2.11. Сообщение «Вода на датчике» в кодировке UCS2 имеет вид:

В 0412 пробел 0020

о 043E д 0434

д 0434 а 0430

а 0430 т 0442

пробел 0020 ч 0447

н 043D и 0438

а 0430 к 043A

е 0435

(36)

Параметр UD:

0412043E043404300020043D0430002004340430044204470438043A0435 PDU пакет принимает вид:

Для отправки SMS - сообщения в формате PDF,установить режим отправки PDU:

AT+CMGF=0;

Далее, необходимо применить команду AT+CMGS=<length>где параметр

<length> - это длина пакета в байтах, не учитывая поле SCA. Т.к. каждый байт кодируется двумя символами, нужно, исключив поле SCA, разделить оставшееся колличество символов пополам. В данном случае <length> = 44.

AT+CMGF=48;

И далее передается PDU – пакет.

Освоив принципы составления программы, для отправления SMS- сообщений, прописываем скетч, представленный в пункте 2.1.3.

Результат работы скетча для отправки SMS-сообщений на русском языке:

(37)

2.1.4 Итоговый скетч

В итоговом коде, объединив все вышеприведенные скетчи (определение наличия воды, звуковое оповещение, отаправка SMS- сообщений), необходимо добавить дополнительные условия, исходя из идеи полноценной работы устройства.

Да

Нет Да

Нет Да

Нет Да

Блок схема

На датчике есть вода?

Требуется звук.оповещ.?

Воспроизвести запись Отправить

сообщение на номер №1

Отправить сообщение на номер №1

Отправить сообщение на номер №2

Все еще есть вода на датчике?

(38)

Физическое исполнение выбора, между звуковым оповещением и отправление SMS – сообщения, осуществляется путем перевода «Кнопки №1» в положение №1 или №2 ( логический 0 и 1).

Физическое исполнение выбора, между номерами телефона (номер №1 и

№2), осуществляется путем перевода «Кнопки №2» в положение №1 или №2 (логический 0 и 1).

Выбор между звуковым оповещением и отправление SMS присутствует для того, чтобы исключить возможность отправки SMS-сообщения, если человек находится на расстоянии, при котором отчетливо улавливается звуковое сообщение, а так же спящему ребенку, выставленный уровень громкости, не помешает.

Выбор отправки SMS-сообщения на один из двух номеров, обусловлен уменьшением затрат на отправление SMS-сообщения.

Итоговый скетч:

#include <SoftwareSerial.h>

SoftwareSerial m590(8, 7);

String otvetMod = "";

void setup(){

Serial.begin(9600);

m590.begin(115200);

Serial.println("Start!");

sendATCommand("AT", true);

String strTest = ―Вода на датчике";

(39)

pinMode(11, OUTPUT);

}

void Hachalo() {

if (m590.available()) { otvetMod = waitResponse();

otvetMod.trim();

Serial.println(otvetMod);

}

if (Serial.available()) { m590.write(Serial.read());

} }

void loop() {

if (digitalRead(10) == 0){

Serial.println("Кнопка нажата");

}else{

Serial.println("NOT");

}

int i = analogRead(A0);

if(i>500 && digitalRead(12) == 0){

digitalWrite(11,1);

Serial.println("Через динамик");

digitalWrite(11,0);

for(int y = 0; i>500; y++){

i = analogRead(A0);

Serial.println(i);

} }

(40)

if (i>500 && digitalRead(10) == 1 ) { digitalWrite(5,1);

Serial.println("Для получателя №1");

String st = "Вода на датчике";

sendSMSinPDU("+79925275058", st);

for(int y = 0; i>500; y++){

i = analogRead(A0);

Serial.println(i);

} }

if (i>500 && digitalRead(10) == 0) { digitalWrite(5,1);

Serial.println("Для получателя № 2");

String st ="Вода на датчике";

sendSMSinPDU("+79823418606", st);

for(int y = 0; i>500; y++){

i = analogRead(A0);

Serial.println(i);

} } }

void sendSMSinPDU(String phone, String message) {

Serial.println("Отправляем сообщение: " + message);

String *ptrphone = &phone;

(41)

int *ptrPDUlen = &PDUlen;

getPDUPack(ptrphone, ptrmessage, ptrPDUPack, ptrPDUlen);

Serial.println("PDU-pack: " + PDUPack);

Serial.println("PDU length without SCA:" + (String)PDUlen);

sendATCommand("AT+CMGF=0", true);

sendATCommand("AT+CMGS=" + (String)PDUlen, true);

sendATCommand(PDUPack + (String)((char)26), true);

}

void getPDUPack(String *phone, String *message, String *result, int *PDUlen) {

*result += "01";

*result += "00";

*result += getDAfield(phone, true);

*result += "00";

*result += "08";

String msg = StringToUCS2(*message);

*result += byteToHexString(msg.length() / 2);

*result += msg;

*PDUlen = (*result).length() / 2;

*result = "00" + *result;

}

String getDAfield(String *phone, bool fullnum) { String result = "";

for (int i = 0; i <= (*phone).length(); i++) { if (isDigit((*phone)[i])) {

result += (*phone)[i];

} }

int phonelen = result.length();

(42)

if (phonelen % 2 != 0) result += "F";

for (int i = 0; i < result.length(); i += 2) { char symbol = result[i + 1];

result = result.substring(0, i + 1) + result.substring(i + 2);

result = result.substring(0, i) + (String)symbol + result.substring(i);

}

result = "91" + result;

result = byteToHexString(phonelen) + result;

return result;

}

String sendATCommand(String cmd, bool waiting) { String resp = "";

Serial.println(cmd);

m590.println(cmd);

if (waiting) {

resp = waitResponse();

if (resp.startsWith(cmd)) {

resp = resp.substring(resp.indexOf("\r", cmd.length()) + 2);

}

Serial.println(resp);

}

return resp;

}

String waitResponse() { String resp = "";

(43)

}

else {

Serial.println("Timeout...");

}

return resp;

}

String UCS2ToString(String s) { String result = "";

unsigned char c[5] = "";

for (int i = 0; i < s.length() - 3; i += 4) {

unsigned long code = (((unsigned int)HexSymbolToChar(s[i])) << 12) + (((unsigned int)HexSymbolToChar(s[i + 1])) << 8) +

(((unsigned int)HexSymbolToChar(s[i + 2])) << 4) + ((unsigned int)HexSymbolToChar(s[i + 3]));

if (code <= 0x7F) { c[0] = (char)code;

c[1] = 0;

} else if (code <= 0x7FF) {

c[0] = (char)(0xC0 | (code >> 6));

c[1] = (char)(0x80 | (code & 0x3F));

c[2] = 0;

} else if (code <= 0xFFFF) {

c[0] = (char)(0xE0 | (code >> 12));

c[1] = (char)(0x80 | ((code >> 6) & 0x3F));

c[2] = (char)(0x80 | (code & 0x3F));

c[3] = 0;

} else if (code <= 0x1FFFFF) { c[0] = (char)(0xE0 | (code >> 18));

c[1] = (char)(0xE0 | ((code >> 12) & 0x3F));

(44)

c[2] = (char)(0x80 | ((code >> 6) & 0x3F));

c[3] = (char)(0x80 | (code & 0x3F));

c[4] = 0;

}

result += String((char*)c);

}

return (result);

}

unsigned char HexSymbolToChar(char c) {

if ((c >= 0x30) && (c <= 0x39)) return (c - 0x30);

else if ((c >= 'A') && (c <= 'F')) return (c - 'A' + 10);

else return (0);

}

String StringToUCS2(String s) {

String output = "";

for (int k = 0; k < s.length(); k++) { byte actualChar = (byte)s[k];

// Получаем первый байт

unsigned int charSize = getCharSize(actualChar);

char symbolBytes[charSize + 1];

for (int i = 0; i < charSize; i++) symbolBytes[i] = s[k + i];

symbolBytes[charSize] = '\0';

(45)

byteToHexString(charCode & 0xFF);

}

k += charSize - 1;

if (output.length() >= 280) break;

}

return output;

}

unsigned int getCharSize(unsigned char b) { if (b < 128) return 1;

for (int i = 1; i <= 7; i++) {

if (((b << i) & 0xFF) >> 7 == 0) { return i;

} }

return 1;

}

unsigned int symbolToUInt(const String& bytes) { unsigned int charSize = bytes.length();

unsigned int result = 0;

if (charSize == 1) { return bytes[0];

} else {

unsigned char actualByte = bytes[0];

result = actualByte & (0xFF >> (charSize + 1));

result = result << (6 * (charSize - 1));

for (int i = 1; i < charSize; i++) { actualByte = bytes[i];

(46)

if ((actualByte >> 6) != 2) return 0;

result |= ((actualByte & 0x3F) << (6 * (charSize - 1 - i)));

}

return result;

} }

String byteToHexString(byte i) { String hex = String(i, HEX);

if (hex.length() == 1) hex = "0" + hex;

hex.toUpperCase();

return hex;

}

(47)

2.2 Функциональность

В ходе выполненной работы, было разработано устройство версии № 1, имеющее следующие функции:

1. Позволяет людям, не имеющим возможность с необходимой частотой проверять состояние спящего ребенка, на акт дефекации и акт

деуринации, мгновенно получить извещение, в виде SMS-cобщения, либо голосового оповещения.

2. Позволяет установить способ оповещения: либо голосовое оповещение, либо SMS оповещение.

3. Позволяет записать проигрываемое голосовое сообщение, используя микрофон звукозаписывающего модуля.

4. Позволяет записать проигрываемое голосовое сообщение, используя микрофон звукозаписывающего модуля.

5. Позволяет информировать методом отправки SMS – сообщения на выбор, по двум сохраненным номерам.

6. Для улучшения коммуникации, оправка SMS – сообщений осуществляется на русском языке.

Данная версия, для того, чтобы установить номера адресатов и текст отправляемого SMS – сообщения, требует изменений кода, непосредственно пользователем.

Будущие версии устройства, буду обладать следующими модификациями:

1. Программирование устройства (установку номеров адресатов, текст отправляемого SMS-сообщения, запись и установку голосового оповещения, вида оповещения, состояние баланса на SIM карте) полностью через SMS-сообщения, путем регулировки требуемых параметров текстовым методом.

(48)

2. Программирование устройства (установку номеров адресатов, текст отправляемого SMS-сообщения, запись и установку голосового оповещения, вида оповещения, состояние баланса на SIM карте) при помощи DTMF-сигналов.

3. Возможность переноса модуля голосового оповещения.

(49)

ЗАКЛЮЧЕНИЕ

В данной работе было смоделировано, собрано и протестировано устройство, позволяющее контролировать сон новорожденного ребенка.

 Был проведен анализ научных статей, в которых описывались принцип работы микроконтроллеров, аппаратоно-програмной платформы Arduino, модулей, используемых в данной работе, а так же работ, посвященных кодированию и декодированию данных.

 Бала создана модель на базе Arduino.

 Был разработан алгоритм работы устройства.

 Был создан скетч и собрано готовое устройство.

 Устройство было проанализировано на недостатки.

 Были определенны необходимые модификации устройства.

(50)

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. 8-bit AVR Microcontrollers ATmega328: Datasheet // Atmel Corporation.

– 2016. – С. 404.

2. Улли Соммер. Программирование микроконтроллерных плат Arduino/Freeduino. – СПб.: БХВПетербург, 2012. – С.16.

3. LM1117/LM1117I 800mA Low-Dropout Linear Regulator // National Semiconductor. – 2006 – С.21.

4. Neo M590E V1 GPRS Module Hardware User Guide // Neoway Technology Co. – 2015.-C.26.

5. General description | ISD1800 series//Nuvoton. – 2008. – C.26.

6. M590 AT COMMAND SETS V3.0// Shenzhen Neoway Technology Co–

2008. – C.70.

7. Андрей Анисимов.Отправка SMS на русском языке с помощью GSM- модулей Neoway// БЕСПРОВОДНЫЕ ТЕХНОЛОГИИ. – 2014 – №3. – C. – 3.

8. ETSI GSM Technical Specification GSM 03.40

Referências

Documentos relacionados

По результатам исследова- ния структуры на базе GaAs показана принципиальная возможность использовать p−n-переходы на базе GaAs как для развития физики локальных термоэдс, так и для