Вы находитесь на странице: 1из 122

СОДЕРЖАНИЕ

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

1 АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРЫ............................................. 8

1.1 Протокол связи LoRaWAN ................................................................... 9

1.2 Архитектура LoRaWAN ....................................................................... 9


1.3 Радиоинтерфейс LoRa......................................................................... 10

1.4 Синхронизация приемника и передатчика ......................................... 14

1.5 Характеристики радиоинтерфейса LoRa ............................................ 15

1.6 Физический уровень (PHY Layer)....................................................... 17

1.7 Классы устройств LoRa ...................................................................... 19

1.8 Детектирование CSS сигналы ............................................................. 20

1.9 Рассмотрение других технологий беспроводной сети ........................ 21


2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ...................................................................... 24

2.1 Модуляция LoRa................................................................................. 24

2.2 Расширение спектра методом линейной частотной модуляции (CSS)26

2.3 Демодуляция LoRa ............................................................................. 27

2.4 Распространение радиоволн в пространстве ...................................... 29

2.5 Чувствительность приемника ............................................................. 30

2.6 Потери распространения радиоволн в пространстве.......................... 31

2.7 Энергетический потенциал линии связи на основе технологии LoRa 33


2.8 Зона Френеля ...................................................................................... 35

НГТУ.434851.001 ПЗ
Изм Лист № докум Подпись Дата
.
Разраб Эрнандес Литера Лист Листов
Пров Радченко Разработка системы связи на 5 124
основе технологии LoRa.
Н. Контр. Богомолов Пояснительная записка
Утв Синельников
2.9 Масштабируемость lorawan сети ........................................................ 36

3 ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ ........................................................... 38

3.1 Разработка принципиальной схемы .................................................... 39

3.1.1 Принципиальная схема передатчика ............................................ 39

3.1.2 Принципиальная схема приемника ............................................... 40


3.2 Разработка программы приемо-передатчика ...................................... 40

3.2.1 Листинг - программа на приемнике LoRa..................................... 40

3.2.2 Листинг - программа на передатчике LoRa .................................. 41

3.3 Соединение между модулем LoRa и контроллером STM32 (SPI) ...... 41

3.4 Измерение мощности сигнала на приемнике (RSSI) .......................... 42

3.5 Прототип устройства приёма-передачи.............................................. 43

4 ЭКОНОМИЧЕСКАЯ ЧАСТЬ ................................................................... 49

4.1 Оплата труда ....................................................................................... 49


4.2 Материальные расходы ...................................................................... 52

5 РАЗДЕЛ ОХРАНЫ ТРУДА ...................................................................... 55

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

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ.............................................. 60

ПРИЛОЖЕНИЯ .............................................................................................. 61

Лист
НГТУ.434851.001 ПЗ 6
Изм. Лист № документа Подпись Дата
ВВЕДЕНИЕ

На современном этапе развития технология беспроводных сетей заявляют


про концепцию Интернета вещей (IoT – Internet of Things), на которой находится
передача информации между различными устройствами, то есть умными
аппаратами. Так как передача информации, понимается как физический процесс,
которого осуществляется перемещение сообщений из источника информации
(передатчик) по каналу связи до получателя сообщения (приемник), вследствие
этого разработчики уделяют много внимания именно этому вопросу. В области
системы связи существуют множества различных технологий, например,
современная мобильная связь LTE, последнее поколение мобильных сетей 5G, Wi-
Fi и т.д. На основе этого можно построить беспроводную связь, но с другой
стороны эти варианты не удовлетворяет требования к максимальным автономным
устройствам, расположенным далеко от базовой станции и малым затратам
энергии. Решение на этом недостатке применяется использование перспективной
технологии модуляции LoRa и сетевой протокол связи LoRaWAN, которая
обеспечивает передачи данных на высокой эффективности, дальности связи,
помехоустойчивость, в том числе действует связи в нелицензируемых частотах.

Лист
НГТУ.434851.001 ПЗ 7
Изм. Лист № документа Подпись Дата
1 АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРЫ
LoRa (Long Range – связь дальнего радиуса действия) – это технология
беспроводной сети, действующей на физическом уровне предложенной модели
OSI. Технология LoRa можно сопоставить со известным стандартом IEEE 802.11
(используется технология Wi-Fi на физическом уровне), которая обеспечивает
беспроводную связь межу различными устройствами, таких как смартфон, роутер,
ноутбук и т.д.
Интересные особенности технологии LoRa представляет собой высокая
энергопотребление и хорошая дальность связи, благодаря ее низкой пропускной
способности, и при этом LoRa может передавать небольшой объем данных, способ
которого имеет применение на автономных устройствах, к примеру датчики
(температуры, влажности, давления, радиоактивности и т.д.). LoRa может
обеспечить срок работы 2 или 3 года с простой батарейки AA, расположенная
далеко от базовой станции для сбора данных.
Устройства LoRa, работающие в нелицензируемых частотах согласно
международному правилу для диапазона частот ISM (от Англ. Industrial, Scientific
and Medical – индустриальные, научные и медицинские), то есть для использования
некоммерческих целей, являющихся открытым без лицензии (самая популярная
сеть на данный момент- беспроводные Wi-Fi и Bluetooth). Данная технология
предполагает настройку диапазона частот, зависящая от расположения стран и их
правил на частоте 433 МГц (Азия), 868 МГц (Европа, Индия) и 915 МГц (США,
Канада, Австралия). Подобное разрешение без присутствия государственных
органов пользователи получают беспроводную сеть Wi-Fi, которое позволяет
каждому ее установить, работающие на частоте 2.45 ГГц или 5 ГГц.
Беспроводные сети, использующие нелицензируемые частоты, имеются
ограничения по максимальной мощности излучаемого сигнала и на пропускную
способность (ширину полосы пропускания) и также имеются ограничения по
времени для использования каналов (от англ. Duty-cycle – нагрузочный цикл). К
примеру, в Европе применяется ISM диапазон на частоте 868 МГц, при котором

Лист
НГТУ.434851.001 ПЗ 8
Изм. Лист № документа Подпись Дата
присутствует ограничение на нагрузочный цикл, зависящее от используемого
канала, иными словами, каждое устройство (модуль) LoRa может вещать в эфире
согласно местному правилу не более 3.6 (0.1%) или 36 (1%) секунд за час.

Благодаря алгоритму разработан на основе линейно-частотной модуляции,


LoRa может передавать на большие расстояния. Для европейского варианта ISM на
частоте 868 МГц, его энергетический потенциал линии связи (Link budget) равный
156 дБ, и поэтому обладает хорошую дальность, также может проникнуть здания и
распространять радиоволн на несколько сотых метров на уровне городской среды.

1.1 Протокол связи LoRaWAN


LoRaWAN (от англ. Long Range Wide Area Network) – это протокол,
являющийся архитектурой и протоколом связи канально-сетевого уровня. Она
использует модуляцию LoRa на основе линейной частотной модуляции. Подобные
протокол LoRaWAN можно сравнить с протоколом интернета IP. На этом
протоколе существует адресация, стандартизированное общение между всеми вида
устройств и топология сети.

Стандарт LoRaWAN назначает скорости передачи данных, которые


предполагают настройку данного протокола. например, скорость варьируют от
300bps до 5,5Kbps. И также имеются два относительно высокоскоростных каналов
со скоростями 11Kbps и 50Kbps, но они работают на технологии модуляции FSK
(от англ. Frequency Shift Keying – частотная модуляция).
Технология протокола LoRaWAN может поддерживать надежную
двухстороннюю связь и мобильных конечных устройств.

1.2 Архитектура LoRaWAN


Сеть LoRaWAN состоит из следующих элементов: конечное устройство,
шлюзы, сетевой сервер и сервер приложений.
Конечное устройство - предназначено для осуществления управляющих или
измерительных функций. Содержит набор необходимых датчиков и управляющих
элементов.
Лист
НГТУ.434851.001 ПЗ 9
Изм. Лист № документа Подпись Дата
Шлюз – устройство, принимающее данные от конечных устройств с
помощью радиоканала и передающее их в транзитную сеть. В качестве транзитной
сети могут выступать сеть Ethernet, WiFi или сети подвижной радиотелефонной
связи. Шлюз и конечные устройства образуют сетевую топологию типа звезда.
Обычно данное устройство содержит многоканальные приёмопередатчики для
обработки сигналов в нескольких каналах одновременно или даже, нескольких
сигналов в одном канале. Соответственно, несколько таких устройств
обеспечивает зону радиопокрытия сети и прозрачную двунаправленную передачу
данных между конечными устройствами и сервером.
Сетевой сервер - предназначен для управления сетью: заданием
расписания, адаптацией скорости, хранением и обработкой принимаемых данных.
Сервер приложений - может удаленно контролировать работу конечных
устройств и собирать необходимые данные с них. В конечном итоге, LoRaWAN
сеть имеет топологию звезда из звёзд, имеет конечные устройства, которые через
шлюзы, образующие прозрачные мосты, общаются с центральным сервером сети.
При таком подходе обычно предполагается, что шлюзами и центральным сервером
владеет оператор сети, а конечными устройствами – абоненты. Абоненты имеют
возможность прозрачной двунаправленной и защищенной передачи данных до
конечных устройств.

1.3 Радиоинтерфейс LoRa


Физический радиоинтерфейс LoRa основан на использовании
широкополосных радиосигналов с большой базой B, много большей единицы.
Данный вид радиосигналов имеет две главные особенности:

• ширина спектра радиосигнала BW значительно больше скорости передачи


данных R b (BW >> Rb);
• корреляционная функция существенно уже корреляционной функции
узкополосного радиосигнала с базой B ~1.

Лист
НГТУ.434851.001 ПЗ 10
Изм. Лист № документа Подпись Дата
Частотная избыточность широкополосного радиосигнала обуславливает его
высокую помехоустойчивость, а узкая корреляционная функция – высокую
точность временной синхронизации.
Широкополосный радиосигнал LoRa представляет собой сигнал с линейной
частотной модуляцией (ЛЧМ) или CSS (Chirp Spread Spectrum). Частота CSS
радиосигнала может как увеличиваться (up-chirp), так и уменьшаться (down-chirp).
Математически ЛЧМ сигнал представляется в виде выражения (1):

(1)

и описывается следующими параметрами:

BW – ширина спектра радиосигнала;

– центральная (несущая) частота радиосигнала;

– нижняя частота радиосигнала;

– верхняя частота радиосигнала;

SF – коэффициент расширения спектра (изменяется в диапазоне от 7 до 12);


Tsym = 2SF/BW – длительность радиосигнала;

– скорость изменения частоты радиосигнала;

B = BW•Tsym = 2SF – база радиосигнала.

Здесь коэффициент расширения спектра (SF) определяет разрядность


символа данных (в битах), передаваемого через радиоинтерфейс за время Tsym.

На рисунке 1 приведен вид ЛЧМ сигнала во временной области, а на


рисунке 2 и рисунке 3 показан его спектр с BW=125кГц и базой равной 128 (SF=7)
и 4096 (SF=12) соответственно.

Лист
НГТУ.434851.001 ПЗ 11
Изм. Лист № документа Подпись Дата
Рисунок 1 – Линейная частотная модуляция сигнала во временной области

Рисунок 2 – Спектр ЛЧМ сигнала при базе равной 128 (SF=7)

Лист
НГТУ.434851.001 ПЗ 12
Изм. Лист № документа Подпись Дата
Рисунок 3 – Спектр ЛЧМ сигнала при базе равной 4096 (SF=12)

Передатчики LoRa формируют CSS радиосигналы с шириной спектра (BW)


125, 250 или 500 кГц (однако проект регионального частотного диапазона для
Российской Федерации, подразумевает использование только полосы 125кГц). При
фиксированной ширине спектра радиосигнала BW изменение его базы
осуществляется за счет изменения длительности Tsym и скорости изменения
частоты (Рисунок 4).

Рисунок 4 – Изменение частоты ЛЧМ сигнала по разным видам SF во временной


области

Лист
НГТУ.434851.001 ПЗ 13
Изм. Лист № документа Подпись Дата
1.4 Синхронизация приемника и передатчика
Для успешного функционирования любой системы обмена информацией
необходима взаимная синхронизация приемника и передатчика, позволяющая
определить временные границы приема-передачи как целого блока данных (или
кадра), так и единичных символов.
Технология LoRa использует асинхронный режим приема-передачи, при котором
передатчик может начать генерацию радиосигнала в любой момент времени. В
этом случае требуется механизм, обеспечивающий синхронизацию приемника по
сигналу от передатчика (аналог "старт-бита" протокола RS232). В качестве такого
механизма используется преамбула, предшествующая каждому сеансу связи.
Преамбула включает в себя последовательность символов, позволяющих
приемнику обнаружить активность передатчика, определить используемый
передатчиком коэффициент расширения спектра (SF) и выполнить символьную
синхронизацию. Длительность преамбулы является конфигурируемой величиной
и должна быть не менее, чем T1+2•T2, где T1 определяет максимальное время
нахождения приемника в состоянии "сна" (Sleep), T2 – определяет время поиска
приемником преамбулы (Рисунок 5).

Рисунок 5 – Диаграмма обнаружения приименного сигнала используя преамбула

Лист
НГТУ.434851.001 ПЗ 14
Изм. Лист № документа Подпись Дата
По завершении преамбулы следует слово синхронизации (Sync Word) и
блок данных физического уровня. Длина слова синхронизации настраивается в
диапазоне от 1 до 8 байт. Спецификацией LoRa определен ряд специфических
значений Sync Word – 0x34 для публичных сетей (public networks), 0x12 – для
частных сетей (private networks) и 0xC194C1 – для каналов с FSK модуляцией.
На рисунке 6 приведена общая структура кадра, обеспечивающего передачу одного
блока данных.

Рисунок 6 – Общая структура кадра, обеспечивающего передачу одного блока


данных
1.5 Характеристики радиоинтерфейса LoRa
В заключение отметим основные характеристики радиоинтерфейса LoRа:
Сводные данные по различным региональным частотным диапазонам (таблица 1).
Данные по скорости передачи информации, рассчитанной по формуле
Rb=SF•BW/2SF, для различных скоростей кодирования (таблица 2).

Лист
НГТУ.434851.001 ПЗ 15
Изм. Лист № документа Подпись Дата
Таблица 1 – Региональные частотные диапазоны

Таблица 2 – Скорости передачи информации для разных скоростей кодирования

Лист
НГТУ.434851.001 ПЗ 16
Изм. Лист № документа Подпись Дата
1.6 Физический уровень (PHY Layer)
На физическом уровне обеспечивается негарантированная передача блоков
данных между конечным устройством (End Node) и шлюзом LoRa (Gateway).
На стороне передающего устройства выполняется:
- прием блока данных от MAC уровня (PHYPayload);
- формирование физического заголовка пакета (PHDR + PHDR_CRC);
- кодирование физического заголовка пакета (PHDR + PHDR_CRC) с
фиксированной скоростью 4/8;
- вычисление контрольной суммы блока полезных данных PHYPayload (CRC);
- кодирование блока полезных данных (PHYPayload + CRC) с
предустановленной скоростью CR;
- передача по радиоканалу преамбулы;
- модуляция и передача по радиоканалу физического блока данных.
На стороне приемного устройства выполняется:
- обнаружение преамбулы и определение начала физического блока данных;
- демодуляция сигнала;
- декодирование физического заголовка пакета (PHDR + PHDR_CRC) и проверка
его контрольной суммы;
- декодирование блока полезных данных (PHYPayload + CRC) и проверка его
контрольной суммы;
- подтверждение принятых данных (для соответствующих типов сообщений);
- передача данных на MAC уровень.
На рисунке 7 ниже приведены форматы физических блоков данных нисходящего
(DL) и восходящего (UL) каналов:

