Главная страница

Курсовой проект кп эвм476 03 2021 2021


Скачать 474.84 Kb.
НазваниеКурсовой проект кп эвм476 03 2021 2021
Дата27.12.2021
Размер474.84 Kb.
Формат файлаdocx
Имя файлаKursovoy.docx
ТипКурсовой проект
#319432




Министерство образования и молодежной политики Свердловской области государственное автономное профессиональное образовательное учреждение Свердловской области "Уральский политехнический колледж – межрегиональный центр компетенций"

Специальность 09.02.01 Компьютерные

системы

и комплексы

Разработка системы контроля периметра

Курсовой проект

КП ЭВМ476 03 2021

2021

Министерство образования и молодежной политики Свердловской области государственное автономное профессиональное образовательное учреждение Свердловской области "Уральский политехнический колледж – межрегиональный центр компетенций"

Специальность 09.02.01 Компьютерные

системы

и комплексы

Разработка системы контроля периметра

(тема курсового проекта)

Пояснительная записка

к курсовому проекту

КП ЭВМ476 03 2021 ПЗ

(03 - номер варианта)

Разработал:

студент гр. ЭВМ-476 _ _ _ _ _/Ш.Г. Гаджиев

Руководитель: _ _ _ _ _/Н.А. Феденева

Консультанты:

Н. контроль:

2021

Оглавление





Введение 3

1 Описание устройства 5

2 Описание схемы 6

3 Элементная база 10

Заключение 19

Список литературы 20

Приложение А 21

Приложение Б 22


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

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

Целью данного курсового проекта является разработка программируемого автоматизированного устройства контроля периметра для чемпионатов WorldSkills по компетенции «Интернет вещей».

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

Также устройства на рынке имеют свою систему работы что затрудняет их конфигурацию под технологию «интернета вещей», а в данном случае всё должно работать в рамках локальной сети и устройство будет обмениваться информацией с сервером чей IP адрес был задан в коде программы (приложение Б), или при конфигурации через последовательный COM порт.

Платформы ESP8266 и ESP32 произведены одной компанией Espressif. Микроконтроллер ESP32 отличается от своего предшественника улучшенными характеристиками, увеличенным функционалом и большим объемом памяти. Стоимость нового прибора дороже примерно в 2 раза.

Важным преимуществом ESP32 является более быстрый Wi-Fi и Bluetooth. В ESP32 установлен более мощный процессор, позволяющий реализовывать сложные проекты. Эта платформа подходит для приложений, в которых требуется интернет или новые интерфейсы. Для более дешевых разработок используется ESP8266.

Объем памяти у нового устройства ESP32 увеличен – 512 Кб против 160 Кб ESP8266. Также ESP32 отличается большим количеством выводов GRIO. К нескольким контактам на ESP32 прикреплены емкостные сенсорные датчики и датчик температуры. На обоих устройствах контакты GRIO можно использовать по-разному. ESP32 имеет 18 12-битных АЦП каналов. У его предшественника есть всего 1 10-битный вывод АЦП.

Мощность процессора значительно влияет на скорость работы. Модуль ESP32 показывает рекордную производительность по сравнению с предшественником ESP8266. Загрузка страницы с длинным скетчем и множеством графики занимает секунды.

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

Для разработки устройства целью которого является данный курсовой проект был выбран модуль ESP-WROOM-32, т.к. он является одним из самых популярных модулей на базе микроконтроллера ESP32, который имеет значительные преимущества по сравнению со своими предшественниками.

1 Описание устройства
Данное устройство работает совмещенно с ультразвуковым датчиком HC-SR04, и предназначено для проведения соревнований WorldSkills по компетенции «Интернет вещей», где, как и другие устройства оно будет подключено в локальную сеть, чтобы обмениваться данными с промежуточным сервером, для последующей передачи данных на главный сервер. И в обратном порядке получать данные для управления на само устройство. Обмен данными между промежуточным и главным сервером происходит средствами Web API в виде JSON пакета. А межу устройством и промежуточным сервером по Wi-Fi соединению в виде UDP пакетов.

Устройство выполняет функцию фиксации объекта попавшего в поле действия, после чего рассчитывает расстояние до зафиксированного объекта и переводит в понятные для человека единицы измерения. Затем выполняется проверка, является ли удалённость объекта от приёмника УЗ датчика в пределах допустимого значения, которое устанавливается пакетом данных полученного с сервера. Если объект расположен не ближе чем установленное значение, то на устройстве загорается зелёная лампа. Если же объект наоборот достигает указанной отметки, то на устройстве загорается красная лампа.

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

