Procedemos a integrar en el programa base del emisor, con la captación de datos con los sensores de arduinoblocks y el grabado en microSD. Antes de verficar el programa o subirlo a la placa, debemos agregar las librerías que usa arduinoblocks en el mismo. Para ello primero debemos descargarnos las librerías que usa arduinoblocks de aquí, y posteriormente descomprimirlas en una carpeta. Más tarde copiamos las carpetas con las librerías que usa arduinoblocks en la carpeta de librerias del IDE de Arduino en tu equipo (/usuario/Arduino/libraries). Las carpetas a copiar son: Ablocks_BMP280, Ablocks_DHT, Ablocks_TinyGps. Para trabajar con la MicroSD debemos agregar la librería que nos ayuda a trabajar con el lector en el IDE de Arduino. Para ello primero debemos descargarnos la librería de aquí, y la descomprimimos. Más tarde copiamos la carpeta descomprimida en la carpeta de librerias del IDE de Arduino en tu equipo (/usuario/Arduino/libraries).
Programa con todo integrado:
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//libraries for mSD
#include <mySD.h>
//Libraries for ablocks
#include "ABlocks_TinyGPS.h"
#include <HardwareSerial.h>
#include <Adafruit_BMP280.h>
#include "ABlocks_DHT.h"
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 23
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//creacion de pantalla (objeto display)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
//objetos y variables para mSD
ext::File myFile;
const int chipSelect = 13;
//contador de tiempo
int counter = 0;
//variables creadas por ablocks
double presion;
double altitud;
double temperatura;
double humedad;
double longitud;
double latitud;
double velocidad;
String s_registro;
TinyGPS gps;
float gps_lat = 0;
float gps_long = 0;
float gps_speed_kmph = 0;
float gps_speed_mph = 0;
float gps_altitude = 0;
float gps_course = 0;
bool gps_fixed = false;
byte gps_day = 0;
byte gps_month = 0;
int gps_year = 0;
byte gps_hour = 0;
byte gps_min = 0;
byte gps_sec = 0;
byte gps_hund = 0;
HardwareSerial &gps_serial = Serial;
Adafruit_BMP280 bmp280;
DHT dht2(34, DHT22);
//funciones
void envia_lora() { //Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print(s_registro);
LoRa.endPacket();
}
void envia_oled() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Club Robotica Granada");
display.setCursor(0, 20);
display.setTextSize(1);
display.print("Paquete LoRa enviado.");
display.setCursor(0, 30);
display.print("Contador: ");
display.setCursor(60, 30);
display.print(counter);
display.display();
}
//funciones creadas en ablocks
void fnc_gps_update() {
unsigned long fix_age;
while (gps_serial.available()) {
if (gps.encode(gps_serial.read())) {
gps_fixed = false;
gps_lat = gps_long = gps_speed_kmph = gps_speed_mph = gps_course = 0;
gps_day = gps_month = gps_year = gps_hour = gps_min = gps_sec = 0;
gps.f_get_position(&gps_lat, &gps_long, &fix_age);
if (fix_age != TinyGPS::GPS_INVALID_AGE && fix_age < 5000) {
gps_fixed = true;
gps.crack_datetime(&gps_year, &gps_month, &gps_day, &gps_hour, &gps_min, &gps_sec, &gps_hund, &fix_age);
gps_altitude = gps.f_altitude();
gps_course = gps.f_course();
gps_speed_kmph = gps.f_speed_kmph();
gps_speed_mph = gps.f_speed_mph();
}
}
}
}
void leesensores() {
presion = (bmp280.readPressure() / 100.0);
altitud = bmp280.readAltitude();
temperatura = dht2.readTemperature();
humedad = dht2.readHumidity();
if (gps_fixed) {
longitud = gps_long;
latitud = gps_lat;
velocidad = gps_speed_kmph;
}
//es importante comentar que si no se pone nada a los valores numéricos te da una precisión de 2 decimales, a los valores del GPS de longitud
//y latitud le vamos a dar 8 decimales, poniendo (valor,8)
s_registro = String(counter) + String(";") + String(presion) + String(";") + String(altitud) + String(";") + String(temperatura) + String(";") + String(humedad) + String(";") + String(longitud,8) + String(";") + String(latitud,8) + String(";") + String(velocidad) + String(";");
}
void envia_sd() {
myFile = SD.open("datos.csv", FILE_WRITE);
if (myFile) {
myFile.println(s_registro);
// close the file:
myFile.close();
}
}
void setup() {
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.print("LORA SENDER ");
display.display();
/*initialize Serial Monitor
Serial.begin(115200);
Serial.println("Prueba de envio LoRa");*/
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
display.setCursor(0, 10);
display.print("Starting LoRa failed!");
display.display();
//Serial.println("Starting LoRa failed!");
while (1)
;
}
//Serial.println("LoRa Inicializacion OK!");
display.setCursor(0, 10);
display.print("Inicializacion OK!");
display.display();
delay(2000);
//setup mSD
pinMode(SS, OUTPUT);
SD.begin(13, 15, 2, 14); //definición de pines CS,MOSI,MISO,SCK
//setup de ablocks
pinMode(2, INPUT);
bmp280.begin(0x76);
bmp280.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500);
dht2.begin();
gps_serial.begin(9600);
gps_serial.println("$PMTK220,1000*1F");
}
void loop() {
fnc_gps_update();
leesensores();
envia_lora();
envia_oled();
envia_sd();
counter++;
delay(1000);
}