В этом проекте мы создадим шлюз и узел LoRa на основе платы ESP32. Проект по сути представляет собой систему мониторинга датчиков на сервере Thingspeak с использованием платы ESP32 и модуля LoRa SX1278 или SX1276.
За последние пару лет появилось несколько коммуникационных технологий для взаимодействия между устройствами Интернета вещей (IoT). Наиболее популярными из них являются технологии Wi-Fi и Bluetooth. Но у них есть несколько ограничений, таких как ограниченный радиус действия, ограниченное количество точек доступа и высокое энергопотребление. Поэтому компания Semtech представила технологию LoRa, чтобы решить все эти проблемы. Используя одну батарею, устройство на основе данной технологии работает более года.
Итак, в этом проекте IoT мы разработаем шлюз ESP32 LoRa, а также узел датчика ESP32 LoRa для беспроводного мониторинга показаний датчика на расстоянии нескольких километров. Отправитель будет считывать данные о влажности и температуре с помощью датчика DHT11. Затем он передает данные по радиоканалу с использованием технологии LoRa. Данные принимаются модулем приемника. Затем приемник будет отправлять данные на сервер Thingspeak через определенный интервал.
Если вы не работали с технологией LoRa с помощью модуля ESP32, то советуем прочитать статью на нашем сайте про подключение модуля LoRa SX1278 к ESP32.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик температуры и влажности DHT11/DHT22 (купить на AliExpress).
- Модуль LoRa SX1278 (433MHz) – 2 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Установка необходимых библиотек
Для программирования платы ESP32 с помощью Arduino IDE проекту требуется несколько библиотек.
1. Библиотека DHT11
Для считывания температуры и влажности нам понадобится любой датчик температуры и влажности. Для этого DHT11 — лучший и дешевый датчик. Для работы с ним нужно установить библиотеку DHT11. Загрузите библиотеку по ссылке ниже и добавьте в ее Arduino IDE.
2. Библиотека LoRa
Нам нужна библиотека Arduino для отправки и получения данных с использованием радио LoRa. Библиотека поддерживает такие модули, как Semtech SX1276, SX1277, SX1278, SX1279, а также HopeRF RFM95W, RFM96W и RFM98W.
Схемы проекта
Теперь давайте рассмотрим схему отправителя и приемника для построения шлюза и узла LoRa на основе платы ESP32. Я собрал обе схемы на макетной плате. Вы можете сделать это на печатной плате, если хотите.
Узел LoRa на ESP32
Схема узла LoRa на основе платы ESP32 с датчиком DHT11 приведена на следующем рисунке. Эта часть работает как передатчик. Данные о влажности и температуре считываются датчиком влажности и температуры DHT11 и передаются с помощью радио LoRa .
Подключение довольно простое. Схема соединений между модулем LoRa SX1278 и платой ESP32 приведена в следующей таблице.
Контакты ESP32 | Контакты SX1278 |
GND | GND |
3.3V | VCC |
D5 | NSS |
D23 | MOSI |
D19 | MISO |
D18 | SCK |
D14 | RST |
D2 | DIO0 |
Аналогично подключите цифровой выходной контакт датчика DHT11 к GPIO4 ESP32. Подключите VCC DHT11 к 3,3 В ESP32, а GND датчика - к GND ESP32.
Шлюз LoRa на ESP32 с подключением к Thingspeak
Схема шлюза LoRa на основе платы ESP32 и модуля SX1278 представлена на следующем рисунке. Эта часть работает как приемник. Данные о влажности и температуре принимаются с помощью радио LoRa и загружаются на сервер Thingspeak.
Подключение ESP32 и модуля LoRa SX1278 такое же, как указано выше.
Настройка Thingspeak
Чтобы отслеживать данные датчиков на сервере Thingspeak, вам сначала нужно настроить Thingspeak. Чтобы настроить сервер Thingspeak, посетите https://thingspeak.com/. Создайте учетную запись или просто войдите в нее, если вы создали учетную запись ранее. Затем создайте новый канал со следующими данными.
Стоит отметить что Thingspeak является очень удобным и популярным сервисом для различных проектов Интернета вещей и все проекты на нашем сайте с его использованием вы можете посмотреть по следующей ссылке.
Код узла LoRa
После сборки схемы узла LoRa на макетной плате скопируйте следующий код и загрузите его на плату ESP32. Перед загрузкой обязательно внесите изменения в частоту LoRa в соответствии с регионом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#define BAND 433E6 //433E6 for Asia, 866E6 for Europe, 915E6 for North America //Libraries for LoRa #include <SPI.h> #include <LoRa.h> //Libraries for LoRa #include "DHT.h" #define DHTPIN 4 //pin where the dht11 is connected DHT dht(DHTPIN, DHT11); //define the pins used by the LoRa transceiver module #define ss 5 #define rst 14 #define dio0 2 #define BAND 433E6 //433E6 for Asia, 866E6 for Europe, 915E6 for North America //packet counter int readingID = 0; int counter = 0; String LoRaMessage = ""; float temperature = 0; float humidity = 0; //Initialize LoRa module void startLoRA() { LoRa.setPins(ss, rst, dio0); //setup LoRa transceiver module while (!LoRa.begin(BAND) && counter < 10) { Serial.print("."); counter++; delay(500); } if (counter == 10) { // Increment readingID on every new reading readingID++; Serial.println("Starting LoRa failed!"); } Serial.println("LoRa Initialization OK!"); delay(2000); } void startDHT() { if (isnan(humidity) || isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); return; } } void getReadings(){ humidity = dht.readHumidity(); temperature = dht.readTemperature(); Serial.print(F("Humidity: ")); Serial.print(humidity); Serial.print(F("% Temperature: ")); Serial.print(temperature); Serial.println(F("°C ")); } void sendReadings() { LoRaMessage = String(readingID) + "/" + String(temperature) + "&" + String(humidity) ; //Send LoRa packet to receiver LoRa.beginPacket(); LoRa.print(LoRaMessage); LoRa.endPacket(); Serial.print("Sending packet: "); Serial.println(readingID); readingID++; Serial.println(LoRaMessage); } void setup() { //initialize Serial Monitor Serial.begin(115200); dht.begin(); startDHT(); startLoRA(); } void loop() { getReadings(); sendReadings(); delay(500); } |
Код шлюза LoRa
Теперь вы можете скопировать код ниже и загрузить код шлюза на плату ESP32. В коде ниже внесите изменения в WiFi SSID, пароль и ключ API Thingspeak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
String apiKey = "14K8UL2QEK8BTHN6"; // Enter your Write API key from ThingSpeak const char *ssid = "Alexahome"; // replace with your wifi ssid and wpa2 key const char *password = "12345678"; // Import Wi-Fi library #include <WiFi.h> //Libraries for LoRa #include <SPI.h> #include <LoRa.h> //define the pins used by the LoRa transceiver module #define ss 5 #define rst 14 #define dio0 2 #define BAND 433E6 //433E6 for Asia, 866E6 for Europe, 915E6 for North America // Replace with your network credentials String apiKey = "14K8UL2QEK8BTHN6"; // Enter your Write API key from ThingSpeak const char *ssid = "Alexahome"; // replace with your wifi ssid and wpa2 key const char *password = "12345678"; const char* server = "api.thingspeak.com"; WiFiClient client; // Initialize variables to get and save LoRa data int rssi; String loRaMessage; String temperature; String humidity; String readingID; // Replaces placeholder with DHT values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE") { return temperature; } else if(var == "HUMIDITY") { return humidity; } else if (var == "RRSI") { return String(rssi); } return String(); } void setup() { Serial.begin(115200); int counter; //setup LoRa transceiver module LoRa.setPins(ss, rst, dio0); //setup LoRa transceiver module while (!LoRa.begin(BAND) && counter < 10) { Serial.print("."); counter++; delay(2000); } if (counter == 10) { // Increment readingID on every new reading Serial.println("Starting LoRa failed!"); } Serial.println("LoRa Initialization OK!"); delay(2000); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(2000); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // Read LoRa packet and get the sensor readings void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Lora packet received: "); while (LoRa.available()) // Read packet { String LoRaData = LoRa.readString(); Serial.print(LoRaData); int pos1 = LoRaData.indexOf('/'); int pos2 = LoRaData.indexOf('&'); readingID = LoRaData.substring(0, pos1); // Get readingID temperature = LoRaData.substring(pos1 +1, pos2); // Get temperature humidity = LoRaData.substring(pos2+1, LoRaData.length()); // Get humidity } rssi = LoRa.packetRssi(); // Get RSSI Serial.print(" with RSSI "); Serial.println(rssi); } if (client.connect(server, 80)) // "184.106.153.149" or api.thingspeak.com { String postStr = apiKey; postStr += "&field1="; postStr += String(readingID); postStr += "&field2="; postStr += String(temperature); postStr += "&field3="; postStr += String(humidity); postStr += "&field4="; postStr += String(rssi); postStr += "\r\n\r\n\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); } //delay(30000); } |
Мониторинг данных датчиков на сервере Thingspeak
После загрузки кода вы можете открыть Serial Monitor (последовательный монитор) на обоих частях нашего проекта. Вы увидите следующий вывод, если код и соединения верны.
Теперь вы можете посетить окно приватного просмотра Thingspeak (Private View). Там вы можете увидеть, что данные по номеру пакета, температуре, влажности и шлюзу загружаются с интервалом в 15 секунд. Вы можете изменить функцию задержки в коде, чтобы изменить время получения данных.
42 просмотров