2 Описание схемы

2.1 Описание схемы электрической функциональной



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

Функционал устройства заключается в следующем:

  1. Сканирование периметра.

  2. Фиксирование объекта попавшего в область действия.

  3. Вычисление дистанции до объекта, попавшего в область видимости датчика.

  4. Передача вычисленного значения дистанции на промежуточный сервер в виде UDP пакета по Wi-Fi соединению.

  5. Получение от промежуточного сервера отметки дистанции для реагирования, в виде UDP пакета.

  6. Если дистанция до объекта превышает установленную отметку, то – горит зеленая лампа.

  7. Если зафиксированное значение дистанции меньше установленной отметки реагирования, загорается красная лампа.

  8. Передача данных о статусе нарушения выставленной нормы дистанции, состояниях ламп и расстояния до объекта, в виде UDP пакета по Wi-Fi соединению.



2.2 Описание электрической принципиальной схемы



Ток на плату поступает с контакта VOUT на USB порте, проходя через диод Шоттки VD6 он питает светодиод, параллельно фильтруя напряжение конденсатором C10 поступает на стабилизатор напряжения U4, откуда фильтруя напряжение питается микроконтроллер и параллельно поддерживается в питании контакт EN у микроконтроллера за счёт емкостного сопротивления конденсатора C15.

С USB порта ток поступает на программатор U2, после чего ожидается подача сигналов на информационные контакты. Программатор с помощью транзисторов VT1 и VT2 управляет состоянием микроконтроллера при снятии емкостного сопротивления.

Если подать положительный импульс на вход датчика TRIG длительностью 10 мкс, то датчик отправит звуковую волну (8 импульсов на частоте 40 кГц - ультразвук) и установит уровень логической «1» на выходе ECHO. Звуковая волна отразится от препятствия и вернётся на приёмник датчика, после чего он сбросит уровень на выходе ECHO в логический «0» (то же самое датчик сделает, если звуковая волна не вернётся в течении 38 мс.) В результате время наличия логической «1» на выходе ECHO равно времени прохождения ультразвуковой волны от датчика до препятствия и обратно. Зная скорость распространения звуковой волны в воздухе и время наличия логической «1» на выводе ECHO, можно рассчитать расстояние до препятствия.

Рисунок 2.1 – Принцип работы датчика

Расстояние вычисляется умножением скорости на время (в данном случае скорости распространения звуковой волны V, на время ожидания эха Echo). Но так звуковая волна проходит расстояние от датчика до объекта и обратно, а нам нужно только до объекта, то результат делим на 2:

L = V * Echo / 2, (1)

где L – расстояние (м),

V – скорость звука в воздухе (м/с),

Echo – время ожидания эха (с).

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

V2 = γ R T / M, (2)

где V – скорость звука в воздухе (м/с),

γ – показатель адиабаты воздуха (ед.) = 7/5,

R – универсальная газовая постоянная (Дж/моль*K) = 8,3144598(48),

T – абсолютная температура воздуха (°К) = t°C + 273,15,

M – молекулярная масса воздуха (г/моль) = 28,98.

Подставив в формулу известные значения γ, R, M, получим:

V ≈ 20,042 √T, (3)

где T – абсолютная температура воздуха (°К) = t°C + 273,15.

Осталось объединить формулы вычисления V и L, и перевести L из м в см, Echo из с в мкс, T из °К в °C, получим:

L ≈ Echo √(t+273,15) / 1000, (4)

где L – расстояние (см),

Echo – время ожидания эха (мкс),

t – температура воздуха (°C).

3 Элементная база




3.1 Описание микроконтроллера ESP32



Микроконтроллер ESP32 – это одна из самых доступных и мощных платформ для создания умных ардуино-проектов с поддержкой WiFi. Придя на смену ESP8266, этот чип дал новые возможности для разработчиков, хотя по-прежнему остались старые проблемы с поддержкой и документацией. В этой статье вы найдете описание характеристик, распиновку микросхемы, примеры программирования с помощью Arduino IDE.

