************** LoRa IoT-knoop ************** De onderstaande *story* beschrijft de constructie van een eenvoudige LoRa-IoT-knoop, voor gebruik met het TTN-netwerk: * https://www.thethingsnetwork.org/labs/story/creating-a-ttn-node Dit is een IoT-knoop op basis van het Arduino pro mini-bordje (3.3V), met een Hope RFM95-module als LoRa-radio. Als software wordt de LMIC-library gebruikt. * LMIC library: https://github.com/matthijskooijman/arduino-lmic * Arduino Pro Mini: https://store.arduino.cc/arduino-pro-mini * Pro Mini pinout: http://www.pighixxx.net/portfolio-items/pro-mini/ * Low Power library: https://github.com/rocketscream/Low-Power * Meer over low power: http://www.rocketscream.com/ * De Arduino pro mini heeft geen eigen USB-aansluiting: hiervoor gebruik je een USB-naar-serieel (FTDI FT232) adapter. De onderdelen voor dit bordje, inclusief de USB-naar-serieel-adapter, kun je bestellen via TinyTronics: * (incl. FT232) https://www.tinytronics.nl/shop/nl/communicatie/rf(id)-wifi-bt/things-network-lorawan-node-workshop-2017 * (excl. FT232) https://www.tinytronics.nl/shop/nl/communicatie/rf(id)-wifi-bt/things-network-lorawan-node-workshop-2017-zonder-ft232-en-usb-kabel De kosten van de onderdelen voor het bordje zijn ca. 25 Euro; een USB-kabel en een USB-naar-serieel omzetter kosten ca. 7,50 Euro. Deze laatste heb je alleen nodig voor het programmeren van het bordje, niet voor het eigenlijke gebruik. (Je kunt het bordje ook voorgesoldeerd krijgen, voor 10 Euro extra.) De genoemde "story" omvat een uitgebreide handleiding voor het solderen van het bordje, en voor het programmeren en configureren daarvan. .. note:: Het Arduino-bordje werkt op 3.3V. Dit betekent dat de onderdelen (sensoren e.d.) die je hierop aansluit, ook op 3.3V moeten werken. Bovendien werkt dit bordje op 8 MHz. Je moet in de Arduino IDE de juiste versie van de Arduino pro mini selecteren, anders werkt de seriƫle monitor (e.d.) niet goed. Voor het programmeren gebruik je de Arduino IDE, met de volgende libraries: * BMP280-sensor: I2C-Sensor-Lib: iLib - Ingmar Split * https://github.com/orgua/iLib * deze kun je downloaden en installeren vanuit de Arduino IDE * LoRaWan protocol: Arduino-LMIC * https://github.com/matthijskooijman/arduino-lmic * NB: deze moet je "met de hand" downloaden en installeren * LowPower library: * https://github.com/rocketscream/Low-Power * NB: deze moet je "met de hand" downloaden en installeren * hiermee kun je de Arduino tijdelijk in "idle" of "sleep"-toestand brengen. (Wat is de structuur van de toepassing?) De toepassing is te vinden op GitHub: * https://github.com/galagaking/ttn_nodeworkshop - ``ttn_bmp280.ino`` .. code-block:: cpp void do_send(osjob_t* j) { byte buffer[2]; float temperature,pascal; uint16_t t_value, p_value, s_value; bmp280.awaitMeasurement(); bmp280.getTemperature(temperature); bmp280.getPressure(pascal); bmp280.triggerMeasurement(); pascal=pascal/100; Serial.print(" Pressure: "); Serial.print(pascal); Serial.print(" Pa; T: "); Serial.print(temperature); Serial.println(" C"); // getting sensor values temperature = constrain(temperature,-24,40); //temp in range -24 to 40 (64 steps) pascal=constrain(pascal,970,1034); //pressure in range 970 to 1034 (64 steps)*/ t_value=int16_t((temperature*(100/6.25)+2400/6.25)); //0.0625 degree steps with offset // no negative values Serial.print(F("decoded TEMP: ")); Serial.print(t_value,HEX); p_value=int16_t((pascal-970)/1); //1 mbar steps, offset 970. Serial.print(F(" decoded Pascal: ")); Serial.print(p_value,HEX); s_value=(p_value<<10) + t_value; // putting the bits in the right place Serial.print(F(" decoded sent: ")); Serial.println(s_value,HEX); buffer[0]=s_value&0xFF; //lower byte buffer[1]=s_value>>8; //higher byte // Check if there is not a current TX/RX job running if (LMIC.opmode & OP_TXRXPEND) { Serial.println(F("OP_TXRXPEND, not sending")); } else { // Prepare upstream data transmission at the next possible time. LMIC_setTxData2(1, (uint8_t*) buffer, 2 , 0); Serial.println(F("Sending: ")); } } De sensoren worden uitgelezen, en de waarden worden gecodeerd in 2 bytes. Vervolgens wordt de buffer aangemerkt voor verzending: het eigenlijke zenden vindt plaats op een moment dat bepaald wordt door de LMIC-library (os); hierbij wordt rekening gehouden met de beperkigen van de 868 MHz-band (maar niet met de beperkingen van TTN "fair use"). NB: er is hier geen enkele reden om "float"s te gebruiken: de library geeft de resultaten in 32-bits integer waarden. .. code-block:: cpp void loop() { if (joined==false) { // start OTAA JOIN os_runloop_once(); } else { do_send(&sendjob); // Send sensor values while (sleeping == false) { os_runloop_once(); } sleeping = false; for (int i=0;i