Лист
НГТУ.434851.001 ПЗ 17
Изм. Лист № документа Подпись Дата
Рисунок 7 – форматы физических блоков данных нисходящего (DL) и
восходящего (UL) каналов

Здесь:

1. Preamble – преамбула, используемая для синхронизации приемника с


входящим потоком и определения, начала физического блока данных. Длина
преамбулы для чипа Semtech SX1272 является программируемой.
2. PHDR – физический заголовок пакета. Присутствует только при
использовании явного режима (explicit mode) и содержит:
- длину полезной нагрузки в байтах;
- скорость кодирования;
- наличие в физическом блоке данных опционального поля CRC.
При использовании неявного режима (implicit mode) физический заголовок пакета
не передается и устройства работают с предустановленными параметрами.
3. PHDR_CRC – контрольная сумма поля PHDR.
4. PHYPayload – полезная нагрузка (блок данных, полученный от уровня MAC /
передаваемый на уровень MAC).
5. CRC – контрольная сумма поля PHYPayload (опциональное поле).
При этом заголовок PHDR кодируется избыточным кодом с фиксированной
скоростью 4/8; полезная нагрузка – с программируемой скоростью.

Лист
НГТУ.434851.001 ПЗ 18
Изм. Лист № документа Подпись Дата
1.7 Классы устройств LoRa
Класс А

Конечные устройства выполняют двунаправленный обмен, где вызов связи


инициализирует сам конечным устройством. Затем после передачи выделяются два
коротких временных окна на приеме.

На рисунке 8 Смотрим интервалы времени после передачи появляются


первые и вторые временные окна. Эти параметры можно настроить, но при этом
все устройства должны быть настроены одинаково (то есть в сети
RECEIVE_DELAY1, RECEIVE_DELAY2). В Европе обычно используют диапазон
частот 868 МГц, при котором рекомендуется настроить значение
RECEIVE_DELAY1 на 1 секунду, а значение RECEIVE_DELAY2 на
(RECEIVE_DELAY1 + 1) секунда.

Рисунок 8 – Метод передачи класса А

На интервалах RX1 и RX2 могут отличаться по частотным каналам и по


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

Лист
НГТУ.434851.001 ПЗ 19
Изм. Лист № документа Подпись Дата
Класс В

На этом классе добавляют дополнительные окна приема согласно


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

Класс C

На этом классе имеется окна приема открыто в постоянном режиме, но,


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

За этим исключением RX1 оконечное устройство применяет RX2:

Рисунок 9 – Метод передачи класса С

1.8 Детектирование CSS сигналы


Процедура детектора преамбулы, на основание чего она использует
согласованный фильтр (СФ), то есть можно представить математическим методом,
как импульсная характеристика, которая является комплексной сопряженной с CSS
сигналом в частотной области, и имеет свойство зеркального отображения во
времени. Выражение (2) выглядит таким образом:

(2)

Лист
НГТУ.434851.001 ПЗ 20
Изм. Лист № документа Подпись Дата
Передачи символов блока данных физического уровня широкополосного
радиосигнала происходит путем частотного смещения относительно
опорного линейной частотной модуляции сигнал .
Информационный символ k имеет диапазон k=0,1, 2,…,2SF, размерностью SF бит.
Это соотношение (3) можно записать так:

(3)

Такое явление представляет собой изменение нижней и верхней частоты в


зависимости от времени, на Рисунке 10 будет рассматриваться так:

Рисунок 10 – Представление модуляции LoRa, изменяя нижнюю и верхнюю


частоту от времени

1.9 Рассмотрение других технологий беспроводной сети


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

Лист
НГТУ.434851.001 ПЗ 21
Изм. Лист № документа Подпись Дата
Рисунок 11 – Совокупность беспроводных сетей, сравнивая с технологии LoRa

В классификации можно располагать устройства малой дальности и малой


пропускной способности, таких технологий как RFID (Radio Frequency
IDentification) и NFC (Near Field Communication). Эти вид технологии
представляют собой некое устройство, работающее на очень малых расстояниях, и
они могут передать минимальное количество данных. Применение этой
технологии очень широко, и ее можно увидеть, как способ для оплаты,
идентификацию на какое-либо помещение (вход в Новосибирский Метрополитен).
В следующей классификации имеется технология Bluetooth и его
улучшенный вариант BTLE (от Англ. Bluetooth Low Energy – Bluetooth с низким
потреблением энергии), которые очень популярны на сегодняшний день. Они
имеют небольшую дальность, рассчитанную до 10 метров, являющуюся
устройством класса А и их пропускной способности достигают до 1 Мбит/с по
сравнению с предыдущей технологией сказана выше.
Поднимая по шкале пропускной способности, располагается технология
Wi-Fi, которая имеют справедливую пропускную способность, не имеющая
приличную дальность за счет низкий выходной мощности передатчика.
Ниже по шкале располагается технология LoRa, SigFox (на подобие
технологии LoRa) и UNB технологии (от Англ. Ultra Narrow Band – сверх узкой
полосы пропускания), которые достигают до большой дальности примерно
несколько десятков километров на счет малой пропускной способности.
Лист
НГТУ.434851.001 ПЗ 22
Изм. Лист № документа Подпись Дата
На сегодняшний день существуют технологии, которые могут предоставить
некий баланс по трем свойствам, таких как дальность, низкое энергопотребление и
высокая пропускная способность.
Мобильные сети достигают дальность и скорость передачи, однако их
энергопотребление велико. Тем времени технология LoRa имеет справедливую
дальность и малое энергопотребление за счет ее малая пропускная способность.

Лист
НГТУ.434851.001 ПЗ 23
Изм. Лист № документа Подпись Дата
2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
2.1 Модуляция LoRa
Метод модуляции LoRa является методом расширения спектра, который
работает на основе линейной частотной модуляции (от англ. chirp spread spectrum,
CSS), в беспроводных сетях LPWAN и его открытый протокол LoRaWAN.
Линейная частотная модуляции – это тип модуляции по частоте, у которого частота
несущего сигнала изменяется по линейному закону. следовательно, эта модуляция
является частным случаем систем связи с расширением спектра где применяет
способ для повышения эффективности передачи информации при помощи
модулированных сигналов по каналу связи с сильными линейными искажениями
(замираниями), который приводит к увеличению базы сигнала.

Для понимания такого события, используется математическую запись


ЛЧМ-сигнала в виде следующего уравнения (4):

(4)

Если подать входной сигнал на частотно-зависимую линию задержки, время


которой очень велико на малых частотах и уменьшается соответственно
нарастанию частоты в ЛЧМ-сигнале, то тогда на выходе такой линии сжимается
сигнал в один период высокочастотного колебания посредством суммирования
амплитудных значений всех периодов сигнала. К тому же происхождение
увеличивается амплитуды выходного сигнала и уменьшается статистические
шумы, поскольку суммируемые совместно по этим же периодам шумы не
коррелированы. И поэтому подобные свойства, содержащие ЛЧМ-сигнал
предполагает высокие уровни чувствительности на приемнике примерно 148 dbm.
И при этом конструкция приемник и передатчик упрощается наибольше с низким
потреблением энергии приемо-передатчика LoRa.

Лист
НГТУ.434851.001 ПЗ 24
Изм. Лист № документа Подпись Дата
а) б) в)

Рисунок 12 – Виды модуляции. а) On-Off keying, б) Binary frequency-shift keying,


в) LoRa

На рисунке 12 а) имеется самый простой вид модуляции – On-Off Keying


(модуляция вида включение-выключение). Когда надо передать «1» излучается
сигнал на определенной частоте, а отсутствие сигнала означает «0». Данный вид
модуляции применяют достаточно редко ввиду его неэффективности.

На рисунке 12 б) показан пример BFSK (Binary Frequency Shift Keying –


бинарная частотная модуляция). Имеются две частоты, между которыми
передатчик постоянно переходит, тем самым передавая необходимую
информацию. Можно условно назвать эти две частоты «частота 0» и «частота 1».
Тогда, при нахождении сигнала в «частоте 0» передается двоичный ноль, а сигнал
в «частоте 1» означает передачу двоичной единицы. Причем переход между этими
двумя частотами не мгновенный, что делает данную модуляция надежнее простого
использования двух частот в режиме On-Off Keying.

Изображение на рисунке 12 в) существенно отличается от двух других


изображений. Это модуляция CSS (Chirp Spread Spectrum), которая используется в
Лист
НГТУ.434851.001 ПЗ 25
Изм. Лист № документа Подпись Дата
LoRa. Она состоит из так называемых «чэрпов» (англ. chirp /tʃəːp/ (чэрп) – щебет),
которые, подобно FSK, меняют частоту со временем. Из рисунка 12 в) видно, что
частота в начальной части (ближе к вверху) увеличивается линейным образом
(ЛЧМ – линейно-частотная модуляция), начиная с одной частоты и, дойдя до
некоторой второй частоты, начинает последовательность заново. Если провести
аналогию со звуком, то данное увеличение частоты звучало бы подобно сирене.

В модуляции LoRa видно, что изначально идет некоторое число


одинаковых, возрастающих, линейных чэрпов (их роль - синхронизация с
приемником), затем еще два, но уже убывающих (завершение синхронизации), а
затем начинаются «прыжки» (сдвиги) в этой последовательности. Именно в этих
«прыжках» и находятся данные, передаваемые технологией LoRa. Каждый
«прыжок» представляет собой сдвиг в передаваемой последовательности. Этот
сдвиг виден, как мгновенное изменение частоты с последующем продолжением
последовательности уже с этой новой частоты, или, другими словами, с этой новой
позиции в цикле.
Сама последовательность остается неизменной - просто постоянно
меняется точка, с которой она продолжается. Существуют предположения, что
отсюда и взялось название чэпр, так как эти различные «прыжки» в однотипной
последовательности подобно щебетанию птиц. Так же существует предположение
о выборе такого названия ввиду того, что сигнал LoRa можно демодулировать под
уровнем шума, подобно как птицы могут слышать щебетание подобных им птиц,
даже при достаточно шумной окружающей среды.

2.2 Расширение спектра методом линейной частотной модуляции


(CSS)

Это тип модуляции, из которого присутствует частоту несущего сигнала,


изменяющуюся по линейному закону. Ниже на рисунке 13 изображен модель
ЛЧМ-сигнала.

Лист
НГТУ.434851.001 ПЗ 26
Изм. Лист № документа Подпись Дата
Рисунок 13 – Пример графика ЛЧМ-сигнала (CSS)

2.3 Демодуляция LoRa


Процесс демодулирования сигнала LoRa поможет объяснить рисунок 14.

Рисунок 14 – Демодуляция LoRa


Слева имеется принятый приемником LoRa сигнал (синий) со своими
линейными и сдвинутыми чэрпами. В середине имеется инверсный сигнал (inverse
chirp), который генерируется приемником во время этапа синхронизации. Красота
технологии модуляции LoRa заключается в простоте демодуляции сигнала,
который на первый взгляд кажется достаточно сложным. Путем сложения внутри

Лист
НГТУ.434851.001 ПЗ 27
Изм. Лист № документа Подпись Дата
приемника инверсного сигнала (inverse chirp) c принятым LoRa сигналом,
получается сигнал, который изображен справа и уже состоит из декодированных
символов.
Каждый чэрп является одним символом, который в свою очередь может
хранить в себе некоторое количество бит информации. Таким образом, каждый
сдвиг в возрастающей линейной последовательности приводит во время
демодуляции к образованию сигнала, частота которого постоянна на протяжении
некоторого времени. Множество этих сигналов с постоянными частотами
напоминают «полочки» и называются символами. Результирующая постоянная
частота («высота полочки») определяется величиной сдвига относительно
исходной последовательности, и определяет какую информацию несет данный
чэрп. Так как сигнал распределен во времени, у приемника есть некоторое время,
в течении которого он может более точно определить, какие именно данные
поступили. Имеются 128 возможных символов (сдвигов относительно исходной
последовательности), которые позволяют закодировать 7 бит в каждый чэрп.
Реализация демодуляции таким образом позволила создать технологию,
которая мало чуствительна к шуму. На рисунке 14, помимо принятого сигнала
LoRa, также имеется узко-частотный шум (жёлтый сигнал, narrowband interferer).
Интересно то, что в процессе демодуляции, когда складываются принятый сигнал
с инверсным чэрпом, шум преобразовывается из сигнала с примерно постоянной
частотой в сигнал с переменной частотой, который уже не мешает процессу
распознавания декодированных символов. Полезные символы таким образом
различимы даже при большом количестве шума на различных частотах спектра.
Термин SF (Spreading Factor – коэффициент протяженности) условно
означает угол наклона (скорость увеличения частоты) косых, линейных линий
LoRa сигнала. Каждый шаг в SF означает, что чэрп длится два раза дольше по
времени, а следовательно передаются в два раза меньше чэрпов за одно и то же
время. Это дает приемнику больше времени для обнаружения переданного
символа, что позволяет демодулировать более слабые или зашумленные сигналы.

Лист
НГТУ.434851.001 ПЗ 28
Изм. Лист № документа Подпись Дата
Другими словами, увеличивая SF, увеличивается дальность, но уменьшается
скорость передачи в два раза.
Дополнительными плюсами такой модуляции являются стойкость к
доплеровскому сдвигу, что позволяет передатчикам постоянно быть в движении
без ухудшения качества сигнала, и низкие требования к тактовому генератору
приемника благодаря этапу синхронизации и простоты демодуляции.

2.4 Распространение радиоволн в пространстве


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

На рисунке 15 видно это изменение мощности сигнала происходит за счет


расстояние.

Рисунок 15 – Диаграмма изменения мощности сигнала от передатчика до


приемника
Лист
НГТУ.434851.001 ПЗ 29
Изм. Лист № документа Подпись Дата
На стороне передатчика TX для нелицензируемых частотах имеют
ограничение по мощности, распространяющееся по всей среде. В Европе уровень
сигнала составляет 14dbm, а для всех бытовых оборудований используют 20dbm,
по картинке располагается в (TX power – мощность сигнала). До того, как начинает
передатчик передать, он происходит на некие потери в схемах соединителя
(connector loss). На следующий уровень происходит усиление сигнала на
передатчике и антенне (antenna gain), а в следующий этап происходит передачи
сигнала в эфир.
Распространяя в пространстве от передатчика до приемника сигнал
затухает (free space path loss and fading). Уже сигнал находясь ближе к приемнику,
антенна которого приводит к усилению сигнала (antenna gain), и напоследок сигнал
приходит на приемник (RX).