Фирма Espressif выпустила мощный недорогой микроконтроллер ESP32 летом 2016 года. Устройство представляет собой систему на кристалле, построенную по техпроцессу 40 нм компанией TSMC, с Wi-Fi и Bluetooth контроллерами. Оно оснащено двухъядерным 32-битным процессором, который работает на частотах 80, 160 или 240 МГц. Также в систему интегрированы антенные коммутаторы, радиочастотные компоненты, фильтры, усилители, модули управления питанием. Подключается ESP32 к компьютеру через обычный USB провод.

3.1.1 Характеристики чипа



Технические характеристики ESP32:

  • ESP32-WROOM-32 содержит два маломощных 32-разрядных микропроцессора Xtensa LX6.

  • 448 Кбайт ПЗУ для загрузки и основных функций.

  • 520 Кбайт встроенной памяти SRAM.

  • 8 Кбайт SRAM в RTC медленно.

  • 8 Кбайт SRAM в RTC быстро.

  • 1 Кбит / с EFUSE, 256 бит MAC.

  • Wi-Fi: 802.11 b/g/n/d/e/i/k/r (802.11 n до 150 Мбит / с).

  • Спецификация Bluetooth v4.2 BR/EDR и BLE.

  • Станция в режиме Wi-Fi/SoftAP/станция SoftAP+/P2P.

  • Безопасность WPA/WPA2/WPA2-Enterprise/WPS.

  • Шифрование AES/RSA/ECC/SHA.

  • IPv4, IPv6, SSL, TCP/UDP/HTTP/FTP/MQTT.

  • Интерфейсы: SD-карта, UART, SPI, SDIO, I2C, светодиодная ШИМ, ШИМ двигателя, I2S, ИК, GPIO, емкостный сенсорный датчик, АЦП, ЦАП, датчик Холла, датчик температуры.

  • Рабочая температура -40 + 85С.

  • Рабочее напряжение: 2,2-3,6 В.

  • Потребление: 80 мА типичное.

  • Размеры: 18 мм(Д) х 25,5 мм(Ш) х 2,8 мм(В).

  • Шаг вывода:1,27 мм.

  • Высота экранирующей банки: 2 мм.

  • Толщина печатной платы: 0,8±0,1 мм.

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

Программирование модуля ESP32 может производиться на самых разных платформах, и средах, вот небольшой список наиболее популярных вариантов:

  • Arduino IDE;

  • Espressif IoT Development Framework;

  • Espruino;

  • PlatformIO;

  • Pymakr IDE.

Большинство проектов реализуется на Arduino IDE и Espruino.

3.1.2 Распиновка модуля ESP-WROOM-32



К портам GRIO 0, 4, 2, 15, 13, 12, 14, 27, 33 и 32 подключены сенсорные выводы. Они могут использоваться для вывода ESP32 из глубокого сна. Они фиксируют любое изменение электрического заряда.

Порты с 34 по 39 используются только для ввода информации. На них отсутствуют подтягивающие резисторы, поэтому их нельзя использовать как выходы.

На некоторых платах отображаются контакты 6-11. Они подсоединены к интегрированной SPI flash. Их не используют в проектах.

Есть различные версии платы ESP32 размерами 5х5 мм или 6х6 мм. Также на основе ESP32 существуют модули SMT для интегрирования в другие платы.

3.1.3 Периферия микроконтроллера



Периферийные устройства ESP32 включают:

  • 18 Каналов аналого-цифрового преобразователя (АЦП).

  • Интерфейса SPI.

  • Интерфейса UART.

  • 2 Интерфейса I2C.

  • 16 выходных каналов ШИМ.

  • 2 Цифроаналоговых преобразователя (ЦАП).

  • 2 Интерфейса I2S.

  • 10 Емкостных датчиков GPIO.

Функции АЦП (Аналого-цифровой преобразователь) и ЦАП (цифроаналоговый преобразователь) назначаются определенным статическим выводам. Однако вы можете решить, какие контакты являются UART, I2C, SPI, PWM и т.д. – Вам просто нужно назначить их в коде. Это возможно благодаря функции мультиплексирования чипа ESP32.

3.2 Описание USB-UART преобразователь




3.2.1 Описание CP2102N



Устройства CP2102N, входящие в семейство USBXPRESS, предназначены для быстрого добавления USB в ваши приложения за счет устранения сложности встроенного ПО и сокращения времени разработки.

