Lora Smart Agriculture & Remote Monitoring System

Lora Smart Agriculture & Remote Monitoring System

julio 29, 2020

Lora-Smart-Agriculture-Remote-Monitoring-System
En este proyecto, aprenderemos cómo construir un IoT Lora Smart Agriculture & Remote Monitoring System, utilizaremos el sensor de humedad del suelo LoRa y el módulo Maduino Lora.

1. Descripción general: Agricultura inteligente basada en LoRa de IoT

En este proyecto, vamos a aprender sobre IoT LoRa Based Smart Agriculture & Remote Monitoring System. La agricultura inteligente significa monitorear las condiciones ambientales que influyen en la producción de cultivos y rastrear los indicadores de salud del ganado. La tecnología de Internet de las cosas (IoT) basada en LoRa para la agricultura permite eficiencias que reducen el impacto ambiental, maximizan el rendimiento y minimizan los gastos. Casos de uso de agricultura inteligente basados enDispositivos LoRay elProtocolo LoRaWANhan demostrado mejoras significativas, como una reducción del 50% del agua para las granjas comerciales.
 
En este proyecto, utilizaremos el sensor de humedad del suelo LoRa basado en el microcontrolador Atmega328P, el módulo LoRa RFM95 y el sensor de humedad / temperatura AHT10. El sensor digital de humedad y temperatura AHT10 mide la temperatura y la humedad del aire local. El sensor capacitivo de humedad del suelo medirá la humedad del suelo. Por lo tanto, todos los datos medidos se pueden enviar de forma inalámbrica hasta 15 km de distancia y pueden ser leídos por el receptor. Tanto el transmisor como el receptor están diseñados utilizando el módulo LoRa.
IoT-LoRa-Based-Smart-Agriculture-Remote-Monitoring-System

El transmisor funciona en modo de bajo consumo. Usando una batería AAA, el dispositivo puede funcionar durante un año. La potencia del dispositivo se puede controlar y los intervalos de envío de datos se pueden aumentar según los requisitos. Por lo tanto, la ventaja de esta tecnología incluye cualidades inalámbricas de largo alcance y baja potencia que permiten el uso de sensores de bajo costo para enviar datos desde la granja a la nube, donde se pueden analizar para mejorar las operaciones.

2. Lista de materiales

Los siguientes son los componentes necesarios para realizar este proyecto de agricultura inteligente basado en la red LoRa de IoT. Necesitamos algunos sensores LoRa Agriculture como el sensor de humedad del suelo para medir la humedad del suelo. Podemos medir el parámetro ambiental como la humedad y la temperatura circundantes. Para este AHT10 es el sensor más adecuado.
 
En lugar de comprar sensores separados y ensamblarlos en una placa es una tarea difícil y que requiere mucho tiempo. Así que compré una placa de sensor combinada ensamblada en una placa PCB. Tanto la placa PCB de la parte del transmisor como la del receptor con el componente ensamblado en ella se pueden comprar en el siguiente enlace.
Materiales requeridos
No. Nombre del material Descripción Cantidad Enlace
1 Sensor de humedad del suelo Lora Transmisor 1 //www.makerfabs.com/lora-soil-moisture-sensor.html
2 Maduino Lora Radio Receptor 1 //www.makerfabs.com/maduino-lora-radio-433m-868m-915m.html
3 CP2104 Convertidor USB2UART Módulo FTDI 1 //www.makerfabs.com/cp2104-usb-to-serial-converter.html

3. Transmisor LoRa: sensor de humedad del suelo + sensor de humedad / temperatura AHT10