Гладя на рисунке 15, имеется пунктирная линия (Receiver sensitivity –


чувствительность приемника), то есть для успешного принятия сигнала, любой
приемник должен получить с остаточной мощностью не меньшей некого
минимума. Следовательно, этот минимум определяется чувствительностью
приемника. Значит сигнал уходит за эту линию, и он становится неразличимым от
шума для приемника. И потом приемник не сможет распознать такой сигнал как
полезный, и при этом также не сможет декодировать его.
Иными словами, мощность на приемнике можно оценить по трем
параметра, таких как: мощность передатчика (TX power), потерь в среде
распространения с учетом затухания (Free space path loss and fading) и
чувствительность приемника (Receiver sensitivity).

2.5 Чувствительность приемника

Это характеристика, которая показывает способность приемника


принимать слабые сигналы. Следовательно, чувствительность приемника
(Sensitivity) можно определить по формуле (5):

(5)
Лист
НГТУ.434851.001 ПЗ 30
Изм. Лист № документа Подпись Дата
Где BW (Bandwidth) – ширина полосы пропускания.

NF (Noise Floor) – тепловой шум (от движения электронов по схеме)

SNR (Signal to Noise Ratio) – отношение сигнал / шум.

Из формулы можно посмотреть, что чувствительность зависит от


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

2.6 Потери распространения радиоволн в пространстве

Это процесс потери на пути распространения радиоволн в пространстве


(FSPL – Free Space Path Loss). Данное выражение (6) будет выглядеть таким
образом:

(6)

Где 𝑑 – расстояние в метрах.

𝑓 − частота в герцах.

𝑐 − скорость света в метрах в секунду.

Из данной формуле можно посмотреть квадратичная зависимость от


расстояния между передатчиком и приемником и длину волны, которая в свою
очередь она обратна пропорционально рабочей частоты антенны. Гладя на
Лист
НГТУ.434851.001 ПЗ 31
Изм. Лист № документа Подпись Дата
формулу (6), имеет понятие как геометрическая форма для нахождения площади
поверхности сферы, так как радиоволнового сигнал распространяется в виде
формы сферы. Для наглядности такого эффекта можно посмотреть на рисунке 16.

Рисунок 16 – Принцип распространения радиоволнового сигнала в постоянной


площади с увеличением расстояния

Из данного рисунка, плотность радиоволнового сигнала в пространстве,


проходящего через фиксированную площадь A, приходит такой эффект как
уменьшение по квадратичной зависимости от расстояния. То есть данное
расстояние r, располагается площадь поверхности из части сферы, причем она
равна А. При расстоянии 3r, площадь поверхности сигнала равна 9А, значит
плотность сигнала приводит к уменьшению в 9 раз.
Еще свойство формулы (1), что при увеличении частоты, антенна
уменьшает свой размер, поскольку конструктивно антенна зависит от длины
волны, а именно четверть длины волны. Следовательно, при уменьшении размера
антенны, то уменьшается также площадь поверхности сигнала, которая обозначена
А.
Из данной формуле (1), можно ассоциировать с геометрической формой
волны в виде математического представления, однако при расчете потери
распространения радиоволн чаще всего использую логарифмическое отношение в
децибелах, которое удобно, когда рабочая частота находится в мегагерцовых и
гигагерцовых диапазонах.
Лист
НГТУ.434851.001 ПЗ 32
Изм. Лист № документа Подпись Дата
(7)

По этой формуле можно выделить 2 особенных моментов. Во-первых,


дублирование на расстояние, мощность уменьшается в 6dB. Во-вторых, разность в
потерях при распространении в пространстве между 868МГц (LoRa) и 2.4ГГц (Wi-
Fi) составляет приблизительно 9dB. То есть рабочая частота технологии LoRa
868МГц, может покрыть в полтора раза больше расстояние по сравнению с
беспроводной связью Wi-Fi, работающей на частоте 2.4ГГц.

2.7 Энергетический потенциал линии связи на основе технологии


LoRa

В этой системе рассматривается на основе LoRa, которая содержит


следующие параметры:

Мощность передатчика (TX power): 20dBm

Ширина полосы (Bandwidth): 500кГц

В логарифмическом варианте: 10∙𝑙𝑜𝑔10(500000) = 𝟓7𝐝𝐁


Спектральная плотность: 2 ∙10^-7 Вт / Гц

Коэффициент (искусственного) расширения спектра (Spreading factor): 12

Режима SF12 позволяет распознать сигнал, который находится 20dB под уровнем
шума, поэтому:

SNR (отношение сигнала к шуму): −𝟐𝟎 𝐝𝐁

Коэффициент шума (Noise Figure): 𝟔 𝐝𝐁 (у базовой станции он может быть и


ниже)

Используя формулу (2) получаем:

Чувствительность приемника: −174+57+6−20=−𝟏𝟑1 𝐝𝐁𝐦

Поскольку энергетический потенциал равен сумме мощности передатчика и


чувствительности приёмника получаем:
Лист
НГТУ.434851.001 ПЗ 33
Изм. Лист № документа Подпись Дата
Энергетический потенциал: 20+131=𝟏𝟓𝟏 𝐝𝐁
Согласно формуле (6) – максимальное возможное расстояние передачи при
частоте 868 МГц и потерях на пути распространения равных 150dB составляет
800км. Это означает, что в условиях, приближенных к идеальным, где отсутствуют
шумы и преграды (к примеру, в космосе) – LoRa передатчик может передавать
данные на расстояние до 800 км! На практике не достигаются такие расстояния с
технологией LoRa введу того, что на пути от передатчика к приемнику всегда
имеются преграды и объекты, которые отражают, поглощают и преломляют
сигнал.

На рисунке 17 приведены потери в dBm, которые претерпевает сигнал,


проходя через различные материалы .

Рисунок 17 – Потери сигнала в dBm для различных материалов

Например при прохождении сигнала через бетонную стену толщины 10 см,


теряется 12 dBm. Если вспомнить, что сигнал теряет на пути распространения 6
Лист
НГТУ.434851.001 ПЗ 34
Изм. Лист № документа Подпись Дата
dBm при удвоении расстояния, то получается, что бетонная стена уменьшает
дальность в 4 раза.

Помимо перечисленных преград, есть одна преграда, о существование


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

2.8 Зона Френеля

Это площади, на которые разбивается поверхность волн (световых,


звуковых, электромагнитных) для расчета дифракции. Понятие прямой видимости
извлекает из идеи передачи от антенны в пространстве в оптимальном характере.
Однако на практике можно обнаруживать другую ситуацию, где передача
перестанет быть надежной, а сигнал ославляется из-за препятствий так называемых
зон Френеля. Для понятия такого эффект, на Рисунке 18 Показан первая зона
Френеля, на которой представлена влияние передачи сигнала.

Рисунок 18 – Представление зон Френеля между антенной передатчика и


приемника

Гладя на рисунке 18, находится антенна передатчика (TX antenna) на левой


стороне, расположенная на данной высоте 10 метров, а антенна приемника (RX
antenna) на правой стороне, расположенная на высоте 49 метров. На рисунке 18 еще
присутствует зону Френеля (1st Fresnel zone) и ее маленький участок зоны (Obstacle

Лист
НГТУ.434851.001 ПЗ 35
Изм. Лист № документа Подпись Дата
zone), которая протекает через площадь земли, являющаяся препятствием для
электромагнитных радиоволн.

2.9 Масштабируемость lorawan сети


В таблице 3 представлены некоторые численные значения для каждого из
коэффициентов расширения спектра (spreading factors - SF).

Таблица 3 – Численные значения для каждого коэффициента SF

Базовая станция LoRaWAN на основе чипа SX1301 способна одновременно


прослушивать все 8 каналов, и способна одновременно распознать сигналы с
различными SF в каждом канале. Это позволяет двум устройствам передавать на
одной и той же частоте в одно и то же время при условии, что они передают с
различными SF. В случае коллизии, связанной с одновременной передачи двумя
устройствами с одинаковыми параметрами, успешно декодируется сильнейший их
этих двух сигналов.
В случае возникновения большого числа коллизий можно установить
дополнительные базовые станции. При наличии нескольких базовых станций,
сигнал А с большой вероятностью дойдет до одной из них сильнее сигнала В,
который в свою очередь дойдет до другой базой станции сильнее сигнала А. Таким
образом, оба сигнала будут успешно декодированы, каждый на ближайшей ему

Лист
НГТУ.434851.001 ПЗ 36
Изм. Лист № документа Подпись Дата
базовой станцией. Так же существует немаловажный фактор, что при добавлении
второй и последующих базовых станций, передатчики становятся ближе к хотя бы
одной из них, что позволяет использовать более скоростные режимы передачи
данных и меньше времени находиться в эфире, что еще больше уменьшает
загруженность канала.
Для функционирования вышеупомянутой идеи переключения скоростного
режима (SF), в LoRaWAN предусмотрена вещь под названием ADR (Adaptive Data
Rate – адаптивная скорость передачи данных, или более правильно – адаптивный
SF). Она работает примерно следующим образом: если базовая станция получила
пакет от передатчика и видит, что SNR равен, к примеру, -10dB, то она, согласно
таблице 1, подбирает оптимальный SF для данного передатчика (обычно SNR -
5dB, то есть -15dB в нашем примере) и посылает пакет передатчику, который
сообщает о том, что он может переключиться на SF10 (предельный SNR = 15).

Для беспроводного обмена данными во всем мире существуют так


называемые нелицензируемые радиочастотные диапазоны. В РФ на основании
Решения Государственной комиссии по радиочастотам (ГКРЧ) № 08-24-01-001 от
28.04.2008 и № 07-20-03-001 от 07.05 2007 для этих целей, среди прочих, выделены
частотные диапазоны 433.075 - 434.750 МГц и 868,7-869,2 МГц. Эти частоты могут
эксплуатироваться без оформления специального разрешения ГКРЧ и совершенно
бесплатно при условии соблюдения требований по ширине полосы, излучаемой
мощности (до 10 мВт в районе частоты 434 МГц и до 25 мВт в районе частоты 868
МГц) и назначению радиопередающего изделия.

Лист
НГТУ.434851.001 ПЗ 37
Изм. Лист № документа Подпись Дата
3 ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ

На этом этапе рассмотрим применение технология LoRa на практике,


управляя с помощью микроконтроллера STM32 через интерфейс соединения SPI
(от англ. Serial Peripheral Interface – последовательный периферийный интерфейс),
на котором предоставляет возможно передачи данных, синхронизированных с
тактовым сигналом из ведущего устройства (процессора архитектуры ARM-
STM32), и потом принимает его на устройстве ведомого (модуль LoRa). Такая
передача будет работать в режиме полного дуплекса. Цель модуля Lora должна
передать некую информацию из передатчика к приемнику. В качестве информации
LoRa будет отрабатывать данные получаемые из датчика температуры (DS18B20),
считывающие по интерфейсу onewire.

Принцип действия модуля, изображенного на рисунке 19, соответствует


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

Рисунок 19 – Модуль LoRa с китайской маркировкой RA-01, содержащей чип


SX1278

Лист
НГТУ.434851.001 ПЗ 38
Изм. Лист № документа Подпись Дата
Рисунок 20 – Отладочная плата STM32VLDiscovery с микроконтроллером
STM32F100RBT6B

Данная плата, изображённого на рисунке 20 содержит готовое решение для


работы микроконтроллера, то есть питания по MicroUsb, и в тот же порт можно
залить прошивку. Еще имеется встроенный программатор St-link через
стандартный интерфейс JTAG.

3.1 Разработка принципиальной схемы

Схема была разработана и промоделирована в среде программного


обеспечения Altium Designer 17.1.9.

3.1.1 Принципиальная схема передатчика

Схема передатчика была собрана, исходя из подставленной задачи передать


данные показателя температуры, необходимо управлять эти потока данных при
помощи микроконтроллера STM32F100RBT6B, и в то же время подключается по
SPI модуль LoRa SX1278, которые отвечает за коррекцию ошибок на прием-
передачи, модуляцию (демодуляцю) и прием-передачу.
Все перечисленные событие задачи, учитывается и далее собирается
принципиальная схема для модуля передачи LoRa. Все это реализуется с помощью
Даташит (Datasheet) всех перечисленных компонентов, соответственно для
передачи, где датчик температуры (DS18B20) присутствует на схеме. Даташит

Лист
НГТУ.434851.001 ПЗ 39
Изм. Лист № документа Подпись Дата
самому является справочником, которые ориентирует реализацию данной схемы.
Пройдя все по этапам, далее создается модель в программное обеспечение Altium
Designer. Соединив все компоненты в схеме, проверяется на правильное
подключение и оформление ее по Госту.
В дальнейшем принимается решение передать готовую схемотехническую сборку
на разработку модели печатной платы для ее реализации. И в результате переходит
уже на изготовление печатной платы.

3.1.2 Принципиальная схема приемника

Аналогичным образом схема приема была доработана по такому же


алгоритму, учитывая все важные моменты для ее результирующей разработку. На
этот раз уже модуль LoRa слушает сигнал на входе, и далее передает на
микроконтроллер, отрабатывающий полученные данные температуры от
передатчика, и далее отображают их на экран OLED, а на второй экран отображает
уровень мощности на входе приема (RSSI).

3.2 Разработка программы приемо-передатчика

Прошивка для управления микроконтроллера и потока из модуля LoRa


была разработана на языке Си (C), используя предоставленные библиотеки STM32
для его инициализации и библиотеки для синхронизации интерфейс SPI (Модуль
LoRa – Микроконтроллер STM32). Собранная программа необходимо
компилировать для правильного синтаксиса, и для этого была использована
программное обеспечение Keil uvision V5.

3.2.1 Листинг - программа на приемнике LoRa

Прошивка для приемника, отвечает за входные потоки данных, которые


модуль получает и свое время передает отработку данных по SPI, иными словами,
учитывая возможность взять даташит LoRa и использовать шестнадцатеричные
команды для каждого события и функции данного модули, и по ним писать
программу, которая отчитывает каждые данные из модуля, и в то же время
Лист
НГТУ.434851.001 ПЗ 40
Изм. Лист № документа Подпись Дата
программа запрашивает о присутствии модули LoRa. Все это процесс происходит
на уровне программное, что представляется как некая абстракция сдвига левой или
правой по битам, а также запись и чтение по битам для каждого регистра,
указанного в даташите модули LoRa SX1278. В дальнейшем программа использует
дополнительные библиотеки для правильного функционала (I2c) как отобразить
полученные данные на выход (экран). После этой процедуры, необходимо
скомпилировать весь проект для проверки синтаксиса и далее загрузить прошивку
во встроенную память микроконтроллера. Полный текст программы приведен в
[Приложение Б].

3.2.2 Листинг - программа на передатчике LoRa

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


отвечает за отправку данных температуру окружающей среды в эфире. Каждое
некоторое время, программа управляет эти потоки со специальные флаги, то есть
прерывание для того, чтобы был синхронное соединение между ведомым (SX1278)
и ведущим (STM32F100RBT6B) устройством. Вся эта процедура происходит на
уровне программное, и далее по такому же алгоритму выполняет обращение
(вызов) к модулю LoRa с помощью команд регистра, указанных в даташите. Далее
были подключены все сторонние библиотеки для правильного функционала
интерфейса onewire, UART. То есть извлечение показателя температуры. Полный
текст программы приведен в [Приложение А].

3.3 Соединение между модулем LoRa и контроллером STM32 (SPI)