Эти высокоинтегрированные мостовые контроллеры USB-UART обеспечивают простое решение для обновления конструкций RS-232 до USB с использованием минимального количества компонентов и места на печатной плате. CP2102N включает в себя полноскоростной функциональный контроллер USB 2.0, USB-приемопередатчик, генератор и универсальный асинхронный приемник /передатчик (UART) в упаковках размером 3 мм x 3 мм. Для разработки не требуется никаких других внешних USB-компонентов. Все параметры настройки и конфигурации можно выбрать с помощью простого конфигуратора на основе графического интерфейса. Устраняя необходимость в разработке сложных встроенных программ и драйверов, устройства CP2102N обеспечивают быстрое подключение по USB с минимальными усилиями по разработке.

Рисунок 3.1 - CP2102N QFN28 распиновка

3.2.2 Описание пинов CP2102N QFN28



Таблица 1- Описание пинов модуля CP2102N QFN28



Имя

Описание

1

DCD

Цифровой вход. Носитель данных обнаруживает управляющий вход (активный низкий уровень).

2

RI / CLK

Цифровой вход. Вход управления кольцевым индикатором (активный низкий уровень). / Цифровой выход. Тактовый выход.

3

GND

Земля.

4

D+

USB D+.

5

D-

USB D-.

6

VDD

Потребляемая мощность источника Питания / Выход регулятора 5В

7

VREGIN

Вход регулятора 5В.

8

VBUS

Цифровой вход. Входной сигнал датчика VBUS. Этот вывод должен быть подключен к сигналу VBUS сети USB. Сигнал 5 В на этом выводе указывает на подключение к сети USB.

9

RSTb

Сброс активный-низкий.

Таблица 1 - Окончание

10

NC

Нет подключения.

11

SUSPENDb

Цифровой выход. Этот вывод находится на низком уровне, когда устройство переходит в состояние приостановки USB/

12

SUSPEND

Цифровой выход. Этот вывод находится на высоком уровне, когда устройство переходит в состояние приостановки USB.

13

CHREN

Цифровой выход. Готовый К Отправке управляющий выход (активный низкий уровень) Цифровой Выход. Включите схему зарядки (100 мА).

14

CHR1

Цифровой выход. Включите максимальный ток (1,5 А).

15

CHR0

Цифровой выход. Включите более высокий ток (500 мА).

16

GPIO.3 /

WAKEUP

Цифровой вход/выход. Ввод-вывод общего назначения.

Цифровой вход. Удаленный вход прерывания пробуждения USB.

17

GPIO.2 /

RS485

Цифровой вход/выход. Ввод-вывод общего назначения.

Цифровой выход. Управляющий сигнал RS485.

18

GPIO.1 /

RXT

Цифровой вход/выход. Ввод-вывод общего назначения.

Цифровой выход. Получите переключатель светодиода.

19

GPIO.0 /

TXT

Цифровой вход/выход. Ввод-вывод общего назначения.

Цифровой выход. Переключатель светодиода передачи.

20

GPIO.6

Цифровой вход/выход. Ввод-вывод общего назначения.

21

GPIO.5

Цифровой вход/выход. Ввод-вывод общего назначения.

22

GPIO.4

Цифровой вход/выход. Ввод-вывод общего назначения.

23

CTS

Цифровой вход. Снимите флажок Для отправки управляющего ввода (активный низкий уровень).

24

RTS

Цифровой выход. Готов к отправке управляющего вывода (активный низкий уровень).

25

RXD

Цифровой вход. Асинхронный ввод данных (прием UART).

26

TXD

Цифровой выход. Асинхронный вывод данных (передача UART).

27

DSR

Цифровой вход. Вход управления готовым набором данных (активный низкий уровень).

28

DTR

Цифровой выход. Выход управления готовностью терминала передачи данных (низкий уровень активности).



3.2.3 Характеристики преобразователя



Передача данных с одного чипа USB на UART:

  1. Встроенный USB-приемопередатчик (внешние резисторы не требуются)

  2. Встроенные часы (внешний кристалл не требуется)

  3. Внутренний 1024-байтовое программируемое ПЗУ для идентификатора поставщика, идентификатора продукта, серийного номера, дескриптора мощности, номера выпуска и строк описания продукта.

  • EEPROM (CP2102).

  • EPROM (одноразовый программируемый) (CP2109).

  1. Схема сброса питания на кристалле.

  2. Регулятор напряжения на кристалле.

  • Выход 3,3 В (CP2102).

  • Выход 3,45 В (CP2109).

  1. 100% pin-код и программное обеспечение, совместимые с CP2101