La parte del transmisor consta de unSensor de humedad del suelo LorayAHT10 Sensor de humedad / temperatura.El microcontrolador utilizado en esta placa es Atmeel Atmega328P que soporta la programación Arduino. El sensor AHT10 recoge la temperatura y humedad del aire local. ElSensor capacitivo de humedad del sueloDetecta la humedad del suelo. El sensor se basa en 555-Timer IC. La radio Lora y el sensor de humedad del suelo deben tener la misma frecuencia de trabajo. De lo contrario, no recibe nada de otro. El transmisor transmite los datos del entorno local a la puerta de enlace utilizando el módulo LoRaRFM95.
LoRa-Suelo-Humedad-Sensor
El transmisor Lora funciona con un par de baterías AAA. El dispositivo transmite los datos regularmente después del intervalo de unos minutos y luego pasa al modo de suspensión para ahorrar energía de la batería. La función del sensor podría apagarse o solo se puede encender durante un corto período de tiempo según el código y la configuración del hardware. Por lo tanto, debido al modo de suspensión y al modo de bajo consumo de energía, la duración de la batería se puede extender hasta varios meses. El sensor capacitivo de humedad del suelo está recubierto con pintura impermeable, por lo que no tiene ningún efecto de corrosión, incluso el sensor se sumerge en el suelo durante mucho tiempo. El módulo se adapta a las aplicaciones parasmart-farm, riego, agricultura, etc.
 
El chip ATmega328 tienegestor de arranque predeterminado de Arduinoy por lo tanto se puede programar fácilmente usando Arduino IDE. Solo necesitamos un módulo convertidor de USB a TTL.

3.1 Consumo de energía y modo de suspensión

Consumo de energía de MCU en1MHz, 1.8V, 25°C.
- Modo activo: 0.2mA
- Modo de apagado: 0.1μA
Modo de ahorro de energía: 0.75μA (incluyendo 32kHz RTC)

4. Receptor Lora: Radio Maduino Lora (433M/868M/915M)

El receptor de radio Maduino Lora es unplaca base basada en elATmega328yMódulo LoRa RFM95 de 433MHZ/ 868MHz/ 915MHz. La radio Maduino LoRa permite al usuario enviar datos y alcanzar rangos extremadamente largos a bajas velocidades de datos. Proporciona comunicación de espectro ensanchado de ultra largo alcance y alta inmunidad a las interferencias al tiempo que minimiza el consumo de corriente. Tiene el gestor de arranque Arduino pro mini 3.3V 8MHz en esta placa y utiliza el CP2104 como USB a serie para cargar el código usando Arduino IDE. En este proyecto de Agricultura Inteligente LoRa, lo usaremos como unPuerta de enlace del receptor.
Maduino-Lora-Módulo
Funciones:
- Voltaje de entrada BAT: 3.4-4.2V
- Sistema de control de potencia integrado
- 127 dB Rango dinámico RSSI
- Utiliza la banda ISM sin licencia: "European ISM" @ 433MHz/868MHz/915MHz
- +5 a +20 dBm hasta 100 mW Capacidad de salida de potencia (salida de potencia seleccionable en software)
- ~100mA Pico durante la transmisión de +20dBm, ~30mA durante la escucha activa de radio
- Rango de aprox.2KM, dependiendo de las obstrucciones, la frecuencia, la antena y la potencia de salida

5. Configuración de la parte transmisora de humedad del suelo Lora

Para cargar el código en la parte del transmisor, debe soldar un pin de cabezal macho de 5 pines. Así que primero suelde el pin de cabecera macho aquí. O puedes usar MakerfabsCP2104 Convertidor USB a seriedirectamente, que está especialmente diseñado para la programación del sensor de humedad del suelo Lora.
Soldar-Lora-Suelo-Humedad-Sensor

Ahora necesita conectar el módulo USB a UART para cargar el código del chip Atmega328 usando el IDE de Arduino. Realice una conexión entre el módulo USB a UART de la siguiente manera. Puede usar una herramienta USB a serie o usar directamenteCP2014 USB2UART.
Conexión de hardware
Sensor de humedad del suelo Lora
Herramienta USB a UART
3V3
3V3
GND
GND
RX
TXD
TX
RXD
Conexión de hardware
Uso-CP2104-USB2UART-a-Lora-Soil-Moisture

