Git Product home page Git Product logo

lora-mesh's Introduction

IPG MCM 2018/19

LoRa-Mesh

Uma rede mesh é essencialmente caracterizada por uma tipologia em que todos os nós da infraestrutura de rede comunicam diretamente entre eles, de forma dinâmica, sem ter em conta qualquer hierarquicamente. Assim, os nós cooperam uns com os outros, de forma a rotear os dados de forma eficiente. Essa falta de dependência entre nós permite que cada um participe na transmissão e receção de informação entre eles. As redes em mesh, podem-se organizar de forma dinâmica, através da capacidade que possuem em se autoconfiguração, permitindo a distribuição dinâmica de fluxos de informação, principalmente em situações de falhas num desses nós.

66425186_342349106659933_6656448965128486912_n

Como instalar

  1. Clonar este repositório: $ git clone https://github.com/daeynasvistas/LoRa-Mesh/

  2. Utilizar VisualStudio Code (PlatformIO):

    2.1. pode abrir pasta ESP32 e pasta Arduino em projectos separados.

Como funciona

  1. Todos os Nodes dispõem de um ID único (EEPROM)
  2. Ao iniciar, é verificado se o Node é SINk (dispõe de acesso à Internet) ou não
// Este node e servidor
// 0 = Servidor internet
// 1 = Vizinho de servidor internet
// 2 = Vizinho com um Vizinho de um servidor internet 
byte isServer = getIsServer();
String nodeFunction[4] = {"SINK","ESTRADA","CAMINHO","SOLTEIRO"};
  1. Cada Node envia em BroadCast a sua tabela de Vizinhos a cada 10 mensagens recebidas
     if(msgCount>10)
    {
      message = sendTable();
      sendMessage(message, 255);
  1. Ao receber a Tabela é verificado se na mesma existe algum SINK (identificado no broadcast Como ID=0)
     if(msgCount>10)
    {
      message = sendTable();
      sendMessage(message, 255);
  1. É guardada a Tabela de SINK's conhecidas em cada node e conhecida por cada vizinho
String nodeFunction[4] = {"SINK","ESTRADA","CAMINHO","SOLTEIRO"};
  // Posicionamento dos servidores na mesh
   switch (incomingMsgHand) {
   case 0:
       // statements
        if(!arrayIncludeElement(myServers,sender,maxTableArrayServers)){
           Serial.println("Encontrei um SINK! "+sender);
           arrayAddElement(myServers,sender,maxTableArrayServers);
           display.drawString(0, 32, "NOVO: " + String(sender)); 
        }
      destination = sender;
      break;
   case 1:
       // statements
        if(!arrayIncludeElement(myNeighbours,sender,maxTableArrayVizinhos)){
           Serial.println("Encontrei AUTOESTRADA para SINK! "+sender);
           arrayAddElement(myNeighbours,sender,maxTableArrayVizinhos);
           display.drawString(0, 32, "NOVO: " + String(sender)); 
        }
        if(isServer!=0){
          destination = sender;
        }
       break;
   case 2:
       // statements
       Serial.println("Encontrei CAMINHO para SINK!");
       break;       
   default:
       // statements
       break;
   } 
  1. É sempre enviado um JSON com valores dos sensores recolhidos para o vizinho mais perto de um SINK
        }else{
           // enviar para mais próximo do SINK
           destination = myNeighbours[0];
           sendMessage(message, destination);
        }

Configuração

Para configurar deve alterar main.cpp e incluir sensores que predende utilizar. ESP32 inclui libraria para BME e Arduino para DHT11

método makeDate()

O projeto utiliza a libraria #include <ArduinoJson.h> para construir o JSON que é enviado em cada Node, incluia ou altere os que pretender.

void makeData(){
// add some values
array.add(MAC); //<- Lora MAC
array.add(1556969160); //<-- Timestamp
array.add(bme.readTemperature());
array.add(bme.readHumidity());
array.add(bme.readPressure() / 100.0F);
array.add(0);
array.add(0);
array.add(0);
array.add(0);
array.add(0);
array.add(0);

 // serialize the array and send the result to Serial
// serialize the array and send the result to Serial
 serializeJson(doc, Values);
 serializeJson(doc, Serial);
 Serial.println("");
}

valor máximo de Nodes e Sink

32 como máximo na tabela de vizinhos .. ou simplesmente alterar parra array dinámico

byte const maxTableArrayVizinhos = 32; // quantidade de vizinhos pode ser aumentada conform memoria dispo
byte myNeighbours[maxTableArrayVizinhos] = {}; // address of vizinhos directos

byte const maxTableArrayServers = 4; // quantidade de servidores ao qual tenho acesso pode ser aumentada
byte myServers[maxTableArrayServers]     = {}; // address dos servidores que encontrei

Resultado

Este é o resultado com Serial.Print no Node SINK, onde todos os valores dos sensores de todos os Nodes chegam. O node Sink é responsável por enviar o JSON... por Lora (gateway), por MQTT ou pelo método que preferir

Descoberta de um node (187)

777777

Descoberta de um node (170)

8888

Recolha dos valores de todos os Nodes

99999

SINK a recolher valores dos Vizinhos

21121212 50

Resultado ESP32

11111 44444 222222 55555

Desenvolvimento

32131231 43423423 42434

lora-mesh's People

Contributors

daeynasvistas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

lora-mesh's Issues

Dúvida na tabela de Vizinhos.

Estou tentando implementar um projeto parecido e no seu código ele não atualiza as tabelas

quando um nó é desligado ele não é apagado da tabela, está certo isso?
Alguma outra opção? Obrigado!

Packets sent between nodes get larger every iteration

After the packets are received by a node the otherValues variable gets flooded with lots of repeated messages with the same info. This obviously isn't the final code displayed in the ReadMe.md. Multiple unused global variables which are constantly modified yield this erratic behavior.

Possible changes to make the code faster:

  • Implement a Queue for messages
  • Remove code that isn't used anymore
  • Correctly set the destination in code, a Mesh is a Mesh because one to many communication
  • Implement a buffer of messages that does not repeat itself after each iteration
  • Remove the synch messages since we can already add nodes if a new valid message is received

I really appreciate this project, and I'm willing to help if needed, keep it up guys!

Consumo de energia

Olá!

Ótimo trabalho realizado.
Estava olhando o seu trabalho e não vi nenhuma função sobre o consumo de energia.
Os dispositivos ficam ligados sempre?

Montagem Física

Olá Daniel!
Super projeto!!! Parabéns!
Apenas para confirmar, vc usou o LoraMesh da Radioenge, certo?

Mas uma coisa que adorei, foi a sua montagem na caixinha. Estou começando a usar a placa deles Lorawan e gostaria de saber se vc pode me ajudar falando mais sobre como é o circuito de montagem. Me refiro mais sobre a parte alimentação, tipo ou modelo de regulador de tensão, bateria, etc.
Entre esp32 e radioenge não precisa de conversor de nivel lógico nas serias, correto? Os dois são 3,3V...
Não sou empresa ainda, estou tentando dar o difícil passo de maker para ter algum produto para vender, sabe?
Atenciosamente
Alexandre

Issue

Ei necessito de ajuda, estou tentando usar seu projeto como base do meu porem nao entendi a parte em que cada node tem um id em hexadecimal, isso foi decidido por vc ou é automatico?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.