Данное подключение происходит за счет интерфейса SPI. Как сказано


выше, такой интерфейс является синхронным стандартом для передачи данных,
которые позволяет ведущее устройство(STM32) управлять ведомое устройство
(LoRa). Передача понимается как отправка пакета, длиной которого равен 1 байт (8
бит). Следовательно, ведущее устройство начинает цикл соединения на выводе
ведомого устройства (NSS) с низким уровнем сигнала, далее на этом этапе вывод
на MISO является выходом ведущего и тактовый сигнал SCK бегает от ведущего
Лист
НГТУ.434851.001 ПЗ 41
Изм. Лист № документа Подпись Дата
до ведомого, который в последующее время вызывает считывание значений битов,
отправляемых от ведущего устройства и происхождение сдвига регистра ведомого
устройства. На рисунке 21 изображена структура передачи данных через
интерфейс SPI:

Рисунок 21 – Структура линии передачи по интерфейсу SPI

Данный процесс был разработан на языке программирования СИ, следуя ту


логику SPI на основе архитектуры ARM для микроконтроллера STM32. Сам
микроконтроллер был подготовлен свои библиотеки SPL (Standard Peripheral
Libraries) для уменьшения трудоемкости на написании программы прошивки.

3.4 Измерение мощности сигнала на приемнике (RSSI)

Модуль LoRa способен демодулировать ASK (Amplitude Shift Keying –


Амплитудная манипуляция), OOK (On-Off Keying – включение/выключение
модуляции), FSK (Frequency Shift Keying – Частотная манипуляции) и MSK
(Minimum Shift Keying – минимальная частотная манипуляция).

Это показатель уровня мощности сигнала на приемнике, измеряемом по


логарифмической единице (dBm). Измерение происходит еще до усиления сигнала
и после преобразования частоты сигнала. В этом случае модуль LoRa оценивает
RSSI во временной области, представленной на рисунке 22:

Лист
НГТУ.434851.001 ПЗ 42
Изм. Лист № документа Подпись Дата
Рисунок 22 – Временная диаграмма оценки RSSI на приемнике

Гладя на рисунок 22, имеется FSRx в начальном времени, то есть это


означает режим синтеза частоты для приема сигнала, далее бегая по времени
располагается время обнаружения приема TS_RE на приемнике Rx и напоследок
время измерения уровня мощности приема TS_RE + TS_RSSI, иными словами, на
время TS_RSSI будет доступен к измерению сигнала после того, как приемник
готов.

3.5 Прототип устройства приёма-передачи

Пройдя по всем этапам разработки программы (прошивки),


собирается все нужные элементы железа во одном макете с проводами. Ниже
на рисунке 23 изображен прототип устройства приема на основе технологии
LoRa.

Лист
НГТУ.434851.001 ПЗ 43
Изм. Лист № документа Подпись Дата
Рисунок 23 – Прототип устройства приемника, собранный на макете

Как видно из рисунка 23 и рисунка 24, были использованы нужные порты


ввода\вывода, в зависимости данной задачи разработки. Для понимания, ниже
перечисляется все используемые порты из отладочной платы (микроконтроллера)
на каждых элементах данной работы.

Модуль LoRa

• NSS ↔ PA4 - Выбор микросхемы (ведомого)


• MOSI ↔ PA7 - Выход данных из ведущего, и также вход для
ведомого.
• MISO ↔ PA6 - Вход данных из ведущего, и также выход для
ведомого.
Лист
НГТУ.434851.001 ПЗ 44
Изм. Лист № документа Подпись Дата
• SCK ↔ PA5 - тактирование (то есть тактовая частота сигнала для
ведомого).

Датчик температуры DS18B20

• Date ↔ PB9 - Порт последовательной линии данных из датчика


(SDA).

Display OLED (Экран)

• SDA ↔ PB7 - Последовательная линия данных SDA.


• SCL ↔ PB8 - Последовательная линия тактирования SCL.

Display LCD 2004A (Экран)

• D4 ↔ PC2 - Шина команд / Передача данных.


• D5 ↔ PC3 - Шина команд / Передача данных.
• D6 ↔ PC4 - Шина команд / Передача данных.
• D7 ↔ PC5 - Шина команд / Передача данных.
• RS ↔ PC0 - Выбор регистра.
• E ↔ PC1 - Линия синхронизации.

При соединении всех элементов на макете, выполняется проверка для того,


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

Лист
НГТУ.434851.001 ПЗ 45
Изм. Лист № документа Подпись Дата
Рисунок 24 – Прототип устройства передатчика с датчиком температуры.

На стороне передатчика, пришлось учитывать соединение опорного


питания, изображённого на рисунке 24, затем соединить преобразователь
напряжение вниз, так как на входе устройства LoRa необходимо напряжение 3.3 В,
а питание постоянного тока имеет настроенное напряжение 12 В.

Лист
НГТУ.434851.001 ПЗ 46
Изм. Лист № документа Подпись Дата
Во время разработки печатной платы были учтены все явления при
соединениях дорожек, такие как пересечение дорожек обоих слоев, чтобы
предупредить повреждение функционала работоспособности устройства из-за
электромагнитных воздействий, а также ошибки на полученных символах во время
приема из-за внешних помех.
Но в данном случае можно пренебречь этими влияниями, так как скорость
передачи значительно мала на десятки килобайт.
Контур печатной платы, изображенного на рисунке 25 и рисунке 26,
подвирается конструкция и дизайн, чтобы поместить на ее корпусе, а также
делается круговой вырез для закрепления болтами и прямоугольный вырез для
того, чтобы разместить проводы в упорядоченном положении.

1 2
X 2 1 2
2 1
2 1
1
X

X
X

X X

2 1

1 2

2
1 2
X

2 1
X

3
1
X

2 1 2 1

2
X

1
1 2

2 1

2 1 X

X
X
X

X
X
X
X
X X
X 1 2
X X

X
1 X
X

X X
X

2
2 1
X

X
X 2
X X
X
X X
X X
X X

X X
X
X
X
1
X
X
2
X X
X
X 2 1
X
1 X

1
X
X
X

X X X X
X
X

2
X X
X
X
2 2
1 2

1
2 1 1

X X

X X

10 9 2 1 1

1 16
8 7
X
2
2 15
6 5 X

X
3
X X
3 14
X X

4 3
4 13
X

X X

X X

2 1
5 12
1 1

2 2
6 11

7 10

8 9
2 2
2 1 2

1 1
1

X X

1 2 3 4 1 2 3 4 5 6 7 8
X

Рисунок 25 – Прототип печатной плати устройства приемно-передатчика.

Лист
НГТУ.434851.001 ПЗ 47
Изм. Лист № документа Подпись Дата
Рисунок 26 – Спроектированная плата, изготовленная на производстве

Лист
НГТУ.434851.001 ПЗ 48
Изм. Лист № документа Подпись Дата
4 ЭКОНОМИЧЕСКАЯ ЧАСТЬ

Для оценки себестоимости разработки программного решения поставленной


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

• Затраты на постановку задачи (обзор стека технологий и программно-


аппаратных средств)
• Затраты на разработку программного решения
• Затраты на тестирование и рефакторинг
• Затраты на сопровождение программного продукта
Данная работа включает только разработку, поэтому затраты на
сопровождение не требуют расчета. Смету расходов составляют: электроэнергия,
лицензионное ПО, единый социальный налог, заработная плата и прочие расходы.
Для расчета заработной платы сотрудников, участвующих в разработке
нужно установить график работ, соотносящий временный интервалы и этапы
разработки.
• Постановка задачи
• Изучение стека технологий
• Изучение программно-аппаратной платформы
• Разработка программного обеспечения
• Испытания и анализ
• Рефакторинг
• Тестирование
• Оформление отчета

4.1 Оплата труда

Повременная система оплаты труда подразумевает оклад – сумма,


выплачиваемая работнику за отработанный месяц. В случае, если был отработан
неполный месяц, расчеты будут пропорциональны рабочему времени.
Лист
НГТУ.434851.001 ПЗ 49
Изм. Лист № документа Подпись Дата
Размер заработной платы прямым образом зависит от трудоемкости
выполняемых работ и квалификации работника. По нижеприведенной формуле
выполняется расчет тарифной заработной платы:

Зпт = 𝑡 ∙ Сттариф

Согласно единой тарифной сетке по оплате труда получим значения оплаты


труда сотрудников, участвующих в разработке, результаты сведены в таблицу 4.

Определив тарифную заработную плату, можно рассчитать ежемесячную


заработную плату, которая включает в себя премию, в размере 20% от тарифной
заработной платы и надбавку по районному коэффициенту, который по состоянию
на 2018 год в Новосибирской области равен 1.2.

Зп = Кр ∙ (Зпт + 0.2 ∙ Зпт ) = 1.2 ∙ (68 757.2 + 0.2 ∙ 68 757.2) = 99 010.37 руб

Основная заработная плата рассчитывается исходя из отработанного


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

• Командировочные расходы;
• Больничный, медицинское обследование и военные сборы;
• Разовые премии, предусмотренные организацией;
• Прохождение сотрудником обучения;
• Ежегодный отпуск;
• Отпуск по уходу за ребенком (декретный отпуск);

Лист
НГТУ.434851.001 ПЗ 50
Изм. Лист № документа Подпись Дата
Таблица 4 – Тарифная ставка для каждого этапа разработки
Время Тарифная
Наименование этапа Ответственный за Сумма,
выполнения, ставка,
разработки выполнение руб.
час руб.\час

Формирование технического Инженер-


15 180.94 2 714.1
задания программист

Обзор технологий,
Инженер-
платформ, существующих 90 180.94 16 284.6
программист
решений, обзор литературы

Разработка клиентской Инженер-


90 180.94 16 284.6
части ПО программист

Разработка серверной части Инженер-


40 180.94 7 237.6
ПО (ОС Linux) программист

Разработка серверной части Инженер-


20 180.94 3 618.8
ПО (STM32) программист

180.94 Инженер-
Испытания и анализ ПО 10 1 809.4
программист

Инженер-
Рефакторинг ПО 30 180.94 5 428.2
программист

Тестирование итоговой Инженер-


10 180.94 1 809.4
реализации ПО программист

Оформление отчета о Инженер -


60 180.94 10 856.4
проделанной работе разработчик

Оформление раздела Инженер -


15 180.94 2 714.1
безопасности труда разработчик

ИТОГО 68 757.2

Лист
НГТУ.434851.001 ПЗ 51
Изм. Лист № документа Подпись Дата
Дополнительная часть заработной платы составляет 12% в учреждениях,
занимающихся разработкой программного обеспечения.

Зпдоп = 1.12 ∙ Зп = 1.12 ∙ 99 010.37 = 110 891.61 руб

Тогда можно определить сумму общей заработной платы сотрудника,


участвующего в разработке.

Зпобщ = 99 010.37 + 110 891.61 = 209 901.98 руб

В обязательном порядке работодателем выплачиваются страховые взносы,


составляющие 30% от общей заработной платы сотрудника.

𝐶взнос = 0.3 ∙ Зпобщ = 0.3 ∙ 209 901.98 = 62 970.59 руб

Общие затраты на заработную плату составляют:

Зобщ = Зпобщ + 𝐶взнос = 209 901.98 + 62 970.59 = 272 872.57 руб

4.2 Материальные расходы

В качестве рабочего инструмента в процессе разработки программного


обеспечения выступают вычислительные машины.
Затраты, идущие на оплату машинного времени, рассчитываются исходя из
времени эксплуатации компьютера и стоимости машинного часа.
Змв = Смчас ∙ 𝑡
где Смчас – стоимость одного машинного часа, t – время работы за компьютером.
В силу специфики задачи, все этапы, регламентированные в графике
разработки, требуют работы за компьютером, поэтому время работы за
компьютером равно трудозатратам на разработку (t = 380 часов).
Стоимость одно машинного часа отражает численно затраты организации для
обеспечения работы ЭВМ в течение одного часа.
Зэвм
𝐶мчас =
𝐹э ∙ 𝑛 ∙ 𝑘г
Лист
НГТУ.434851.001 ПЗ 52
Изм. Лист № документа Подпись Дата
Зэвм − годовые затраты на содержание и эксплуатацию ЭВМ, руб./год;
𝐹э − годовой фонд времени работы ЭВМ, час;
𝑛 − количество ЭВМ, используемых в НИР;
𝑘г − коэффициент готовности;

Годовой фонд времени работы компьютеров рассчитывается из количества


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

𝐹э = 8 ∙ (365 − 119) − 52 ∙ 4 = 1760 ч

Затраты на поддержание работы ЭВМ включают в себя оплату труда


обслуживающего персонала, периферию и расходные материалы.

Зэвм = Рм + Зпобщ + Зам + Зр + Зпр

Рм − затраты на материалы (бумага, чернила и т.п.), руб\год;


Зпобщ − заработная плата обслуживающего персонала, руб\год;
Зам − амортизационные исчисления, руб\год;
Зр − затраты на ремонт компьютерного оборудования, руб\год;
Зпр − прочие затраты, руб\год;

Затраты на материалы определяются коэффициентом материальных затрат и


балансовой стоимостью одного компьютера.

Рм = 𝑘мз ∙ Ск = 0,3 ∙ 40000 = 12000 руб

Амортизационные исчисления формируются из нормы амортизации,


измеряемой в процентах и стоимости одного компьютера. В случае данной
организации срок эксплуатации одного компьютера составляет 5 лет.

Зам = Ск ∙ 𝐻а = 40000 ∙ 0,2 = 8000 руб

Лист
НГТУ.434851.001 ПЗ 53
Изм. Лист № документа Подпись Дата
Зр = Ск ∙ 𝑘р = 40000 ∙ 0,15 = 6000 руб

Где 𝑘р − коэффициент затрат на ремонтные работы.

В состав прочих затрат включим покупку лицензий на следующее


программное обеспечение:
• IAR Embedded Workbench ARM, стоимостью 283 649 руб. за рабочее место
• Sublime Text 3, стоимостью 5 345 руб. за рабочее место
• Microsoft Office 365, стоимостью 937 руб. за 3 месяца пользования, одно
рабочее место

Зпр = 283 649 + 5 345 + 937 = 289 931 руб

Таким образом годовые затраты на содержание ЭВМ равны:

Зэвм = 12000 + 8000 + 6000 + 289 931 = 315 931 руб

Лист
НГТУ.434851.001 ПЗ 54
Изм. Лист № документа Подпись Дата
5 РАЗДЕЛ ОХРАНЫ ТРУДА
Актуальность проблемы безопасности человека, в частности на производстве
признана во всем мире.
Безопасность жизнедеятельности (БЖД) — наука о закономерностях
формирования опасностей и мерах по предупреждению их воздействия на
человека. БЖД включает в себя следующие составные части:
• БЖД на производстве (охрану труда);
• БЖД в чрезвычайных ситуациях;
• Охрану окружающей среды.
Как гласит аксиома о потенциальной опасности деятельности – любая
деятельность потенциально опасна. Ежедневно от техногенных, социальных или
природных катастроф погибают сотни человек. Именно поэтому первостепенной
задачей безопасности жизнедеятельности является защита человека от
неблагоприятных факторов окружающей природной и техносферной среды и
создание комфортных условий труда.
В связи с темой диплома, а точнее с условиями труда, связанными с этой
темой, наибольшее внимание в данном разделе мы уделим теме охраны труда.
Охрана труда — система сохранения жизни и здоровья работника в процессе
его трудовой деятельности, включающая в себя правовые, социально-
экономические, организационно-технические, санитарно-гигиенические, лечебно-
профилактические, реабилитационные и иные мероприятия, и тесно связана с
гигиеной труда.
Гигиена труда основана на изучении производственной среды и ее влияния
на условия труда и здоровье рабочих с целью разработки комплекса
организационных, санитарно-гигиенических и лечебно-профилактических
мероприятий, необходимых для улучшения этих условий, повышения
производительности труда и работоспособности работника.