Функциональный контроллер USB:

  • USB Specification 2.0 compliant; full-speed (12 Mbps)

  • Состояния приостановки USB поддерживаются с помощью контактов приостановки

Асинхронная последовательная ШИНА данных (UART):

  1. Все сигналы интерфейса квитирования и модема

  2. Поддерживаемые форматы данных:

  • Биты данных: 5, 6, 7 и 8.

  • Стоповые биты: 1, 1,5 и 2.

  • Четность: нечетная, четная, метка, пробел, без четности.

  1. Скорость передачи данных: от 300 бит / с до 1 Мбит / с.

  2. Буфер приема 576 байт, буфер передачи 640 байт.

  3. Поддерживается аппаратное или X-On/X-Off квитирование.

  4. Поддержка символов событий.

  5. Передача обрыва линии.

Драйверы устройств с виртуальным COM:

  • Работает с существующими приложениями для ПК с COM-портом.

  • Лицензия на бесплатное распространение.

  • Windows 8/7 / Vista / Server 2003 /XP / 2000.

  • MAC OS-X /OS-9.

  • Linux.

Прямая поддержка драйверов USBXpress:

  • Лицензия на бесплатное распространение.

  • Windows 7 /Vista / XP / Server 2003/2000.

  • Windows CE.

Примеры приложений:

  • Обновление устаревших устройств RS-232 до USB.

  • Кабель интерфейса USB сотового телефона.

  • Кабель интерфейса USB.

  • Последовательный адаптер USB-RS-232.

Поддерживаемое напряжение питания:

  • Автономное питание: От 3,0 до 3,6В.

  • Питание от шины USB: от 4,0 до 5,25В.

Диапазон температур: от -40 до +85 °C

Рисунок 3.2 - Примерная схема системы

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


  1. Радиокомпания Лешан. Спецификация LESD5L5.0CT1G. Datasheet4U:URL:https://datasheet4u.com/ (2015 Июль).

  2. Kexin. AMS1117-3.3 Datasheet. Datasheet4U:URL:https://datasheet4u.com/.

  3. Espressif Systems. ESP32 Series Datasheet. Espressif:URL:https://www.espressif.com/ (2021).

  4. Espressif Systems. ESP-WROOM-32 Datasheet. Elecrow:URL:https://www.elecrow.com/ (2017 17 Март).

  5. Silicon Labs. USBXpress™ Family CP2102N Data Sheet. Silabs:URL:https://www.silabs.com/ (2016 Май).

  6. ГОСТ 2.743-91 ЕСКД. Обозначения условные графические в схемах.


Приложение А
Спецификация

В состав устройства входят следующие компоненты:

  1. Mini USB connector 105017-0001

  2. USB-UART преобразователь CP2102N-A01-GQFN28 (1 шт.).

  3. Биполярный транзистор SS8050-G (2 шт.).

  4. Выпрямитель Шоттки BAT760-7 (1 шт.).

  5. Диод LESD5D5.0CT1G (3 шт.).

  6. Конденсатор 05085C104KAT2A 0.1uF/50V (10%) (5 шт.).

  7. Конденсатор 1210ZC226MAT2A 22uF/10V (20%) (3 шт.).

  8. Конденсатор 06036D475KAT2A 4.7uF/6.3V (10%) (1 шт.).

  9. Модуль ESP-WROOM-32 (1 шт.).

  10. Регулятор напряжения AMS1117-3.3 (1 шт.).

  11. Резистор 9C06031A1002JLHFT 10K (5%) (3 шт.).

  12. Резистор 9C06031A2001JLHFT 2K (5%) (2 шт.).

  13. Резистор 9C1A04024752JLHF3 47.5K (5%) (1 шт.).

  14. Резистор 9C04021A2212FLHF3 22.1K (5%) (1 шт.).

  15. Светодиод красный TO-2013BC-MRE (1 шт.).

  16. Светодиод зеленый TO-2013BC-PG (1 шт.).

  17. Тактовая кнопка KLS7-TS3601-4.3-180 (TC-0120) (1 шт.).

  18. Штырьковый разъём DS1023-1X19SF1 (2 шт.).

Приложение Б

// Подключаем библиотеки

#include

#include

#include

#include

#include

#include

#define PIN_TRIG 33

#define PIN_ECHO 32

