From 0b6c79ee7a2991adf5779ada7d4daa636cff1a22 Mon Sep 17 00:00:00 2001 From: flavienhaas Date: Wed, 18 Apr 2018 13:36:39 +0200 Subject: [PATCH] integration of LoRa + Ethernet --- LoRaEthernet/LoRaEthernet.ino | 125 ++++++++++++++++++++++++++++++ LoRaEthernet/task.h | 56 +++++++++++++ LoRaEthernet/util.h | 40 ++++++++++ WebServer/WebServer/WebServer.ino | 2 +- 4 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 LoRaEthernet/LoRaEthernet.ino create mode 100644 LoRaEthernet/task.h create mode 100644 LoRaEthernet/util.h diff --git a/LoRaEthernet/LoRaEthernet.ino b/LoRaEthernet/LoRaEthernet.ino new file mode 100644 index 0000000..e00c253 --- /dev/null +++ b/LoRaEthernet/LoRaEthernet.ino @@ -0,0 +1,125 @@ +#include +#include +#include "Ethernet.h" +#include "util.h" // pour avoir l'affichage du temps écoulé + +#define LENMAX 80 // taille maximale acceptée pour la trame +#define Serial SerialUSB + +// void setSPIFrequency(uint32_t frequency); // 8MHz par défaut c'est bq pour l'analyseur logique + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED +}; +IPAddress ip(10, 0, 0, 49); + +// Initialize the Ethernet server library +// with the IP address and port you want to use +// (port 80 is default for HTTP): +EthernetServer server(80); + +void setup(){ + Serial.begin(9600); + while (!Serial); + Serial.print("Recepteur LoRa\n"); + // initialiser le shield LoRa en 868 MHz + if( !LoRa.begin(868E6) ){ + Serial.print("Echec de l'initialisation LoRa !\n"); + while(true); // on se bloque ici et on ne va pas plus loin + } + Ethernet.begin(mac, ip); + server.begin(); + Serial.print("server is at "); + Serial.println(Ethernet.localIP()); +} + +void loop() { + static byte tampon[LENMAX]={0}; + int longueurTrame; + // si le module a reçu une trame alors sa longueur sera non nulle + longueurTrame=LoRa.parsePacket(); + if( longueurTrame > 0 ){ + //---- copie de la trame depuis le modem vers le tampon ---- + if( longueurTrame>LENMAX ){ + Serial.print("Trame reçue est trop grande pour le tampon : "); + Serial.println(longueurTrame); + longueurTrame=LENMAX; // troncature + } + for( int i=0; i 0x7E) ){ + Serial.print( "."); // ce caractère est non imprimable + }else{ + Serial.print( (char)tampon[i] ); + } + } + Serial.print( "\n" ); + }//if LoRa.parsePacket + delay(10); + // listen for incoming clients + EthernetClient client = server.available(); + if (client) { + Serial.println("new client"); + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + Serial.write(c); + // if you've gotten to the end of the line (received a newline + // character) and the line is blank, the http request has ended, + // so you can send a reply + if (c == '\n' && currentLineIsBlank) { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println("Connection: close"); // the connection will be closed after completion of the response + client.println("Refresh: 5"); // refresh the page automatically every 5 sec + client.println(); + client.println(""); + client.println(""); + // output the value of each analog input pin + for (int analogChannel = 0; analogChannel < 6; analogChannel++) { + int sensorReading = analogRead(analogChannel); + client.print("analog input "); + client.print(analogChannel); + client.print(" is "); + client.print(sensorReading); + client.println("
"); + } + client.println(""); + break; + } + if (c == '\n') { + // you're starting a new line + currentLineIsBlank = true; + } else if (c != '\r') { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + delay(1); + // close the connection: + client.stop(); + Serial.println("client disconnected"); + } +} + + + diff --git a/LoRaEthernet/task.h b/LoRaEthernet/task.h new file mode 100644 index 0000000..c4ad4c8 --- /dev/null +++ b/LoRaEthernet/task.h @@ -0,0 +1,56 @@ + +#ifndef DaKTASK +#define DaKTASK + +// la tàche est effectuee avec un delai de PeriodeMilliSecondes entre deux executions. +// consomme 4 octets de RAM +// exemple : cron(1000){ // code � r�p�ter toutes les secondes } +#define cron(PeriodeMilliSecondes) for( \ + static unsigned long __nextmillis = 0; \ + millis() - __nextmillis >= (unsigned long)(PeriodeMilliSecondes); \ + __nextmillis = millis() \ + ) + + // la tàche est effectuee avec un delai de PeriodeMilliSecondes entre deux executions. +// consomme 4 octets de RAM +#define task(NomTache,PeriodeMilliSecondes) for( \ + static unsigned long DaKTASK_ ## NomTache = 0; \ + millis() - DaKTASK_ ## NomTache >= (unsigned long)(PeriodeMilliSecondes); \ + DaKTASK_ ## NomTache = millis() \ + ) + +// la tàche est effectuee pr�cis�ment toutes les PeriodeMilliSecondes. +// consomme 8 octets de RAM +#define ftask(NomTache,PeriodeMilliSecondes) for( \ + static unsigned long DaKTASK_ ## NomTache = 0, millis_ ## NomTache = 0; \ + (millis_ ## NomTache = millis()) - DaKTASK_ ## NomTache >= (unsigned long)(PeriodeMilliSecondes); \ + DaKTASK_ ## NomTache = millis_ ## NomTache \ + ) + + +#endif + + + +/* + +void setup() { + Serial.begin(9600); + pinMode(13, OUTPUT); +} + +void loop() { + Task( Toto, 1500 ){ + Serial.print("Toto="); + Serial.println( millis() ); + } + + Task( line, 3000) Serial.println(F("-----------------")); + + FTask( LED, 100 ){ PORTB ^= 0x20; } // clignoter la LED + + cron(500){ PORTB ^= 0x20; } // clignoter la LED toutes les secondes + + delay(11); +} +*/ diff --git a/LoRaEthernet/util.h b/LoRaEthernet/util.h new file mode 100644 index 0000000..8ac179d --- /dev/null +++ b/LoRaEthernet/util.h @@ -0,0 +1,40 @@ +/*----------------------------------- + Petite collection deviendra grande + + Astuces glanées ça et là + +-----------------------------------*/ + + +/* Permet de compacter des suites de Serial.Print + Exemple : + Serial.print("J'ai "); + Serial.print(i); + Serial.print(" bronzes de "); + Serial.print(j); + Serial.println(" kilo chacun."); + par + Serial << "J'ai" << i << " bronzes de " << j << " kilo chacun.\n" + Source : https://playground.arduino.cc/Main/StreamingOutput + + Fonctionne avec toutes les librairies d�riv�es comme LCD, SerialUSB, ..." +*/ +template inline Print &operator <<(Print &obj, T arg) { obj.print(arg); return obj; } + + +/*----------------------------------------- + * Affichage du temps écoulé depuis le lancement + * du programme, + * sous le forme hh:mm:ss + * le paramètre optionnel place un espace à la fin + */ +void SerialPrintElapsedTime( boolean espaceFinal=true ){ + unsigned long h,m,s = millis()/1000; + m=s/60; + h=m/60; + s=s-(m*60); + m=m-(h*60); + Serial << ((h<10)?"0":"") << h << ":" << ((m<10)?"0":"") << m << ":" << ((s<10)?"0":"") << s << (espaceFinal?" ":""); +} + + diff --git a/WebServer/WebServer/WebServer.ino b/WebServer/WebServer/WebServer.ino index b353102..fea1c4b 100644 --- a/WebServer/WebServer/WebServer.ino +++ b/WebServer/WebServer/WebServer.ino @@ -8,7 +8,7 @@ byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; -IPAddress ip(192, 168, 1, 50); +IPAddress ip(10, 0, 0, 49); // Initialize the Ethernet server library // with the IP address and port you want to use