Лист
НГТУ.434851.001 ПЗ 55
Изм. Лист № документа Подпись Дата
Условия труда определяются технологией производства, его организацией и
трудовым процессом, с одной стороны, и окружающей работающего санитарно -
гигиенической обстановкой – с другой.
Технология производства тесно взаимодействует с трудовым
производственным процессом. К санитарно-гигиеническим условиям труда
относят воздействие на организм человека метеорологического фактора
(температуры, влажности, скорости движения воздуха, барометрического
давления), загрязнения воздуха парами, газами, пылью, воздействие шума,
вибрации, электромагнитных излучений, ионизирующей радиации и т. д. Все эти
понятия изучает такая наука, как производственная санитария и гигиена труда.
Производственная санитария [9] — это система организационных и
санитарно-технических мероприятий и средств, предотвращающих воздействие
вредных производственных факторов.
Одним из основных факторов, влияющих на здоровье и трудоспособность
работников, является микроклимат производственного помещения. При
длительном и систематическом пребывании человека в оптимальных
микроклиматических условиях сохраняется нормальное функциональное и
тепловое состояние организма без перегрузки механизмов терморегуляции.
Микроклимат включает в себя:
• температуру воздуха;
• скорость движения воздуха;
• относительную влажность воздуха;
• интенсивность теплового излучения.
Оптимальные параметры микроклимата – сочетание значений показателей
микроклимата, которые при длительном и систематическом воздействии на
человека обеспечивают нормальное тепловое состояние организма при
минимальном напряжении механизмов терморегуляции и ощущение комфорта не
менее чем у 80 % людей, находящихся в помещении.

Лист
НГТУ.434851.001 ПЗ 56
Изм. Лист № документа Подпись Дата
Допустимые параметры микроклимата — сочетания значений показателей
микроклимата, которые при длительном и систематическом воздействии на
человека могут вызвать общее и локальное ощущение дискомфорта, ухудшение
самочувствия и понижение работоспособности при усиленном напряжении
механизмов терморегуляции не вызывают повреждений или ухудшения состояния
здоровья.
Оптимальные параметры микроклимата распространяются на всю рабочую
зону производственных помещений без разделения рабочих мест на постоянные и
непостоянные. Если по технологическим требованиям, технически и экономически
обоснованным причинам оптимальные параметры микроклимата не могут быть
обеспечены, то устанавливают пределы их допустимых значений.
Длительное воздействие на человека неблагоприятных условий
микроклимата резко ухудшает его самочувствие, снижает работоспособность и
приводит к заболеваниям.
Так, высокая температура окружающего пространства способствует быстрой
утомляемости организма, в некоторых случаях может привести к тепловому удару.
Низкая температура в свою очередь может вызвать местное или общее
переохлаждение организма, стать причиной простудного заболевания, либо, в
крайнем случае, обморожения.
Влажность влияет на терморегуляцию организма человека. Высокая
относительная влажность при высокой температуре воздуха способствует
перегреванию организма, при низкой температуре усиливает теплоотдачу с
поверхности кожи, что приводит к переохлаждению организма работника. Низкая
влажность в производственном помещении приводит к пересыханию слизистых
оболочек.
Подвижность воздуха эффективно способствует теплоотдаче организма
работника и положительно проявляет себя при высоких температурах, но
отрицательно при низких.

Лист
НГТУ.434851.001 ПЗ 57
Изм. Лист № документа Подпись Дата
Для создания нормальных условий труда в производственных помещениях
обеспечивают соблюдение нормативных значений параметров микроклимата, а
именно температуры воздуха, его относительной влажности и скорости движения,
а также интенсивности теплового излучения.

Лист
НГТУ.434851.001 ПЗ 58
Изм. Лист № документа Подпись Дата
ЗАКЛЮЧЕНИЕ
Данная выпускная квалификационная работа посвящена разработке
Программного обеспечения (прошивки) с использованием синхронного
соединения SPI, принципиальной схемы, печатной платы и его изготовленной
реализации.
Во все разны обзорах были рассмотрены все виды разработки
программирования и моделирования в Altium designer.
Изучены технологии LoRa и ее модуляции, а также интерфейс передачи
данных между ведущим и ведомым устройством.
Были изучены программирование на микроконтроллер STM32F100RBT6B
и решение задачи управления данных приемно-передатчика на языке
программирования СИ.
В процессе выполнения разработки, моделирования и решения задачи
выпускной квалификационной работы были выполнены следующие пункты:
• Была разработана прошивку на языке программирования для
управления микроконтроллера и модули LoRa.
• Разработана и смоделирована схема электрическая принципиальная.
• Была разработана проведена трассировки на печатной плате.
• Было тестировано результирующее устройство на работоспособности
и дальность технологии LoRa.
• Было проведено моделирование погрешностей такого алгоритма
оценивания, в ходе которого было выявлено, что при определённом
уровне СКО входного аддитивного белого гауссовского шума,
алгоритм показывает удовлетворительные результаты.
В результате разработки был проведен тестирования на устройство, и тест
показал хорошую оценку на измерение температуры из датчика и состояние
отправки их данных температуры приемо-передатчика LoRa.

Лист
НГТУ.434851.001 ПЗ 59
Изм. Лист № документа Подпись Дата
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

1. Microcontrollers – 32-bit MCU – STMicroelectronics STM32F100RBT6B


[Электронный ресурс] / STMicroelectronics URL:
http://www.st.com/en/evaluation-tools/stm32vldiscovery.html (дата обращения
05.02.2018)
2. Обзор технологии LoRa [Электронный ресурс]:
https://itechinfo.ru/content/%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-
%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B
3%D0%B8%D0%B8-lora (дата обращения 09.03.2018)
3. Datasheet Microcontrollers STM32F100RBT6B [Электронный ресурс]:
http://www.st.com/content/ccc/resource/technical/document/user_manual/f3/16/
fb/63/d6/3d/45/aa/CD00267113.pdf/files/CD00267113.pdf/jcr:content/translatio
ns/en.CD00267113.pdf (дата обращения 25.04.2018)
4. Антенны и распространение радиоволн [учебное пособие- КГТУ]:
http://window.edu.ru/resource/597/68597/files/kamchatgtu091.pdf
5. Баскаков С.И. Радиотехнические цепи и сигналы, 2-е издание. — М.:
Высшая школа, 1988. — 446 с.
6. Общая теория связи: учебник / В.Н. Васюков. – Новосибирск: Изд-во
НГТУ, 2017. – 580 с. (Серия «Учебники НГТУ»)

Лист
НГТУ.434851.001 ПЗ 60
Изм. Лист № документа Подпись Дата
ПРИЛОЖЕНИЯ

Приложение А
Test_TX.c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_usart.h"
#include "onewireTx.h"
#include <stddef.h>
//#include "stm32f10x_dma.h"
#include "stm32f10x_tim.h"
#include <stdlib.h>
#include <math.h>
#include "humidity_sensor.h"
#include "misc.h"

unsigned char medida = 0;


uint8_t ds_buff[9];
//static void MX_GPIO_Init(void);
//static void MX_TIM3_Init(void);

/* USER CODE BEGIN PV */


#define PORT GPIOB //указать порт, к которому подключены датчики
#define PIN 9
#define TIMER TIM3 //задаем таймер, используемый для формирования
задержек
#define SKIP_ROM_ADR 0xCC // пропуск адресации
Лист
НГТУ.434851.001 ПЗ 61
Изм. Лист № документа Подпись Дата
#define CONVERT_TEMP 0x44 // запускает преобразование температуры
#define READ_DATA_COMAND 0xBE //команда чтения содержимого памяти
uint16_t temper;
char znak = '-' ;
uint16_t value_mes = 0;
unsigned char si4432_Send[9] = {"Im here "};
unsigned char len = 6;

unsigned char RegFifoThresh_7Bit = 0;

// length of packet
#define payload_length 7 //15 //25

// tx packet
//unsigned char txbuf[payload_length]= {'W', 'e', '_', 'i', 'n', '_', 't', 'h', 'e', '_', 'U', 'n', 'i',
'v', 'e', 'r', 's', 'i', 't', 'y', '_', 'N', 'S', 'T', 'U'};//{'s','e','n','d','_','t','e','s','t'};
//unsigned char txbuf[payload_length] = {'C', 'e', 'm', 'a', '_', 'e', 's', '_', 'm', 'a', 'r', 'i', 'c',
'o', 'n'};
// rx packet
unsigned char rxbuf[30];

/*******************************************************************/
//????????? ??????????
GPIO_InitTypeDef port;
SPI_InitTypeDef spi;
//ADC_InitTypeDef adc;
//uint8_t sendData;
Лист
НГТУ.434851.001 ПЗ 62
Изм. Лист № документа Подпись Дата
//uint16_t counter;
//uint16_t data;
//uint8_t needUpdate;
//uint8_t data1;
uint8_t ButtonState;
uint8_t SPIData=0;

#define LORA_RECEIVE 0x85

#define CS_ON() GPIO_ResetBits(GPIOC, GPIO_Pin_8)


#define CS_OFF_P8() GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define CS_OFF_P9() GPIO_SetBits(GPIOC, GPIO_Pin_9)

//Leds
#define BLUE_ON GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define Green_ON GPIO_SetBits(GPIOC, GPIO_Pin_9)
#define BLUE_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define Green_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_9)

#define LoraRst_High GPIO_SetBits(GPIOC, GPIO_Pin_12)


#define LoraRst_Low GPIO_ResetBits(GPIOC, GPIO_Pin_12)

/*******************************************************************/

/********************LoRa Communication*****************************/
//define Module Registers
#define RegOpMode 0x01
Лист
НГТУ.434851.001 ПЗ 63
Изм. Лист № документа Подпись Дата
#define RegDioMapping2 0x41
#define Reset 0x00
#define RegPaRamp 0x06
#define RegModemConfig 0x75
#define RegHopChannel 0x5C

/**********************************************************************
******/

// IO definition
#define LED_TX p1_0 // output,led of tx
#define LED_RX p1_1 // output,led of rx
#define MOSI p1_4 // output,SPI MOSI
#define nCS p1_5 // output, SPI enable
#define SCK p1_6 // output,SPI clock
#define RF_RST p1_7 // output,SX1276 reset
#define rx_en p3_7 // output,rx antenna switch
#define tx_en p4_5 // output,tx antenna switch
#define MISO p4_7 // output,SPI MISO

unsigned char count_tx=0;


unsigned char packet_size;
unsigned char rf_timeout;

typedef struct
{
Лист
НГТУ.434851.001 ПЗ 64
Изм. Лист № документа Подпись Дата
unsigned char reach_tx : 1;
unsigned char is_tx : 1;
unsigned char rf_reach_timeout : 1;
} FlagType;
FlagType Flag;

void delay(unsigned int time);


void Lora_Write(unsigned char addr, unsigned char data);
void Lora_Reset(void);
unsigned char Lora_Read(unsigned char Data);
void SPIBurstWrite_LoRa(unsigned char addr, const unsigned char *ptr, unsigned char
len);

int tes_temp(void);

/******************************Lora
Registers*******************************************************/

#define RegIrqFlags 0x12


#define RegOpMode 0x01
#define RegFifoTxBaseAddr 0x0E
#define RegFifoAddrPtr 0x0D
#define RegPayloadLength 0x22
#define RegFifo 0x00
#define RegModemConfig1 0x1D
#define RegModemConfig2 0x1E
#define RegPaDac 0x4D
#define RegOcp 0x0B
Лист
НГТУ.434851.001 ПЗ 65
Изм. Лист № документа Подпись Дата
#define RegPaConfig 0x09
#define RegFrLsb 0x08
#define PreambleLength 0x20
#define RegFrMid 0x07
#define RegFrMsb 0x06
#define RegTcxo 0x4B
#define RegOcp 0x0B
#define RegLna 0x0C
#define RegModemConfig3 0x26
#define RegPreambleMsb 0x20
#define RegHopPeriod 0x24
#define RegSymbTimeoutLsb 0x1F
#define RegPayloadLength 0x22
#define RegIrqFlagsMask 0x11
#define DIOMAPPING1 0x40
#define RegPreambleLsb 0x21

void initAll()
{
SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

Лист
НГТУ.434851.001 ПЗ 66
Изм. Лист № документа Подпись Дата
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_6;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_4;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_IPD;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_12;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &port);

Лист
НГТУ.434851.001 ПЗ 67
Изм. Лист № документа Подпись Дата
port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &port);

//GPIO_Init(GPIOF,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//cs
//ADC_StructInit(&adc);
//adc.ADC_ContinuousConvMode = ENABLE;
//adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//ADC_Init(ADC1, &adc);

/******????????????? ??????????*****************/

//=================== port == GPIO_InitTypeDef


GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//CS_ON();