#define LED_YELLOW 2 // Указываем пин (Жёлтый)

#define LED_GREEN 15 // Указываем пин (Зелёный)

#define LED_ORANGE 4 // Указываем пин (Красный)

NewPing sonar(PIN_TRIG, PIN_ECHO);

long Time, Distance;

int Count, Limit = 50;

int stateYellow, stateGreen;

// определите количество байтов, к которым вы хотите получить доступ

#define EEPROM_SIZE 1024

#define UDP_TX_PACKET_MAX_SIZE 860 //increase UDP size

// Определяем название и пароль точки доступа

const char* ssid = "WiFi name";

const char* password = "password";

char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // buffer to hold incoming packet,

char ReplyBuffer[] = "rewrite"; // a string to send back

// Создаём объект UDP соединения

AsyncUDP udp;

WiFiUDP Udp;

// Определяем порт

const uint16_t PORT = 8888;

IPAddress MyIP(192, 168, 0, 110);

IPAddress ServerIP(192, 168, 0, 107);

// Укажите IP-адрес шлюза

IPAddress gateway(192, 168, 0, 1);

IPAddress subnet(255, 255, 255, 0);

unsigned int localPort = 8888;

unsigned int UDPremotePort = 8888;

// Массив данных для отправки

//int SDATA[2] {1984, 2021};

byte mac[6] = {

0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01

};

String inputString; // Serial data input

String inputIPString; // UDP input IP

String helpString = "help\n";

String getMySettingsString = "1\n";

String setMyIPString = "2\n";

String setServerIPString = "3\n";

String getCommandExampleString = "4\n";

String yesString = "y\n";

String displayString = "d\n";

String Data;

//таймер для отправки данных

unsigned long timing;

//флаг - была ли одна корректная команда

uint8_t correct_comand = 0;

// Определяем callback функцию обработки пакета

void parsePacket(AsyncUDPPacket packet)

{

String msg = packet.readString();

//int first = packet.readStringUntil(',').toInt();

//int second = packet.readStringUntil('\n').toInt();

// Выводим преобразованные данные в последовательный порт

Data = msg;

// Отправляем данные клиенту

packet.printf("Пакет получен. Ответ: %s, %f bytes\n", MyIP, sizeof(packet));

}

void setup()

{

timing = millis();

// Инициируем последовательный порт

Serial.begin(115200);

Serial.println();

pinMode(PIN_TRIG, OUTPUT);

pinMode(PIN_ECHO, INPUT);

pinMode(LED_GREEN, OUTPUT);

pinMode(LED_YELLOW, OUTPUT);

pinMode(LED_ORANGE, OUTPUT);

// инициализировать EEPROM с предопределенным размером

EEPROM.begin(EEPROM_SIZE);

for (int addr = 0; addr < 4; addr++) {

MyIP[addr] = EEPROM.read(addr);

}

//Формируем MAC-адрес на основе MyIP

mac[0] = MyIP[0];

mac[1] = MyIP[1];

mac[2] = MyIP[2];

mac[3] = MyIP[3];

mac[4] = MyIP[2];

mac[5] = MyIP[3];

//IP адрес сервера

for (int addr = 4; addr < 8; addr++) {

ServerIP[addr - 4] = EEPROM.read(addr);

//Serial.println(EEPROM.read(addr));

}

if (!WiFi.config(MyIP, gateway, subnet)) {

Serial.println("STA Failed to configure");

}

// Инициируем точку доступа WiFi

WiFi.begin(ssid, password);

//IPAddress myIP = WiFi.softAPIP();

// Ждём подключения WiFi

while (WiFi.waitForConnectResult() != WL_CONNECTED) {

Serial.print(".");

delay(100);

}

Serial.println("Ready");

Serial.println("Send \"help\" to get more info");

Serial.println("Warning: Send data on mode No NL/CR");

Serial.println();

GetMySettings();

Serial.println();

// Инициируем сервер

if (udp.listen(PORT)) {

// При получении пакета вызываем callback функцию

udp.onPacket(parsePacket);

}

Serial.println("Server activated.");

Serial.println();

}

void loop()