Tenga en cuenta que el DTR en el convertidor de USB a UART es necesario para conectarse al"Restablecer"pin para la carga de bocetos de Arduino. Si no hay DTR, es posible que deba presionar el botón"reiniciar"manualmente para cargar el código.

Instale la batería AAA en la parte posterior del módulo.

 
Ahora, para programar la placa utilizando Arduino IDE para la placa de sensor de agricultura Lora, ya hay una placa de paquete predeterminada instalada en el IDE de Arduino.
 
En el menú superior del IDE de Arduino, seleccioneHerramientas→ Board→ Arduino Pro o Pro Mini.Seleccione tambiénHerramientasProcesadorAtmega328P (3.3V, 8Mhz).
Lora-Suelo-Humedad-Sensor-Programación

6. Configuración de Lora Receiver Part

El receptor Lora no necesita ningún módulo USB a UART, ya que se puede programar directamente mediante un cable de datos Micro-USB.
 
La placa utiliza el mismo paquete para la programación. Así que seleccione la placa Arduino Pro o Pro mini & ATmega328P (3.3V, 8Mhz).
Maduino-Lora-Programación

7. Código del transmisor

El código del transmisor se divide en 3 archivos:
1. Archivo Main.ino
2. Archivo I2C_AHT10.cpp
3. Archivo I2C_AHT10.h

 
Pero antes de eso, debe agregar la biblioteca RFM95 al IDE de Arduino. Así que descargue la biblioteca RFM95 desde el siguiente enlace y agréguela a la carpeta de la biblioteca. DescargarBiblioteca LoRa RFM95.
 
Modifique la macro de frecuencia según su placa es 433Mhz o 868Mhz o 915Mhz.
 
Si tu tabla Lora es433MHz:
#define RF95_FREQ 433.0

Si tu tabla Lora es868MHz:
#define RF95_FREQ 868.0

Si tu tabla Lora es915MHz:
#define RF95_FREQ 915.0


7.1. Archivo Main.ino

#include 
#include "RH_RF95.h"

#include "I2C_AHT10.h"
#include 
AHT10 humedadSensor;

int sensorPin = A2;    Seleccione el pin de entrada para el potenciómetro
int sensorValue = 0;  variable para almacenar el valor procedente del sensor
int sensorPowerCtrlPin = 5;

sensor voidPowerOn(vacío)
{
  digitalWrite(sensorPowerCtrlPin, HIGH);//Encendido del sensor
}
void sensorPowerOff(void)
{
  digitalWrite(sensorPowerCtrlPin, LOW);//Encendido del sensor
}

#define RFM95_CS 10
#define RFM95_RST 4
#define RFM95_INT 2

Cambie a 434.0 u otra frecuencia, ¡debe coincidir con el freq de RX!
#define RF95_FREQ 433.0

Instancia única del controlador de radio
RH_RF95 rf95(RFM95_CS, RFM95_INT);

void setup()
{

pinMode(RFM95_RST, SALIDA);
  digitalWrite(RFM95_RST, LOW);
  retraso(100);
  digitalWrite(RFM95_RST, ALTA);

pinMode(sensorPowerCtrlPin, OUTPUT);
  digitalWrite(sensorPowerCtrlPin, LOW);//Encendido del sensor
  sensorPowerOn();
  pinMode(sensorPin, INPUT);

mientras que (! Serie);
  Serial.begin(115200);
  retraso(100);

Wire.begin(); Únete al autobús I2C
  Compruebe si el AHT10 reconocerá
  if (humiditySensor.begin() == false)
  {
    Serial.println("AHT10 no detectado. Por favor, compruebe el cableado. Congelación.");
    mientras que (1);
  }
  más
    Serial.println("AHT10 reconocido.");

Serial.println("Marduino LoRa TX Test!");

Restablecimiento manual
  digitalWrite(RFM95_RST, LOW);
  retraso(10);
  digitalWrite(RFM95_RST, ALTA);
  retraso(10);

while(!rf95.init()) {
    Serial.println("LoRa radio init failed");
    mientras que (1);
  }
  Serial.println("LoRa radio init OK!");

rf95.setModemConfig(Bw125Cr48Sf4096);

Los valores predeterminados después de init son 434.0MHz, modulación GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    mientras que (1);
  }
  Serial.print("Establecer frecuencia en: ");
  Serial.println(RF95_FREQ);