Лист
НГТУ.434851.001 ПЗ 68
Изм. Лист № документа Подпись Дата
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/******????????????? SPI*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

//SPI_StructInit(&spi);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi);
SPI_Cmd(SPI1, ENABLE);

Лист
НГТУ.434851.001 ПЗ 69
Изм. Лист № документа Подпись Дата
}

void SX1278_Config(void)
{
delay(100); ;
// In setting mode, RF module should turn to sleep mode
Lora_Write(RegOpMode, 0x08); //low frequency mode,sleep mode

//Lora_Write(RegFifoAddrPtr, RegFifoAddrPtr);//FIFO SPI pointer


Lora_Write(RegTcxo, 0x09);
Lora_Write(RegOpMode, 0x88);// lora mode, turn on sleep mode

Lora_Write(RegFrMsb, 0x6C);
Lora_Write(RegFrMid, 0x80);
Lora_Write(RegFrLsb, 0x00);//Frequency in Default = 434 MHz "0x6C8000"

Lora_Write(RegPaConfig, 0xff);//Max output power

Lora_Write(RegOcp, 0x0B);// close ocp


Lora_Write(RegLna, 0x23);// enable LNA

Lora_Write(RegModemConfig1, 0x92); // signal bandwidth:


500kHz,coding rate = 4/5,explicit Header mode
Lora_Write(RegModemConfig2, 0x77); // spreading factor:7
Lora_Write(RegModemConfig3, 0x08); // LNA

Lora_Write(RegSymbTimeoutLsb, 0xFF); // max rx timeout 0xFF


0x14

Лист
НГТУ.434851.001 ПЗ 70
Изм. Лист № документа Подпись Дата
Lora_Write(RegPreambleLsb, 0x00);
Lora_Write(RegPreambleMsb, 16);
Lora_Write(RegPaDac, 0x87);// High Power +20dbm for PA_HP
Lora_Write(RegHopPeriod, 0x00); // no hopping

Lora_Write(RegDioMapping2, 0x01); //
DIO5=ModeReady,DIO4=CadDetected
Lora_Write(RegOpMode, 0x09); // standby mode
//Lora_Write(RegOpMode | 0x80, 0x8B);// Low freq + Transmit (TX)

//Lora_Write(PreambleLength, PreambleLength);//Preamble length MSB


//Lora_Write(RegOpMode_W, 0x8B);//operating lora mode in the
Low frequency for Transmitter "Mode" configuration
// Lora_Write(RegIrqFlags1 | 0x80, RegIrqFlags1);
//Lora_Write(RegPayloadLength | 0x80, RegPayloadLength);//Lora
payload length

//Lora_Write(RegFifoTxBaseAddr, RegFifoTxBaseAddr);//Start Tx data

//Lora_Write(RegIrqFlags1, RegIrqFlags1);//Reserved

//Lora_Write(RegOcp | 0x80, 0x2B);//over current protection control

Лист
НГТУ.434851.001 ПЗ 71
Изм. Лист № документа Подпись Дата
}

unsigned char temperature(void)


{
//SystemClock_Config();
// init();
// MX_GPIO_Init();
// MX_TIM3_Init();
ds_reset_pulse(1<<PIN); //послать импульс сброса /
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику
не используя адрес
ds_write_byte(CONVERT_TEMP,1<<PIN); //запустить
преобразование
delay (1000); //дать время для измерения
ds_reset_pulse(1<<PIN); //послать импульс сброса
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику
не используя адрес
ds_write_byte(READ_DATA_COMAND,1<<PIN); //команда,
заставляющая датчик выдать 9 байт своей памяти
for(int i=0; i<9; i++ ) //прочитать 9 байт в массив
ds_buff[i] = ds_read_byte(1<<PIN);

temper = ds_buff[1];
temper = temper<<8;
temper |= ds_buff[0];
temper =temper>>4;//отбрасываем дробную чать
if(temper > 1000)//если температура <0
{

Лист
НГТУ.434851.001 ПЗ 72
Изм. Лист № документа Подпись Дата
temper = 4096 - temper;
znak = '-';
}else znak = '+';

//int data[2] = {temper, znak};


return temper;
}
*/

/*
void tx_mode ()
{
unsigned char addr,temp;

Lora_Write(DIOMAPPING1,0x41); //
DIO0=TxDone,DIO1=RxTimeout,DIO3=ValidHeader

Lora_Write(RegIrqFlags,0xff); // clear interrupt


Lora_Write(RegIrqFlagsMask,0xf7); // enable txdone
Lora_Write(RegPayloadLength,payload_length); // packet length payload_length

addr = Lora_Read(RegFifoTxBaseAddr); // read TxBaseAddr


Lora_Write(RegFifoAddrPtr,addr); // TxBaseAddr->FifoAddrPtr

SPIBurstWrite_LoRa(RegFifo,txbuf,payload_length); // fill data into fifo


txbuf

Лист
НГТУ.434851.001 ПЗ 73
Изм. Лист № документа Подпись Дата
Lora_Write(RegOpMode,0x8B); // enter tx mode

Flag.is_tx = 1; // tx flag

rf_timeout = 0;
Flag.rf_reach_timeout = 0; // clear tx timeout flag

temp=Lora_Read(RegIrqFlags); // read interrupt

while(!(temp&0x08)) // wait for txdone


{
temp = Lora_Read(RegIrqFlags);

GPIOC ->ODR ^= GPIO_Pin_8;


//delay
for(int i = 0; i < 0x100000; i++);
/////
GPIOC ->ODR ^= GPIO_Pin_9;
//delay
for(int i = 0; i < 0x100000; i++);
if(Flag.rf_reach_timeout) // reset the RF module when tx
timeout
{
Lora_Write(RegIrqFlags,0xff); // clear interrupt
Lora_Write(RegOpMode,0x09); // enter Standby mode
Lora_Reset(); // reset RF
SX1278_Config(); // initialize RF module

Лист
НГТУ.434851.001 ПЗ 74
Изм. Лист № документа Подпись Дата
break;
}
}

Lora_Write(RegIrqFlags,0xff); // clear interrupt


Lora_Write(RegOpMode,0x09); // enter standby mode

return;
}
*/
/*
unsigned char * converter_temp(double *div)
{
//div_t arr1;
int del = *div / 10;

//arr1 = div(div, 10);


//arr1.rem;
//arr1.quot;

// double n, m;
// n = 8;
//m = 2;
float rem = fmod(*div, 10);

unsigned char arr1[2] = {del, rem};


Лист
НГТУ.434851.001 ПЗ 75
Изм. Лист № документа Подпись Дата
return arr1;
}
*/

short rain = 0;
char c, dec, u = 0;

void tx_send_temp ()
{
unsigned char addr,temp;

ds_reset_pulse(1<<PIN); //послать импульс сброса


/
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику
не используя адрес
ds_write_byte(CONVERT_TEMP,1<<PIN); //запустить
преобразование
delay (1000); //дать время для измерения
ds_reset_pulse(1<<PIN); //послать импульс сброса
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику
не используя адрес
ds_write_byte(READ_DATA_COMAND,1<<PIN); //команда,
заставляющая датчик выдать 9 байт своей памяти
for(int i=0; i<9; i++ ) //прочитать 9 байт в массив
ds_buff[i] = ds_read_byte(1<<PIN);

temper = ds_buff[1];
temper = temper<<8;
Лист
НГТУ.434851.001 ПЗ 76
Изм. Лист № документа Подпись Дата
temper |= ds_buff[0];
temper =temper>>4;//отбрасываем дробную чать
if(temper > 1000)//если температура <0
{
temper = 4096 - temper;
znak = '-';
}else znak = '+';
/*
double tt = 30.25;
double *t = &tt;
unsigned char *var = converter_temp(t);
*/
unsigned char d = (0x30 + (temper / 10));
unsigned char r = (0x30 + (temper % 10));
//unsigned char *del = NULL;
//unsigned char *rem = NULL;
//unsigned char pas = ds_buff[1];
// del = &d;
//rem = &r;
char size1 = sizeof(d);
char size2 = sizeof(r);
//char sizeDef1 = sizeof(del);
//char sizeDef2 = sizeof(rem);
//int i;

value_mes = get_adc_value();
value_mes = value_mes >> 2;

Лист
НГТУ.434851.001 ПЗ 77
Изм. Лист № документа Подпись Дата
rain = (short)(100.0f * ((1023.0f - (float)value_mes) / (1023.0f + 0.0f)));

c = (0x30 + (rain / 100));


dec = (0x30 + ((rain % 100) / 10));
u = (0x30 + (rain % 10));

unsigned char var[payload_length] = {d, r,' ','C', c, dec, u};//{d, r,' ','C', c, dec, u};//,
value_mes};//*si4432_Send

Lora_Write(DIOMAPPING1,0x41); //
DIO0=TxDone,DIO1=RxTimeout,DIO3=ValidHeader

Lora_Write(RegIrqFlags,0xff); // clear interrupt


Lora_Write(RegIrqFlagsMask,0xf7); // enable txdone
Lora_Write(RegPayloadLength,payload_length); // packet length payload_length

addr = Lora_Read(RegFifoTxBaseAddr); // read TxBaseAddr


RegFifoTxBaseAddr
Lora_Write(RegFifoAddrPtr,addr); // TxBaseAddr->FifoAddrPtr
RegFifoAddrPtr

//SPIBurstWrite_LoRa(RegFifo, const temper,9); // fill data into fifo


txbuf
SPIBurstWrite_LoRa(RegFifo, var, payload_length);
// Lora_Write(RegFifo, *var);

Лист
НГТУ.434851.001 ПЗ 78
Изм. Лист № документа Подпись Дата
Lora_Write(RegOpMode,0x8B); // enter tx mode

Flag.is_tx = 1; // tx flag

rf_timeout = 0;
Flag.rf_reach_timeout = 0; // clear tx timeout flag

temp = Lora_Read(RegIrqFlags); // read interrupt

while(!(temp&0x08)) // wait for txdone


{

GPIOC ->ODR ^= GPIO_Pin_9;


//delay
for(int i = 0; i < 0x100000; i++);

temp = Lora_Read(RegIrqFlags);

GPIOC ->ODR ^= GPIO_Pin_8;


//delay
for(int i = 0; i < 0x100000; i++);

//GPIOC ->ODR ^= GPIO_Pin_8;


//delay
// for(int i = 0; i < 0x100000; i++);
Лист
НГТУ.434851.001 ПЗ 79
Изм. Лист № документа Подпись Дата
/////

if(Flag.rf_reach_timeout) // reset the RF module when tx


timeout
{
Lora_Write(RegIrqFlags,0xff); // clear interrupt
Lora_Write(RegOpMode,0x09); // enter Standby mode
Lora_Reset(); // reset RF
SX1278_Config(); // initialize RF module
break;
}
}

Lora_Write(RegIrqFlags,0xff); // clear interrupt


Lora_Write(RegOpMode,0x09); // enter standby mode

return;
}

int main()
{

initAll();
init();

__ASM("nop");
__ASM("nop");

Лист
НГТУ.434851.001 ПЗ 80
Изм. Лист № документа Подпись Дата
__ASM("nop");
__ASM("nop");
__ASM("nop");
unsigned char addr,temp, mer;

//Green_ON;
// BLUE_ON;
__ASM("nop");
Lora_Reset();
SX1278_Config();

SystemClock_Config();

MX_GPIO_Init();
MX_TIM3_Init();
adc_init();
__enable_irq();
//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//TIM_Cmd(TIM3, ENABLE);
//TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);

//ADC_ExternalTrigConvCmd(ADC1, ENABLE);
// NVIC_EnableIRQ(TIM3_IRQn);

// TIMER4
/*TIM_TimeBaseInitTypeDef TIMER_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
Лист
НГТУ.434851.001 ПЗ 81
Изм. Лист № документа Подпись Дата
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_TimeBaseStructInit(&TIMER_InitStructure);
TIMER_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//84MHz
TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIMER_InitStructure.TIM_Prescaler = 255;
TIMER_InitStructure.TIM_Period = 700;
TIMER_InitStructure.TIM_RepetitionCounter = 0x00;
TIM_TimeBaseInit(TIM4, &TIMER_InitStructure);
//TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);

///NVIC Configuration
// Enable the TIM4_IRQn Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);*/
while(1)
{

// if(value_mes != 0)
// {
// GPIOC ->ODR ^= GPIO_Pin_8;
// }

Лист
НГТУ.434851.001 ПЗ 82
Изм. Лист № документа Подпись Дата
if(Flag.reach_tx == 0) // transmit packet on
time, and wait for the reply
{
Flag.reach_tx = 0;

// transmit packet

// Lora_Write(RegFifo,
0x48);//send Data
//tx_mode();
//delay(1000);
// delay(500);
tx_send_temp();

void delay(unsigned int time)


{
unsigned int i=0;
for(i=0;i<time;i++);

Лист
НГТУ.434851.001 ПЗ 83
Изм. Лист № документа Подпись Дата
}

unsigned char Lora_Read(unsigned char Data)


{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0

SPI_I2S_SendData(SPI1, Data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);

SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};

Data = SPI_I2S_ReceiveData(SPI1);
// Wait until transmit complete
GPIO_SetBits(GPIOA,GPIO_Pin_4); //NSS=1

delay(650);
Green_OFF;
BLUE_OFF;

return Data;
}

void Lora_Write(unsigned char addr, unsigned char data)

Лист
НГТУ.434851.001 ПЗ 84
Изм. Лист № документа Подпись Дата
{
//Green_ON;
//BLUE_ON;
delay(650);

GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0

SPI_I2S_SendData(SPI1, addr | 0x80);// 0x01 0x83


while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){};

SPI_I2S_ReceiveData(SPI1);
//while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);

delay(650);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
return;
}

void SPIBurstWrite_LoRa(unsigned char addr, const unsigned char *ptr, unsigned char
len)
{
unsigned char i;

if(len<=1) // length>1,use burst mode


Лист
НГТУ.434851.001 ПЗ 85
Изм. Лист № документа Подпись Дата
return;
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);//NSS=0

SPI_I2S_SendData(SPI1, addr | 0x80);//send address


while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){};

SPI_I2S_ReceiveData(SPI1);
delay(200);
for(i=0; i<len; i++){

SPI_I2S_SendData(SPI1, ptr[0]);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);

delay(650);
ptr++;
}
GPIO_SetBits(GPIOA, GPIO_Pin_4);//NSS=1
}
}

void Delay_reset(unsigned int t)


{
unsigned char j;
while(t--)
Лист
НГТУ.434851.001 ПЗ 86
Изм. Лист № документа Подпись Дата
{
for(j=0;j<100;j++);
}
}

void Lora_Reset(void)
{
LoraRst_High;
Delay_reset(200);
LoraRst_Low;
Delay_reset(500);
}

/*
void TIM3_IRQHandler()
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
*/

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
Лист
НГТУ.434851.001 ПЗ 87
Изм. Лист № документа Подпись Дата
Приложение Б
Test_RX.C
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_usart.h"
#include "Sx1276.h"
#include <stddef.h>
#include <string.h>
#include "ssd1306.h"
#include "ssd1306_i2c.h"
#include "fonts.h"
#include "hd44780_driver.h"
#include <math.h>
#include <stdio.h>
#include "stm32f10x_tim.h"
/*******************************/

uint8_t status_OK = 0;
uint8_t si4432_Send[16] = {"I'm here!!"};
float Packet_Strength_dBm2 = 0;
int PacketSnr = 0;
int SNR_dB = 0;
uint8_t ButtomState = 0;
Лист
НГТУ.434851.001 ПЗ 88
Изм. Лист № документа Подпись Дата
/*******************************************************************/
//????????? ??????????
GPIO_InitTypeDef port;
SPI_InitTypeDef spi;
//ADC_InitTypeDef adc;
//uint8_t sendData;
//uint16_t counter;
//uint16_t data;
//uint8_t needUpdate;
//uint8_t data1;
//uint8_t ButtonState;
uint8_t SPIData= 0;
uint8_t presStButt = 0;
#define longitud 4

#define LORA_RECEIVE 0x85

#define CS_ON() GPIO_ResetBits(GPIOC, GPIO_Pin_8)


#define CS_OFF_P8() GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define CS_OFF_P9() GPIO_SetBits(GPIOC, GPIO_Pin_9)

//Leds
#define BLUE_ON GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define Green_ON GPIO_SetBits(GPIOC, GPIO_Pin_9)
#define BLUE_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define Green_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_9)

Лист
НГТУ.434851.001 ПЗ 89
Изм. Лист № документа Подпись Дата
#define SET_ON GPIO_SetBits(GPIOC, GPIO_Pin_12)
#define SET_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_12)

/*******************************************************************/
/******************************Lora
Registers*******************************************************/

#define RegIrqFlags 0x12