{

// Если соединение WiFi прервано

if (WiFi.status() != WL_CONNECTED) {

setup(); // Вызываем функцию setup(), для повторного подключения

}

digitalWrite(PIN_TRIG, LOW);

delayMicroseconds(5);

digitalWrite(LED_YELLOW, HIGH);

digitalWrite(PIN_TRIG, HIGH);

// Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц.

delayMicroseconds(10);

digitalWrite(PIN_TRIG, LOW);

digitalWrite(LED_YELLOW, LOW);

//Serial.println("Прием и получение времени задержки импульсов.");

// Время задержки акустического сигнала на эхолокаторе.

Time = pulseIn(PIN_ECHO, HIGH);

Distance = (Time / 2) / 29.1;

if (Distance < Limit) {

digitalWrite(LED_GREEN, LOW);

digitalWrite(LED_ORANGE, HIGH);

stateYellow = 1;

stateGreen = 0;

} else {

digitalWrite(LED_GREEN, HIGH);

digitalWrite(LED_ORANGE, LOW);

stateYellow = 0;

stateGreen = 1;

}

//если в порт пришли данные - читаем их в строку

while (Serial.available()) {

char data = (char)Serial.read();

inputString += data;

delay(30);

}

//Выводим полученные данные

if (inputString.length()) {

Serial.print("-> ");

Serial.println(inputString);

}

//если запросили help - выводим меню

if (inputString.equals(helpString)) {

inputString = "";

printMenu();

} else if (inputString.equals(getMySettingsString)) { //если запросили текущие настройки - выводим текущие настройки

inputString = "";

GetMySettings();

} else if (inputString.equals(setMyIPString)) { //если запросили изменение IP модуля - выводим соответствующую форму

inputString = "";

setMyIP();

} else if (inputString.equals(setServerIPString)) { //если запросили изменение IP сервера - выводим соответствующую форму

inputString = "";

setServerIP();

} else {

inputString = "";

}

if (Data.length()) {

// read the packet into packetBufffer

int packetSize = Data.length();

Data.toCharArray(packetBuffer, packetSize);

Serial.println("Contents:");

Serial.println(packetBuffer);

if (packetBuffer[0] == 'p') {

if (packetBuffer[1] == ':') {

int lengthPacketBuffer = packetSize - 1;

Serial.println(lengthPacketBuffer);

//простейшая проверка на ошибки

bool error = false;

for (int i = 0; i < lengthPacketBuffer; i++)

if (packetBuffer[i] == '#') {

error = false;

break;

} else {

error = true;

continue;

}

//если нет ошибок

if (!error) {

correct_comand = 1;

String tempString = "";

for (int i = 2; i < lengthPacketBuffer; i++) {

if (packetBuffer[i] == '#') {

Limit = tempString.toInt();

break;

}

tempString += packetBuffer[i];

delay(10);

}

} else {

Serial.println("Unknown command");

}

} else {

Serial.println("Unknown command");

}

}

for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++)

packetBuffer[i] = ' '; //чистим буфер

Data = "";

}

Udp.beginPacket(ServerIP, UDPremotePort);

Udp.printf("D: %d; %d; %d;\n", Distance, stateYellow, stateGreen);

Udp.endPacket();

delay(1000);

}

void printMenu() {

Serial.println();

Serial.println("****************************************");

Serial.println("***********Send key to choice***********");

Serial.println();

Serial.println("1 - view current settings");

Serial.println("2 - set MyIP");

Serial.println("3 - set ServerIP");

Serial.println();

Serial.println("****************End menu****************");

Serial.println("****************************************");

}

//Функция задания MyIP