Los valores predeterminados después de la entrada son 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/símbolo, CRC activado

La potencia predeterminada del transmisor es de 13dBm, utilizando PA_BOOST.
  Si está utilizando módulos RFM95/96/97/98 que utilizan el pin del transmisor PA_BOOST, entonces
  puede ajustar las potencias del transmisor de 5 a 23 dBm:
  rf95.setTxPower(23, false);

dht.begin();
}

int16_t packetnum = 0;  contador de paquetes, incrementamos por xmission
temperatura de flotación = 0.0;//
humedad flotante = 0.0;

void loop()
{

¡La lectura de la temperatura o la humedad tarda unos 250 milisegundos!
  Las lecturas del sensor también pueden ser de hasta 2 segundos "antiguas" (es un sensor muy lento)
  humedad flotante = 6.18;//dht.readHumidity();
  Leer la temperatura como Celsius (valor predeterminado)

sensorPowerOn();//
  retraso(100);
  sensorValue = analogRead(sensorPin);
  retraso(200);

if (humiditySensor.available() == true)
  {
    Obtenga el nuevo valor de temperatura y humedad
    temperatura = humedadSensor.getTemperature();
    humedad = humedadSensor.getHumidity();

Imprimir los resultados
    Serial.print("Temperatura: ");
    Serial.print (temperatura, 2);
    Serial.print(" C\t");
    Serial.print("Humedad: ");
    Serial.print (humedad, 2);
    Serial.println("% HR");

}
    Compruebe si alguna lectura falló y salga temprano (para intentarlo de nuevo).
    if (isnan(humedad) || isnan(temperatura)) {
    Serial.println(F("¡Error al leer desde el sensor AHT!"));
    devolución;
  }

retraso(100);
  sensorPowerOff();

Serial.print(F("ADC de humedad : "));
  Serial.println(sensorValue);

Serial.print(F("Humedad: "));
  Serial.print (humedad);
  Serial.print(F("% Temperatura: "));
  Serial.print (temperatura);
  Serial.println("La humedad es " + (cadena)humedad);
  Serial.println("La temperatura es " + (cadena)temperatura);

String message = "#"+(String)packetnum+" Humedad:"+(String)humidity+"% Temperature:"+(String)temperature+"C"+" ADC:"+(String)sensorValue;
  Serial.println(mensaje);
  packetnum++;
  Serial.println("Transmitir: Enviar a rf95_server");

Enviar un mensaje a rf95_server

uint8_t radioPacket[message.length()+1];
  message.toCharArray(radioPacket, message.length()+1);

radioPacket[message.length()+1]= '\0';

Serial.println("Enviando..."); retraso(10);
  rf95.send((uint8_t *)radioPacket, message.length()+1);
  Serial.println("Esperando a que se complete el paquete..."); retraso(10);
  rf95.waitPacketSent();
  Ahora espera una respuesta
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

Serial.println("Esperando respuesta..."); retraso(10);
  if(rf95.waitAvailableTimeout(8000))
  {
    Debería ser un mensaje de respuesta para nosotros ahora
    if (rf95.recv(buf, &len))
  {
     Serial.print("Got reply: ");
     Serial.println((char*)buf);
     Serial.print("RSSI: ");
     Serial.println(rf95.lastRssi(), DEC);
    }
    más
    {
     Serial.println("Error de recepción");
    }
  }
  más
  {
    Serial.println("Sin respuesta, ¿hay un oyente alrededor?");
  }
  retraso(1000);
}