#define RegOpMode 0x01
#define RegFifoTxBaseAddr 0x0E
#define RegFifoAddrPtr 0x0D
#define RegPayloadLength 0x22
#define RegFifo 0x00
#define RegModemConfig1 0x1D
#define RegModemConfig2 0x1E
#define RegPaDac 0x4D
#define RegOcp 0x0B
#define RegPaConfig 0x09
#define RegFrLsb 0x08
#define PreambleLength 0x20
#define RegFrMid 0x07
#define RegFrMsb 0x06
#define RegTcxo 0x4B
#define RegOcp 0x0B
#define RegLna 0x0C
#define RegModemConfig3 0x26
#define RegPreambleMsb 0x20
#define RegHopPeriod 0x24

Лист
НГТУ.434851.001 ПЗ 90
Изм. Лист № документа Подпись Дата
#define RegSymbTimeoutLsb 0x1F
#define RegPayloadLength 0x22
#define RegIrqFlagsMask 0x11
#define DIOMAPPING1 0x40
#define DIOMAPPING2 0x41
#define RegFifoRxCurrentAddr 0x10
#define RegRxNbBytes 0x13
#define RegFifoRxBaseAddr 0x0F
#define RegPreambleLsb 0x21
#define RegModemStat 0x18
#define RegRssiWideband 0x2C
#define RegPktRssiValue 0x1A
#define RegRssiValue 0x1B
#define RegPktSnrValue 0x19

//Debug on Error lora in the Receiver module


uint8_t Debug_LoraRx = 0;

// length of packet
#define payload_length 7

// rx packet
unsigned char rxbuf[30];
unsigned char rxbuf_tem[4];

unsigned char count_tx=0;


unsigned char packet_size;

Лист
НГТУ.434851.001 ПЗ 91
Изм. Лист № документа Подпись Дата
unsigned char rf_timeout = 0;
// unsigned char state_rx = 0;
typedef struct
{
unsigned char reach_tx : 1;
unsigned char is_tx : 1;
unsigned char rf_reach_timeout : 1;
} FlagType;
FlagType Flag;

/********************LoRa Communication*****************************/
//define Module Registers
#define RegOpMode 0x01
//char RegDioMapping2 = 0x41;
#define Reset 0x00
#define RegPaRamp 0x06
#define RegModemConfig 0x75
#define RegHopChannel 0x5C

/**********************************************************************
******/
void delay(unsigned int time);

unsigned char Lora_Read(unsigned char read_addr);


void Lora_Write(unsigned char addr, unsigned char data);
void Lora_Reset(void);

Лист
НГТУ.434851.001 ПЗ 92
Изм. Лист № документа Подпись Дата
void usart_rec(unsigned char *ptr, unsigned char len);
void SPIBurstRead(unsigned char addr, unsigned char *ptr, unsigned char len);

uint8_t count = 0;
uint8_t state;
int PacketRssi = 0;
int Rssi = 0;

int RSSI_dbm = 0;
int Packet_Strength_dbm = 0;

uint16_t previousState = 0;

// void Timer_init()
// {
// TIM_TimeBaseInitTypeDef timer;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

// //инизиялизируем таймер "включаем прерываеие"


// timer.TIM_ClockDivision = TIM_CKD_DIV2;//12MHz
// timer.TIM_CounterMode = TIM_CounterMode_Up;
// timer.TIM_Period = 60000;
// timer.TIM_Prescaler = 399;
// timer.TIM_RepetitionCounter = 0x00;
// TIM_TimeBaseInit(TIM4, &timer);
// TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
// TIM_Cmd(TIM4, ENABLE);
// }
Лист
НГТУ.434851.001 ПЗ 93
Изм. Лист № документа Подпись Дата
//

//---------------------------------------------------------------------------

void initAll()
{
SystemInit();

//??? ????????? ??? ?????????????


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_6;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_4;
Лист
НГТУ.434851.001 ПЗ 94
Изм. Лист № документа Подпись Дата
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
//
port.GPIO_Mode = GPIO_Mode_IPD;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

//GPIO_Init(GPIOF,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//cs
//ADC_StructInit(&adc);
//adc.ADC_ContinuousConvMode = ENABLE;
//adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//ADC_Init(ADC1, &adc);

/******????????????? ??????????*****************/

//=================== port == GPIO_InitTypeDef


GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//CS_ON();
Лист
НГТУ.434851.001 ПЗ 95
Изм. Лист № документа Подпись Дата
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_Mode_Out_OD
GPIO_Mode_Out_PP GPIO_Mode_IPU
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/******????????????? SPI*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

//SPI_StructInit(&spi);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi);
SPI_Cmd(SPI1, ENABLE);

Лист
НГТУ.434851.001 ПЗ 96
Изм. Лист № документа Подпись Дата
/************USART*************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,
ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);

/* TX: выход push-pull */


gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOA, &gpio);

/* RX: высокоимпендансный вход */


gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &gpio);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,
ENABLE);
USART_InitTypeDef usart;
/* Параметры по умолчанию: 9600 бод, 8 бит данных, 1
стоп-бит */
USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 9600;// скорость


USART_InitStructure.USART_WordLength =
USART_WordLength_8b; //8 бит данных
USART_InitStructure.USART_StopBits =
USART_StopBits_1; //один стоп бит

Лист
НГТУ.434851.001 ПЗ 97
Изм. Лист № документа Подпись Дата
USART_InitStructure.USART_Parity = USART_Parity_No;
//четность - нет
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None; // управлени потоком - нет
USART_InitStructure.USART_Mode = USART_Mode_Rx |
USART_Mode_Tx; // разрешаем прием и передачу

USART_StructInit(&usart);
USART_Init(USART1, &usart);
USART_Cmd(USART1, ENABLE);

}
//---------------------------------------------------------------------------------------
void SX1278_Config(void)
{

delay(800); delay(800);
// In setting mode, RF module should turn to sleep mode
Lora_Write(RegOpMode, 0x08); //low frequency mode,sleep mode

//Lora_Write(RegFifoAddrPtr, RegFifoAddrPtr);//FIFO SPI pointer


Lora_Write(RegTcxo, 0x09);
Lora_Write(RegOpMode, 0x88);// lora mode, turn on sleep mode

Lora_Write(RegFrMsb, 0x6C);
Lora_Write(RegFrMid, 0x80);
Лист
НГТУ.434851.001 ПЗ 98
Изм. Лист № документа Подпись Дата
Lora_Write(RegFrLsb, 0x00);//Frequency in Default = 434 MHz "0x6C8000"

Lora_Write(RegPaConfig, 0xFF);//Max output power

Lora_Write(RegOcp, 0x0B);// close ocp


Lora_Write(RegLna, 0x23);// enable LNA

Lora_Write(RegModemConfig1, 0x92); // signal bandwidth:


500kHz,coding rate = 4/5,explicit Header mode
Lora_Write(RegModemConfig2, 0x77); // spreading factor:7
Lora_Write(RegModemConfig3, 0x08); // LNA

Lora_Write(RegSymbTimeoutLsb, 0xFF); // max rx timeout


Lora_Write(RegPreambleMsb, 0x00);
Lora_Write(RegPreambleLsb, 16);
Lora_Write(RegPaDac, 0x87);// High Power +20dbm for PA_HP
Lora_Write(RegHopPeriod, 0x00); // no hopping

Lora_Write(DIOMAPPING2, 0x01); //
DIO5=ModeReady,DIO4=CadDetected
Lora_Write(RegOpMode, 0x09); // standby mode

//Lora_Write(PreambleLength, PreambleLength);//Preamble length MSB


//Lora_Write(RegOpMode_W, 0x8B);//operating lora mode in the
Low frequency for Transmitter "Mode" configuration
// Lora_Write(RegIrqFlags1 | 0x80, RegIrqFlags1);

Лист
НГТУ.434851.001 ПЗ 99
Изм. Лист № документа Подпись Дата
//Lora_Write(RegPayloadLength | 0x80, RegPayloadLength);//Lora
payload length

//Lora_Write(RegFifoTxBaseAddr, RegFifoTxBaseAddr);//Start Tx data

//Lora_Write(RegIrqFlags1, RegIrqFlags1);//Reserved

//Lora_Write(RegOcp | 0x80, 0x2B);//over current protection control

}
//-------------------------------------------------------------------------------------------/
void rx_init(void)
{
unsigned char addr;

//tx_en=0;
//rx_en=1; // open rx antenna switch

Flag.is_tx = 0;

Лист
НГТУ.434851.001 ПЗ 100
Изм. Лист № документа Подпись Дата
Lora_Write(DIOMAPPING1,0x01); //DIO0=00, DIO1=00,
DIO2=00, DIO3=01 DIO0=00--RXDONE
Lora_Write(RegIrqFlagsMask,0x3F); // enable rxdone and rxtimeout
'0x3f'
Lora_Write(RegIrqFlags,0xFF); // clear interrupt

addr = Lora_Read(RegFifoRxBaseAddr); // read RxBaseAddr


RegFifoRxBaseAddr
Lora_Write(RegFifoAddrPtr,addr); // RxBaseAddr->FifoAddrPtr
RegFifoAddrPtr
Lora_Write(RegOpMode,0x1D); // enter rx continuous
mode
}

//-------------------------------------------------------------------------------------/
uint8_t Uart_oneSymb(char uart)
{
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, uart);
return 1;
}

char c, d, u, sig, RSSI_Control = 0; //short sout, out, byte;


int rssi_value = 0;

unsigned char i, j, temp;


uint8_t display_buf[];
Лист
НГТУ.434851.001 ПЗ 101
Изм. Лист № документа Подпись Дата
unsigned char *pointer;
char data;

//----------------------------------------------------------------------------------/

//--------------------------------------------------------------------------------------------/

short Rx_lora(void)
{

//Debug_LoraRx = 0;

if(!Flag.is_tx) // RF in receive mode


{
//Lora_Write(DIOMAPPING1,0x82);
//Lora_Write(DIOMAPPING2,0xA3);

temp = Lora_Read(RegIrqFlags); // read interrupt

//Green_ON;
//BLUE_ON;
Debug_LoraRx = Lora_Read(RegModemStat); /// Debug on Error
lora in the Receiver module
//Rssi = Lora_Read(RegRssiValue);
// rf_timeout++;

Лист
НГТУ.434851.001 ПЗ 102
Изм. Лист № документа Подпись Дата
if((temp)) //if(temp == 0x01 || temp == 0x40) //|| Debug_LoraRx
== 0x24 || Debug_LoraRx == 0x25) // wait for rxdone
{
//(temp & 0x40)
//Debug_LoraRx = Lora_Read(RegModemStat);

Lora_Write(RegIrqFlags,0xFF); // clear
interrupt
Rssi = Lora_Read(RegRssiValue); //Current RSSI value

temp = Lora_Read(RegFifoRxCurrentAddr); //
read RxCurrentaddr
Lora_Write(RegFifoAddrPtr,temp); //
RxCurrentaddr -> FiFoAddrPtr

packet_size = Lora_Read(RegRxNbBytes); // read


length of packet

//SPIBurstRead(RegFifo, rxbuf, packet_size);


// read from fifo
//delay(1000);
SPIBurstRead(RegFifo, rxbuf_tem, packet_size); //
read from fifo

RSSI_Control = Lora_Read(RegRssiWideband);

PacketRssi = Lora_Read(RegPktRssiValue); //RSSI of the


latest packet received

Лист
НГТУ.434851.001 ПЗ 103
Изм. Лист № документа Подпись Дата
RSSI_dbm = -164 + Rssi;
Packet_Strength_dbm = -164 + Rssi;
PacketSnr = Lora_Read(RegPktSnrValue);
SNR_dB = PacketSnr / 4;
Packet_Strength_dBm2 = -164 + PacketRssi +
PacketSnr*0.25;
rssi_value = -164 + (16/15)*PacketRssi;

/*

if(RSSI_dbm < 0)
{
sig = '-';
}
else {
sig = ' ';
}
c = (0x30 + ((abs(RSSI_dbm))/ 100));
d = (0x30 + (((abs(RSSI_dbm)) % 100) / 10));
u = (0x30 + ((abs(RSSI_dbm)) % 10));
*/
//unsigned char str[4] = {sig, c, d, u};

//pointer = (unsigned char*) &str[4] ;

Лист
НГТУ.434851.001 ПЗ 104
Изм. Лист № документа Подпись Дата
/*
while(RSSI_dbm!=0)
{
short byte = RSSI_dbm%sout;
RSSI_dbm/=sout;
out--;
if(byte<10)
out = 48 + byte;
else
out = 55 + byte;
}

*/

//lcd_out("RSSI LoRa:"); //Âûâîäì íàäïèñü â íóëåâóþ


ñòðîêó

//if(rxbuf[0] == 0x73) //&& (rxbuf[1] == 'e') &&


(rxbuf[2] == 'n') && (rxbuf[3] == 'd') && (rxbuf[3] == '_') && (rxbuf[3] == 't') &&
(rxbuf[3] == 'e') && (rxbuf[3] == 's') && (rxbuf[3] == 't'))
//if(strstr(rxbuf, "We_in_the_University_NSTU")!=
NULL) // check the packet"send_test" We_in_the_University_NSTU
//if(strstr(rxbuf_tem, "25")!= NULL && strstr(rxbuf_tem,
"26")!= NULL && strstr(rxbuf_tem, "27")!= NULL)
Лист
НГТУ.434851.001 ПЗ 105
Изм. Лист № документа Подпись Дата
if((rssi_value >= -100)) //!= 0) rxbuf_tem[packet_size]
!= 0) ||
{
GPIOC ->ODR ^= GPIO_Pin_8; // data is
correct then flash the LED Blue
delay(0x100000);
delay(300);

// display_buf[packet_size];

//
// for(i = 0; i < packet_size; i++)
// {
// display_buf[packet_size] = rxbuf_tem[i];

// }

//for(int q = 0; q <= 40; q++)


//{
//rxbuf_te
SSD1306_GotoXY(0, 35); //Устанавливаем
курсор в позицию 0;44. Сначала по горизонтали, потом вертикали.
//SSD1306_Puts(&rxbuf_tem[3], &Font_16x26,
SSD1306_COLOR_WHITE); //пишем надпись в выставленной позиции шрифтом
"Font_7x10" белым цветом.
//SSD1306_Puts(&display_buf[1], &Font_16x26,
SSD1306_COLOR_WHITE);
SSD1306_Putc(rxbuf_tem[0], &Font_16x26,
SSD1306_COLOR_WHITE);
SSD1306_Putc(rxbuf_tem[1], &Font_16x26,
SSD1306_COLOR_WHITE);
Лист
НГТУ.434851.001 ПЗ 106
Изм. Лист № документа Подпись Дата
SSD1306_Putc(rxbuf_tem[2], &Font_16x26,
SSD1306_COLOR_WHITE);
SSD1306_Putc(rxbuf_tem[3], &Font_16x26,
SSD1306_COLOR_WHITE);

//SSD1306_Puts(" ", &Font_16x26,


SSD1306_COLOR_WHITE);
//SSD1306_Puts(&display_buf[3], &Font_16x26,
SSD1306_COLOR_WHITE);

SSD1306_DrawCircle(78, 35, 4,
SSD1306_COLOR_WHITE); //рисуем белую окружность в позиции 10;33 и
радиусом 7 пикселей

SSD1306_DrawRectangle(63, 35, 10, 400,


SSD1306_COLOR_BLACK);
SSD1306_DrawFilledRectangle(63, 35, 10, 400,
SSD1306_COLOR_BLACK);

