{"id":14287,"url":"\/distributions\/14287\/click?bit=1&hash=1d1b6427c21936742162fc18778388fc58ebf8e17517414e1bfb1d3edd9b94c0","title":"\u0412\u044b\u0440\u0430\u0441\u0442\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0437\u0430 \u0433\u043e\u0434","buttonText":"","imageUuid":""}

LoRaWAN + Arduino: создание системы мониторинга лесных парков с использованием Arduino и протокола LoRaWAN

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

В начале программы подключаются необходимые библиотеки, такие как "lmic.h", "hal/hal.h" и "SPI.h". Затем задаются настройки сети LoRaWAN, такие как адрес устройства (DEV_ADDR), сетевой ключ (NWK_SKEY) и ключ приложения (APP_SKEY).

Далее определены пины, к которым подключены датчики температуры, влажности и освещенности. В данном случае, используются пины A0, A1 и A2 соответственно.

Функция sendData() отвечает за считывание данных с датчиков и отправку их в виде пакета данных. Значения с датчиков преобразуются в соответствующие единицы измерения и записываются в буфер payload. Затем данные отправляются с помощью функции LMIC_setTxData2().

Функция onEvent() является обработчиком событий в сети LoRaWAN. В данном коде она используется для вывода информации о статусе отправки данных.

В функции setup() происходит инициализация модуля LoRaWAN и настройка параметров передачи данных. Устанавливаются сессионные ключи, выбирается поддиапазон и устанавливается скорость передачи данных.

В функции loop() осуществляется основной цикл программы. С помощью функции os_runloop_once() обрабатываются события LoRaWAN. Затем вызывается функция sendData() для считывания и отправки данных. После этого происходит задержка в 60 секунд с помощью функции delay(), и цикл повторяется снова. Таким образом, данные с датчиковотправляютсяк аждую минуту.

Код:

Язык программирования: Python

#include <lmic.h> #include <hal/hal.h> #include <SPI.h> // Настройки сети LoRaWAN #define DEV_ADDR "01234567" // Адрес устройства LoRaWAN #define NWK_SKEY "0123456789ABCDEF0123456789ABCDEF" // Сетевой ключ #define APP_SKEY "FEDCBA9876543210FEDCBA9876543210" // Ключ приложения // Пины для подключения модуля LoRaWAN const lmic_pinmap lmic_pins = { .nss = 10, .rxtx = LMIC_UNUSED_PIN, .rst = 9, .dio = {2, 3, LMIC_UNUSED_PIN}, }; // Параметры датчиков const int TEMPERATURE_PIN = A0; const int HUMIDITY_PIN = A1; const int LIGHT_PIN = A2; // Функция отправки данных void sendData() { float temperature = analogRead(TEMPERATURE_PIN) * 0.48828125; // Преобразование значения АЦП в градусы Цельсия float humidity = analogRead(HUMIDITY_PIN) * 0.09765625; // Преобразование значения АЦП в проценты влажности int light = analogRead(LIGHT_PIN); // Значение освещенности // Формирование пакета данных byte payload[10]; payload[0] = highByte(temperature); payload[1] = lowByte(temperature); payload[2] = highByte(humidity); payload[3] = lowByte(humidity); payload[4] = highByte(light); payload[5] = lowByte(light); // Отправка данных LMIC_setTxData2(1, payload, sizeof(payload) - 1, 0); } // Обработчик событий LoRaWAN void onEvent(ev_t event) { switch (event) { case EV_TXCOMPLETE: Serial.println(F("Данные успешно отправлены")); break; default: Serial.println(F("Событие LoRaWAN: ")); Serial.println(event); break; } } void setup() { Serial.begin(9600); // Инициализация модуля LoRaWAN os_init(); LMIC_reset(); LMIC_setClockError(1 * MAX_CLOCK_ERROR / 100); LMIC_setAdrMode(1); // Включение динамической настройки скорости передачи данных // Настройка сессионных ключей LMIC_setSession(0x1, DEV_ADDR, NWK_SKEY, APP_SKEY); // Настройка поддиапазона (subband) и скорости передачи данных LMIC_selectSubBand(1); // Выбор поддиапазона 1 LMIC_setDrTxpow(DR_SF7, 14); // Установка скорости передачи SF7 и мощности передатчика 14 dBm } void loop() { os_runloop_once(); sendData(); delay(60000); // Отправка данных каждые 60 секунд }

Добавим датчик CO2:

#include <lmic.h> #include <hal/hal.h> #include <SPI.h> // Настройки сети LoRaWAN #define DEV_ADDR "01234567" // Адрес устройства LoRaWAN #define NWK_SKEY "0123456789ABCDEF0123456789ABCDEF" // Сетевой ключ #define APP_SKEY "FEDCBA9876543210FEDCBA9876543210" // Ключ приложения // Пины для подключения модуля LoRaWAN const lmic_pinmap lmic_pins = { .nss = 10, .rxtx = LMIC_UNUSED_PIN, .rst = 9, .dio = {2, 3, LMIC_UNUSED_PIN}, }; // Параметры датчиков const int TEMPERATURE_PIN = A0; const int HUMIDITY_PIN = A1; const int LIGHT_PIN = A2; const int CO2_PIN = A3; // Функция отправки данных void sendData() { float temperature = analogRead(TEMPERATURE_PIN) * 0.48828125; // Преобразование значения АЦП в градусы Цельсия float humidity = analogRead(HUMIDITY_PIN) * 0.09765625; // Преобразование значения АЦП в проценты влажности int light = analogRead(LIGHT_PIN); // Значение освещенности int co2 = analogRead(CO2_PIN); // Значение CO2 // Формирование пакета данных byte payload[12]; payload[0] = highByte(temperature); payload[1] = lowByte(temperature); payload[2] = highByte(humidity); payload[3] = lowByte(humidity); payload[4] = highByte(light); payload[5] = lowByte(light); payload[6] = highByte(co2); payload[7] = lowByte(co2); // Отправка данных LMIC_setTxData2(1, payload, sizeof(payload) - 1, 0); } // Обработчик событий LoRaWAN void onEvent(ev_t event) { switch (event) { case EV_TXCOMPLETE: Serial.println(F("Данные успешно отправлены")); break; default: Serial.println(F("Событие LoRaWAN: ")); Serial.println(event); break; } } void setup() { Serial.begin(9600); // Инициализация модуля LoRaWAN os_init(); LMIC_reset(); LMIC_setClockError(1 * MAX_CLOCK_ERROR / 100); LMIC_setAdrMode(1); // Включение динамической настройки скорости передачи данных // Настройка сессионных ключей LMIC_setSession(0x1, DEV_ADDR, NWK_SKEY, APP_SKEY); // Настройка поддиапазона (subband) и скорости передачи данных LMIC_selectSubBand(1); // Выбор поддиапазона 1 LMIC_setDrTxpow(DR_SF7, 14); // Установка скорости передачи SF7 и мощности передатчика 14 dBm } void loop() { os_runloop_once(); sendData(); delay(60000); // Отправка данных каждые 60 секунд }

В данном коде я добавил датчик CO2, подключенный к пину A3. Значения CO2 считываются с помощью функции analogRead() и включаются в пакет данных, отправляемый по сети LoRaWAN. Пакет данных теперь состоит из 12 байтов, где последние 2 байта представляют значения CO2.

0
Комментарии
-3 комментариев
Раскрывать всегда