7.2. Archivo I2C_AHT10.cpp

#include "I2C_AHT10.h"

/*--------------------------- Estado del dispositivo ------------------------------*/
bool AHT10::begin(TwoWire &wirePort)
{
    _i2cPort = &wirePort; //Toma el puerto en el que el usuario desea comunicarse

_deviceAddress = AHT10_DEFAULT_ADDRESS; Esperábamos que el AHT10 admitiera dos direcciones, pero no parece

if (isConnected() == false)
        devolver false;

Espere 40 ms después del encendido antes de leer la temperatura o la humedad. Hoja de datos pg 8
    retraso(40);

Compruebe si la broca calibrada está configurada. Si no, inicie el sensor.
    if (isCalibrated() == false)
    {
        Enviar 0xBE0800
        initialize();

Activar inmediatamente una medición. Enviar 0xAC3300
        triggerMeasurement();

retraso(75); Espere a que se complete la medición

uint8_t contador = 0;
        while (isBusy())
        {
            retraso(1);
            if (contador++ > 100)
                retorno (falso); Darse por vencido después de 100 ms
        }

Esta secuencia de calibración no está completamente probada. No está claro cómo y cuándo se borra el bit cal
        Esto parece funcionar, pero no es fácil de probar
        if (isCalibrated() == false)
        {
            retorno (falso);
        }
    }

Compruebe que se ha configurado el bit cal
    if (isCalibrated() == false)
        devolver false;

Marcar todos los datos como nuevos (no leídos antes)
    sensorQueried.temperature = true;
    sensorQueried.moisture = true;

devolver verdadero;
}

Hacer ping a la dirección I2C del AHT10
Si obtenemos una respuesta, nos estamos comunicando correctamente con el AHT10
bool AHT10::isConnected()
{
    _i2cPort->beginTransmission(_deviceAddress);
    if (_i2cPort->endTransmission() == 0)
        devolver verdadero;

Si IC no respondió, déle 20 ms más para el inicio de encendido
    Hoja de datos pg 7
    retraso(20);

_i2cPort->beginTransmission(_deviceAddress);
    if (_i2cPort->endTransmission() == 0)
        devolver verdadero;

devolver false;
}

/*------------------------ Ayudantes de medición ---------------------------*/

uint8_t AHT10::getStatus()
{
    _i2cPort->requestFrom(_deviceAddress, (uint8_t)1);
    if (_i2cPort->available())
        return (_i2cPort->read());
    retorno (0);
}