void setMyIP() {

String inputIPsubS1;

String inputIPsubS2;

String inputIPsubS3;

String inputIPsubS4;

Serial.println();

Serial.print("Current MyIP: ");

Serial.println(MyIP);

Serial.println("Send new MyIP address in 111.111.111.111 format");

//читаем полученные данные и сохранем их

while (!Serial.available()) {

delay(100);

}

//Serial.println(Serial.available());

while (Serial.available()) {

char data = (char)Serial.read();

inputIPString += data;

}

//Serial.println(inputIPString);

//удаляем лишние пробелы

inputIPString.trim();

//разбираем на числа

String tempString = inputIPString;

//Serial.println(inputIPString.length());

String tempSubS;

int i = 0;

int y = 0;

while (tempString.length()) {

if (tempString.charAt(i) != '.' && i < 3) {

tempSubS += tempString[i];

i++;

} else {

y++;

tempString = tempString.substring(i + 1);

if (y == 1)

inputIPsubS1 = tempSubS;

else if (y == 2)

inputIPsubS2 = tempSubS;

else if (y == 3)

inputIPsubS3 = tempSubS;

else if (y == 4)

inputIPsubS4 = tempSubS;

i = 0;

tempSubS = "";

}

}

inputIPString = "";

byte MyIPCh1 = inputIPsubS1.toInt();

byte MyIPCh2 = inputIPsubS2.toInt();

byte MyIPCh3 = inputIPsubS3.toInt();

byte MyIPCh4 = inputIPsubS4.toInt();

Serial.println ("New MyIP address is correct? y/n");

Serial.print (MyIPCh1);

Serial.print ('.');

Serial.print (MyIPCh2);

Serial.print ('.');

Serial.print (MyIPCh3);

Serial.print ('.');

Serial.println (MyIPCh4);

while (!Serial.available()) {

delay(100);

}

while (Serial.available()) {

char data = (char)Serial.read();

inputString += data;

}

if (inputString.equals(yesString)) {

IPAddress MyIP(MyIPCh1, MyIPCh2, MyIPCh3, MyIPCh4);

EEPROM.write(0, MyIPCh1);

delay(10);

EEPROM.write(1, MyIPCh2);

delay(10);

EEPROM.write(2, MyIPCh3);

delay(10);

EEPROM.write(3, MyIPCh4);

delay(10);

EEPROM.commit();

Serial.print("New MyIP: ");

Serial.println(MyIP);

Serial.println("New MyIP address is set. Need reset.");

} else

Serial.println("New MyIP address is not set");

}

//Функция настройки ServerIP

void setServerIP() {

String inputIPsubS1;

String inputIPsubS2;

String inputIPsubS3;

String inputIPsubS4;

Serial.println();

Serial.print("Current ServerIP: ");

Serial.println(ServerIP);

Serial.println("Send new ServerIP address in 111.111.111.111 format");

//читаем полученные данные и сохранем их

while (!Serial.available()) {

delay(100);

}

while (Serial.available()) {

char data = (char)Serial.read();

inputIPString += data;

}

//удаляем лишние пробелы

inputIPString.trim();

//разбираем на числа

String tempString = inputIPString;

String tempSubS;

int i = 0;

int y = 0;

while (tempString.length()) {

if (tempString.charAt(i) != '.' && i < 3) {

tempSubS += tempString[i];

i++;

}

else {

y++;

tempString = tempString.substring(i + 1);

if (y == 1)

inputIPsubS1 = tempSubS;

else if (y == 2)

inputIPsubS2 = tempSubS;

else if (y == 3)

inputIPsubS3 = tempSubS;

else if (y == 4)

inputIPsubS4 = tempSubS;

i = 0;

tempSubS = "";

}

}

inputIPString = "";

byte ServerIPCh1 = inputIPsubS1.toInt();

byte ServerIPCh2 = inputIPsubS2.toInt();

byte ServerIPCh3 = inputIPsubS3.toInt();

byte ServerIPCh4 = inputIPsubS4.toInt();

Serial.println ("New ServerIP address is correct? y/n");

Serial.print (ServerIPCh1);

Serial.print ('.');

Serial.print (ServerIPCh2);

Serial.print ('.');

Serial.print (ServerIPCh3);

Serial.print ('.');

Serial.println (ServerIPCh4);

while (!Serial.available()) {

delay(100);

}

while (Serial.available()) {

char data = (char)Serial.read();

inputString += data;

}

if (inputString.equals(yesString)) {

IPAddress ServerIP(ServerIPCh1, ServerIPCh2, ServerIPCh3, ServerIPCh4);

EEPROM.write(4, ServerIPCh1);

delay(10);

EEPROM.write(5, ServerIPCh2);

delay(10);

EEPROM.write(6, ServerIPCh3);

delay(10);

EEPROM.write(7, ServerIPCh4);

delay(10);

EEPROM.commit();

Serial.print("New ServerIP: ");

Serial.println(ServerIP);

Serial.println("New ServerIP address is set. Need reset.");

} else

Serial.println("New ServerIP address is not set");

}

void GetMySettings() { // Вывод текущих настроек модуля

Serial.print("MyMAC: ");

for (int i = 0; i < 6; i++) {

Serial.print(mac[i], HEX);

}

Serial.println();

Serial.print("MyIP: ");

Serial.print(MyIP);

Serial.println();

Serial.print("ServerIP: ");

Serial.println(ServerIP);

}



написать администратору сайта