SSD1306_GotoXY(0, 10);
SSD1306_Puts("Temperature", &Font_11x18,
SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
//break;
// }
//rx_init();
//usart_rec(rxbuf, 25);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
usart_rec("Start LoRa receiver", 19);
Лист
НГТУ.434851.001 ПЗ 107
Изм. Лист № документа Подпись Дата
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("temperature measurement: On", 27);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("Temperature: ", 13);
usart_rec(&rxbuf_tem[0], 1);//packet_size
usart_rec(&rxbuf_tem[1], 1);
usart_rec(" ",1);
//Uart_oneSymb('\r');
//Uart_oneSymb('\r');

usart_rec(&rxbuf_tem[3], 1);
usart_rec(&rxbuf_tem[4], 1);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');

usart_rec("LoRa status: 2 seconds to restore the


module", 49);
Uart_oneSymb('\n');
Uart_oneSymb('\r');

Uart_oneSymb('\n');
Uart_oneSymb('\r');

Лист
НГТУ.434851.001 ПЗ 108
Изм. Лист № документа Подпись Дата
status_OK = 1;
//Debug_LoraRx = 0;
// temp = 0;
//state_rx = 1;
//rxbuf_tem[packet_size] = 0;
//delay(10000);
}
/*
else if((rxbuf_tem[packet_size]) == 0)
{
rx_init(); // restart Rx when
data is not correct.
GPIOC ->ODR ^= GPIO_Pin_9; // All
restart, flash the LED Green
delay(0x100000);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("error in the received 'symbol' or
'string'", 42);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//USART_SendData(USART1, "error of the
driver");
delay(100);
status_OK = 0;

Лист
НГТУ.434851.001 ПЗ 109
Изм. Лист № документа Подпись Дата
SSD1306_GotoXY(0, 10);
SSD1306_Puts("Error symbol", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_GotoXY(0, 30);
SSD1306_Puts("check your driver", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
rxbuf_tem[packet_size] = 0;
Debug_LoraRx = 0;
temp = 0;

//xbuf_tem[packet_size]++;

}
*/
//Debug_LoraRx = 0;
//temp = 0;//Lora_Read(RegIrqFlags);
//Rssi = 0;
//Lora_Write(RegIrqFlags, 0xFF);
//temp = Lora_Read(RegIrqFlags);
//temp = 0;//Lora_Read(RegIrqFlags);
//temp = Lora_Read(RegFifoRxCurrentAddr);
//Lora_Write(RegIrqFlagsMask,0xFF);
rssi_value ^= 0;
}

Лист
НГТУ.434851.001 ПЗ 110
Изм. Лист № документа Подпись Дата
else if((rssi_value <= -101)) //if((Debug_LoraRx == 0x24) ||
(Debug_LoraRx == 0x25) || (Debug_LoraRx == 0x00))//Rssi == 0x00000000)//&&
temp != 0x00) //|| Debug_LoraRx == 0x04 || temp == 0x00)//if(Debug_LoraRx == 0x00
)
{
SSD1306_GotoXY(0, 10);
SSD1306_Puts("Network error", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_GotoXY(0, 30);
SSD1306_Puts("LoRa not working",
&Font_7x10, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//delay(5000000);
usart_rec("LoRa network disconnected, please
check the connection of your device", 69);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//Debug_LoraRx ^= 0;
//temp ^= 0;
//////////////////////Leds
GPIOC ->ODR ^= GPIO_Pin_8;
delay(0x10000);
GPIOC ->ODR ^= GPIO_Pin_9;
delay(0x10000);
Лист
НГТУ.434851.001 ПЗ 111
Изм. Лист № документа Подпись Дата
}
//(Lora_Write(RegModemStat, 0x00)); /// Debug on Error
lora in the Receiver module Debug_LoraRx
//(Lora_Write(RegRssiValue, 0x00));//
(Lora_Write(RegModemStat, 0x00)); /// Debug on
Error lora in the Receiver module Debug_LoraRx
(Lora_Write(RegRssiValue, 0x00));//Rssi
//Debug_LoraRx = 0;
Rssi = 0;
}

return rssi_value;//pointer;

short simbolo = 0;
char var, cent, dec, uni;
int read = 0;
short percent = 0;
//--------------------------------------------------------------------------------------------------------
-/

Лист
НГТУ.434851.001 ПЗ 112
Изм. Лист № документа Подпись Дата
//-------------------------------------------------------------------------------------------/

int main()
{

initAll();
//Lora_Reset();
lcd_init();
unsigned char i, j, RSSI_Control;

SSD1306_Init();
ssd1306_I2C_Init();

//Timer_init();
__ASM("nop");
__ASM("nop");
__ASM("nop");
__ASM("nop");
__ASM("nop");

delay(500); // wait for MCU ready

Лист
НГТУ.434851.001 ПЗ 113
Изм. Лист № документа Подпись Дата
__ASM("nop");

//Lora_Reset(); // reset RF module


SX1278_Config(); // initialize RF module

rx_init(); // enter rx mode

//CS_OFF_P8();

//lcd_clear();

//lcd_set_4bit_mode();

//NVIC_EnableIRQ(TIM4_IRQn);
while(1)
{

read = Rx_lora();

//write dBm value to display


if(read < 0)
{
sig = '-';
}
else {
sig = ' ';
}
Лист
НГТУ.434851.001 ПЗ 114
Изм. Лист № документа Подпись Дата
c = (0x30 + ((abs(read)) / 100));
d = (0x30 + (((abs(read)) % 100) / 10));
u = (0x30 + ((abs(read)) % 10));

//char str[]= {sig, c, d, u};//{sig, d, u};

//if((float)read > -99.0f)//-99 0xFFD2


// {
// char str[9] = {sig, d, u}; //'d', 'B', 'm',' ', ' ',' '};
// }
// else
//{
char str[10] = {sig, d, u, 'd', 'B', 'm',' ', ' ',' ', ' '};
// }

//;

/*for(int i =0; i < 5; i++)


{
read[i+1];
}*/

lcd_out("RSSI LoRa:"); //Âûâîäì íàäïèñü â íóëåâóþ ñòðîêó


lcd_out(str);
//lcd_set_xy(0,0); //ïåðåâîäèì êóðñîð â ïåðâóþ ñòðîêó
//lcd_send(0,DATA);
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE,
NO_BLINK);

Лист
НГТУ.434851.001 ПЗ 115
Изм. Лист № документа Подпись Дата
//lcd_clear();
//delay(500);
//lcd_delay();

percent = (short)(100.0f * (1.0f - (-46.0f - (float)read) / (-46.0f - (-


150.0f)))); //abs(read / (-46)) * 100; //((read * 100) / (-46));

cent = (0x30 + ((percent)/ 100));


dec = (0x30 + (((abs(percent)) % 100) / 10));
uni = (0x30 + ((abs(percent)) % 10));
simbolo = '%';

char value_percent[] = {cent, dec, uni};

if(percent == 0x64)
{
char value_percent[3] = {cent, dec, uni};
lcd_out("Percent:"); //Âûâîäì íàäïèñü â íóëåâóþ ñòðîêó
lcd_out(value_percent);
lcd_out("%");
lcd_set_xy(0,0); //ïåðåâîäèì êóðñîð â ïåðâóþ ñòðîêó
//lcd_send(0,DATA);
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE,
NO_BLINK); //0x0E cursor no blink

}
else
{
char value_percent[3] = {' ',dec, uni};
Лист
НГТУ.434851.001 ПЗ 116
Изм. Лист № документа Подпись Дата
lcd_out("Percent:"); //Âûâîäì íàäïèñü â íóëåâóþ ñòðîêó
lcd_out(value_percent);
lcd_out("%");
lcd_set_xy(0,0); //ïåðåâîäèì êóðñîð â ïåðâóþ ñòðîêó
//lcd_send(0,DATA);
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE,
NO_BLINK); //0x0E cursor no blink
}

//Rx_lora();
//read = NULL;
//GPIOC ->ODR ^= GPIO_Pin_9;
//delay(0x100000);
//Green_OFF;
//rxbuf_tem[i] = 0;
//packet_size = 0;
//rxbuf_tem[packet_size] = NULL;
//rxbuf_tem[packet_size] = 0;
// ButtomState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
// if(ButtomState == 1)
// {
// SET_ON;
// delay(1000);
// ButtomState = 0;
// }
// else

Лист
НГТУ.434851.001 ПЗ 117
Изм. Лист № документа Подпись Дата
// {
// SET_OFF;
// delay(1000);
// ButtomState = 1;
// }
//Debug_LoraRx = 0;
//temp = 0;
}

}
//--------------------------------------------------------------/
void delay(unsigned int time)
{
unsigned int i=0;
for(i=0;i<time;i++);
}

//----------------------------------------------------/
//void TIM4_IRQHandler(void)
//{
//
//
// TIM_ClearFlag(TIM4, TIM_FLAG_Update);
// if (previousState == 0)
// {
// previousState = 1;
// //GREEN_ON;
Лист
НГТУ.434851.001 ПЗ 118
Изм. Лист № документа Подпись Дата
// //BLUE_ON;
// //timer.TIM_Period = 50 - 1;
// //TIM_TimeBaseInit(TIM3, &timer);
// GPIO_SetBits(GPIOB,GPIO_Pin_7);
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// }
// else
// {
// previousState = 0;
// //GREEN_OFF;
// //BLUE_OFF;
// //timer.TIM_Period = 250 - 1;
// //TIM_TimeBaseInit(TIM3, &timer);
// GPIO_ResetBits(GPIOB,GPIO_Pin_7);
// GPIO_ResetBits(GPIOB,GPIO_Pin_6);
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// }
//
//}

//*********************************************************************
*******************/

unsigned char Lora_Read(unsigned char read_addr)


{

Лист
НГТУ.434851.001 ПЗ 119
Изм. Лист № документа Подпись Дата
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0

SPI_I2S_SendData(SPI1, read_addr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);

SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};

read_addr = SPI_I2S_ReceiveData(SPI1);
// Wait until transmit complete
GPIO_SetBits(GPIOA,GPIO_Pin_4); //NSS=1

delay(650);
//Green_OFF;
//BLUE_OFF;

return read_addr;
}

void Lora_Write(unsigned char addr, unsigned char data)


{
//Green_ON;
//BLUE_ON;
delay(650);

GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0

Лист
НГТУ.434851.001 ПЗ 120
Изм. Лист № документа Подпись Дата
SPI_I2S_SendData(SPI1, addr | 0x80);// 0x01 0x83
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){};

SPI_I2S_ReceiveData(SPI1);
//while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);

delay(650);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
return;

}
void Delay_reset(unsigned int t)
{
unsigned char j;
while(t--)
{
for(j=0;j<100;j++);
}
}

void Lora_Reset(void)
{
SET_ON;
Delay_reset(200);
SET_OFF;
Лист
НГТУ.434851.001 ПЗ 121
Изм. Лист № документа Подпись Дата
Delay_reset(500);
}

void usart_rec(unsigned char *ptr, unsigned char len) {

/* Wait until the data is ready to be received. */


//while ((USART1->SR & USART_SR_RXNE) == 0);

// read RX data, combine with DR mask (we only accept a max of 9 Bits)
//if(len<=1)
//return;
//else
//{
for(int i = 0; i < len; i++)
{
USART_SendData(USART1, *ptr);
while ((USART1->SR & USART_SR_TXE) == 0);
// delay(650);/\n\r
ptr++;
}
// while ((USART1->SR & USART_SR_TXE) == 0);
// USART_SendData(USART1, '\n');
// while ((USART1->SR & USART_SR_TXE) == 0);
//USART_SendData(USART1, '\r');
/*
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '_');
Лист
НГТУ.434851.001 ПЗ 122
Изм. Лист № документа Подпись Дата
while ((USART1->SR & USART_SR_TXE) == 0);
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '\n');
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '\r');*/
// }
//return;
}

void SPIBurstRead(unsigned char addr, unsigned char *ptr, unsigned char len)
{
unsigned char i;
if(len<=1) // length>1,use burst mode
return;
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0

SPI_I2S_SendData(SPI1, addr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);
delay(200);
for(i=0;i<len;i++)
{
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)
== SET){};
ptr[0] = SPI_I2S_ReceiveData(SPI1);

Лист
НГТУ.434851.001 ПЗ 123
Изм. Лист № документа Подпись Дата
// Wait until transmit complete
delay(650);
ptr++;
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
}
}

/*
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
*/

Лист
НГТУ.434851.001 ПЗ 124
Изм. Лист № документа Подпись Дата
Разработка системы связи на основе технологии LoRa
АННОТАЦИЯ
Данная выпускная квалификационная работа бакалавра посвящена
разработке системы связи на основе технологии LoRa и ее модуляции, которая дает
возможность передачи информации, не пропуская внешние шумы, что позволяет
совершать передачу на большие расстояния.
Объем работы составляет 121 страниц, которые содержат 5 таблиц и 26
рисунков. В процессе исследования было использовано 6 литературных
источников.
Работу составляют: введение, 8 глав, заключение и список использованных
источников. Во введении рассматривается актуальность работы, формулируются
задачи, решаемые в процессе выполнения выпускной квалификационной работы,
раскрывается практическая значимость решения.
В данной работе совершен обзор таких программно-аппаратных средств как
STM32F100RBT6B, технология LoRa, интерфейс SPI, и язык программирования, в
частности язык Си, произведена разработка печатной платы, электрической
принципиальной схемы и описано разработанное программное решение. Также
описан процесс тестирования результирующего устройства (приемо-передатчика
LoRa) на работоспособность.

Рассмотрены нормативные акты, регламентирующие условия труда


инженера-программиста, сделана оценка себестоимости разработки.
В заключении подведены итоги разработки, выполнено решение задачи,
рассмотрены возможные будущие перспективы развития этой технологии в
области «интернет вещей», в качестве альтернативной системы связи для передачи
мелких данных, пренебрегая большими скоростями.
Ключевые слова: интерфейс, разработка, SPI, STM32, Модуляция, CSS,
LoRaWAN, LoRa, Технология, язык Си.
Development of communication system based on LoRa technology

ABSTRACT
This final work of the bachelor is dedicated for the development of a
communication system based on LoRa technology and its modulation, which it makes
possible to transmit information without missing external noises that can be transmitted
over long distances.

The amount of page in this work is 121. This work contains 5 tables and 26
drawings, and 6 literary sources were being used in the research process.
The work consists of introduction, 8 chapters, conclusion and list of literary
sources had been used. In the introduction, the relevance of the work is considered, the
tasks to be solved in the process of completing the final qualifying work are formulated,
the practical significance of the solution is disclosed.

This work has a review of software and hardware such as


STM32F100RBT6B, LoRa technology, SPI interface, and programming language, C
language. In addition to previously written, the process of testing the device (LoRa
receiver and transmitter) for operation had been described.
The normative acts, which regulate the work conditions of the engineer
software are reviewed and the cost of development had been estimated.
In conclusion, the results of the development have been summarized and the
solution of the problem had been completed. This development has a future prospect for
this technology in the field of "Internet of things", as an alternative application of the
communication system for the transmission of small data, neglecting high speed.

Keywords: interface, development, SPI, STM32, Modulation, CSS,


LoRaWAN, LoRa, Technology, C language.

Оценить