Devuelve el estado del bit cal en el byte de estado.
bool AHT10::isCalibrated()
{
    return (getStatus() & (1 beginTransmission(_deviceAddress);
    _i2cPort->write(sfe_aht10_reg_initialize);
    _i2cPort->write(0x80);
    _i2cPort->write(0x00);
    if (_i2cPort->endTransmission() == 0)
        devolver verdadero;
    devolver false;
}

bool AHT10::triggerMeasurement()
{
    _i2cPort->beginTransmission(_deviceAddress);
    _i2cPort->write(sfe_aht10_reg_measure);
    _i2cPort->write(0x33);
    _i2cPort->write(0x00);
    if (_i2cPort->endTransmission() == 0)
        devolver verdadero;
    devolver false;
}

Carga el
void AHT10::readData()
{
    Borrar datos anteriores
    sensorData.temperature = 0;
    sensorData.humedad = 0;

if (_i2cPort->requestFrom(_deviceAddress, (uint8_t)6) > 0)
    {
        uint8_t estado = _i2cPort->read();

uint32_t entrante = 0;
        entrante |= (uint32_t)_i2cPort->read() read() read(); 

entrante |= midByte;
        sensorData.moisture = >> entrante 4;

sensorData.temperature = (uint32_t)midByte read() read()  20
        sensorData.temperature = sensorData.temperature & ~(0xFFF00000);

Marcar datos como nuevos
        sensorQueried.temperature = false;
        sensorQueried.moisture = false;
    }
}

Activa una medición si no se ha iniciado previamente y, a continuación, devuelve false
Si se ha iniciado la medición, compruebe si está completa.
Si no está completado, devuelve false
Si está completa, readData(), marque la medición como no iniciada, devuelva true
bool AHT10::available()
{
    if (measurementStarted == false)
    {
        triggerMeasurement();
        measurementStarted = true;
        retorno (falso);
    }

if (isBusy() == true)
    {
        retorno (falso);
    }

readData();
    measurementStarted = false;
    retorno (verdadero);
}

bool AHT10::softReset()
{
    _i2cPort->beginTransmission(_deviceAddress);
    _i2cPort->write(sfe_aht10_reg_reset);
    if (_i2cPort->endTransmission() == 0)
        devolver verdadero;
    devolver false;
}

/*------------------------- Realizar mediciones ----------------------------*/

float AHT10::getTemperature()
{
    if (sensorQueried.temperature == true)
    {
        Tenemos datos antiguos, así que activa nuevas mediciones
        triggerMeasurement();

retraso(75); Espere a que se complete la medición

uint8_t contador = 0;
        while (isBusy())
        {
            retraso(1);
            if (contador++ > 100)
                retorno (falso); Darse por vencido después de 100 ms
        }

readData();
    }

De la hoja de datos pg 8
    float tempCelsius = ((float)sensorData.temperature / 1048576) * 200 - 50;

Marcar datos como antiguos
    sensorQueried.temperature = true;

volver tempCelsius;
}

float AHT10::getHumidity()
{
    if (sensorQueried.moisture == true)
    {
        Tenemos datos antiguos, así que activa nuevas mediciones
        triggerMeasurement();

retraso(75); Espere a que se complete la medición

uint8_t contador = 0;
        while (isBusy())
        {
            retraso(1);
            if (contador++ > 100)
                retorno (falso); Darse por vencido después de 100 ms
        }

readData();
    }

De la hoja de datos pg 8
    float relHumidity = ((float)sensorData.moisture / 1048576) * 100;

Marcar datos como antiguos
    sensorQueried.moisture = true;

retorno relHumedad;
}

7.3. Archivo I2C_AHT10.h

#ifndef __I2C_AHT10_H__
#define __I2C_AHT10_H__

#include 
#include 

#define AHT10_DEFAULT_ADDRESS 0x38

Registros de enumeración
{
    sfe_aht10_reg_reset = 0xBA,
    sfe_aht10_reg_initialize = 0xBE,
    sfe_aht10_reg_measure = 0xAC,
};

clase AHT10
{
privado:
    TwoWire *_i2cPort; La conexión genérica al hardware I2C elegido por el usuario
    uint8_t _deviceAddress;
    bool measurementStarted = false;

Estructura
    {
        uint32_t humedad;
        uint32_t temperatura;
    } sensorData;

Estructura
    {
        uint8_t temperatura : 1;
        uint8_t humedad : 1;
    } sensorQueried;

público:
    Estado del dispositivo
    bool begin(TwoWire &wirePort = Wire); Establece la dirección del dispositivo y abre el bus I2C
    bool isConnected();                   Comprueba si el AHT10 está conectado al bus I2C
    bool disponible();                     Devuelve true si hay nuevos datos disponibles.

Funciones auxiliares de medición
    uint8_t getStatus();       Devuelve el byte de estado.
    bool isCalibrated();       Devuelve true si se establece el bit cal, false de lo contrario
    bool isBusy();           Devuelve true si se establece el bit ocupado, false de lo contrario
    bool initialize();        Inicializar para tomar medidas
    bool triggerMeasurement();  Activar el AHT10 para tomar una medición
    void readData();         Leer y analizar los 6 bytes de datos en humedad y temperatura sin procesar
    bool softReset();        Reinicie el sistema del sensor sin apagar y encender

Realizar mediciones
    float getTemperature(); Pasa por la secuencia de medición y devuelve la temperatura en grados centígrados
    float getHumidity();    Pasa por la secuencia de medición y devuelve la humedad en % HR
};
#endif

8. Código del receptor

#include 
#include 
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 2
Cambie a 434.0 u otra frecuencia, ¡debe coincidir con el freq de RX!
#define RF95_FREQ 433.0
Instancia única del controlador de radio
RH_RF95 rf95(RFM95_CS, RFM95_INT);

int count=0;

void setup()
{
  pinMode(RFM95_RST, SALIDA);
  digitalWrite(RFM95_RST, ALTA);
  mientras que (! Serie);
  Serial.begin(115200);
  retraso(100);
  Serial.println("Arduino LoRa RX Test!");

Restablecimiento manual
  digitalWrite(RFM95_RST, LOW);
  retraso(10);
  digitalWrite(RFM95_RST, ALTA);
  retraso(10);
  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    mientras que (1);
  }
  Serial.println("LoRa radio init OK!");
  Los valores predeterminados después de init son 434.0MHz, modulación GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    mientras que (1);
  }
  Serial.print("Establecer frecuencia en: "); Serial.println(RF95_FREQ);
  Los valores predeterminados después de la entrada son 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/símbolo, CRC activado
  La potencia predeterminada del transmisor es de 13dBm, utilizando PA_BOOST.
  Si está utilizando módulos RFM95/96/97/98 que utilizan el pin del transmisor PA_BOOST, entonces
  puede ajustar las potencias del transmisor de 5 a 23 dBm:
  rf95.setTxPower(23, false);
}
void loop()
{
  if (rf95.available())
  {
    Debería ser un mensaje para nosotros ahora
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);

if (rf95.recv(buf, &len))
    {
      contar++;
      RH_RF95::p rintBuffer("Received: ", buf, len);
      Serial.print("Got: ");
      Serial.println((char*)buf);
      Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);

Enviar una respuesta
      uint8_t data[] = "Y hola de vuelta a ti";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Enviado una respuesta");
    }
    más
    {
      Serial.println("Error de recepción");
    }
  }
}

9. IoT LoRa basado en agricultura inteligente y sistema de monitoreo remoto

Basado en LoRa-IoT-Smart-Agriculture

Veamos ahora una demostración simple de la agricultura inteligente basada en LoRa. Ahora puede abrir el monitor serie tanto para el transmisor como para el receptor. El transmisor y el receptor Lora comenzarán y se comunicarán entre sí.
 
El extremo del transmisor leerá los datos de humedad del suelo en ADC que se pueden convertir a un valor porcentual (Consulte este artículo...). Del mismo modo, elAHT10 recopilará datos de humedad y temperatura del aire. Los datos se transmiten a la puerta de enlace.
Transmisión de datos a Lora-gateway

Los datos de la puerta de enlace se pueden observar en el monitor serie.
Data-on-Lora-Gateway
El transmisor enviará los datos y luego pasará al modo de suspensión profunda o al modo de ahorro de energía. Durante el modo de transmisión de datos, consume alrededor de 0,2 mA de energía. Mientras que en el modo de ahorro de energía, la corriente se reduce a 0.75μA. La duración de la batería se puede aumentar a varios meses aumentando el intervalo de transmisión de datos.
Datos registrados en Lora-Gateway

Bueno, eso es todo deIoT Lora Red Agrícola Basada en. Si tiene más preguntas o algún requisito personalizado especial basado en esas placas Lora IoT, no dude en ponerse en contacto conservice@makerfabs.com.

También puede consultar esta revisión desdeFeliz DIY HomeAl comprar sensores de humedad del suelo.

Este artículo está publicado originalmente enHow2electronics.

También puedes aprender de este video tutorial hecho porHow2electronics:
 
También puede consultar esta revisión desdeFeliz DIY HomeAl comprar sensores de humedad del suelo.

Contáctenos