I am trying to program my Adafruit Feather M0 RFM96 LoRa Radio - 433MHz - RadioFruit with this code. It compiles and uploads but when it's done uploading, the board doesn't do anything it's supposed to and stops being recognized by the computer. I am able to get the board back by uploading a blink code with verbose upload but my below code doesn't ever work on my board. I have seen many posts about how to get my board working again but not much on why some codes "break" the boards for a bit. This code is a "Frankenstein" of some other codes, all of which work, but when I try to duct tape it all together, it never comes alive. I'm trying to data log, transmit location through LORA and move a servo when the time comes. I'm wondering what it is about this code that my MCU doesn't like.
#include "Adafruit_APDS9960.h"
#include <Adafruit_BMP280.h>
#include <Adafruit_LIS3MDL.h>
#include <Adafruit_LSM6DS33.h>
#include <Adafruit_GPS.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>
#include <RH_RF95.h>
#include "RTClib.h"
#include "avr/dtostrf.h"
#include <SPI.h>
#include <SD.h>
#include <Servo.h>
#include <Wire.h>
#define GPSSerial Serial1
#define GPSECHO false
Adafruit_GPS GPS(&GPSSerial);
Servo servo;
RTC_PCF8523 rtc;
const int chipSelect = 10;
Adafruit_APDS9960 apds; // proximity, light, color, gesture
Adafruit_LSM6DS33 lsm6ds33; // accelerometer, gyroscope
Adafruit_LIS3MDL lis3mdl; // magnetometer
Adafruit_SHT31 sht30; // humidity
Adafruit_BMP280 bmp; // use I2C interface
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
#define RF95_FREQ 433.0
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
float temperature, pressure, altitude, speed;
float magnetic_x, magnetic_y, magnetic_z;
float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
int MaxAlt = 0;
int MaxSpd = 0;
int MaxTem = 0;
int MinTem = 0;
float Lo = GPS.longitude;
float La = GPS.latitude;
int Al = GPS.altitude;
int Sp = GPS.speed;
int humidity = sht30.readHumidity();
void setup() {
if (!SD.begin(chipSelect)) {
Serial.println("Card failed");
}
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (! rtc.initialized() || rtc.lostPower()) {
Serial.println("RTC is NOT initialized, let's set the time!");
}
if(!apds.begin()){
Serial.println("failed to initialize device! Please check your wiring.");
}
apds.begin();
apds.enableColor(true);
sht30.begin();
servo.attach(5);
servo.write(90);
bmp.begin();
lis3mdl.begin_I2C();
lsm6ds33.begin_I2C();
rtc.start();
SD.begin(chipSelect);
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
Serial.begin(115200);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
delay(1000);
GPSSerial.println(PMTK_Q_RELEASE);
// manual reset
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
while (1);
}
if (!rf95.setFrequency(RF95_FREQ)) {
while (1);
}
rf95.setTxPower(23, false);
}
void loop(){
DateTime now = rtc.now();
lis3mdl.read();
sensors_event_t temp_event, pressure_event;
sensors_event_t accel;
sensors_event_t gyro;
sensors_event_t temp;
lsm6ds33.getEvent(&accel, &gyro, &temp);
delay(1000);
char c = GPS.read();
if (GPS.newNMEAreceived()) {
Serial.println(GPS.lastNMEA());
if (!GPS.parse(GPS.lastNMEA()))
return;
}
if (GPS.fix) {
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", ");
Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print(GPS.speed); Serial.println("kn");
Serial.print(GPS.altitude); Serial.println("m");
}
altitude = GPS.altitude;
if (altitude > MaxAlt) {MaxAlt = altitude; }
speed = GPS.speed;
if (speed > MaxSpd) {MaxAlt = speed; }
temperature = bmp.readTemperature();
if (temperature > MaxTem) {MaxTem = temperature; }
temperature = bmp.readTemperature();
if (temperature < MinTem) {MinTem = temperature; }
delay(1000);
char radiopacket[2] = "N";
Serial.println(radiopacket);
radiopacket[1] = 0;
rf95.send((uint8_t *)radiopacket, 2);
rf95.waitPacketSent();
delay(1000);
char Lat[1] = {};
dtostrf(La, 9, 4, Lat);
Serial.print("Sending "); Serial.println(Lat);
rf95.send((uint8_t *) &Lat,9);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Lon[1] = {};
dtostrf(Lo, 9, 4, Lon);
Serial.print("Sending "); Serial.println(Lon);
rf95.send((uint8_t *) &Lon,9);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Spd[1] = {};
dtostrf(Sp, 3, 0, Spd);
Serial.print("Sending "); Serial.println(Spd);
rf95.send((uint8_t *) &Spd,3);
delay(10);
rf95.waitPacketSent();
delay(1000);
char Alt[1] = {};
dtostrf(Al, 6, 0, Alt);
Serial.print("Sending "); Serial.println(Alt);
rf95.send((uint8_t *) &Alt,6);
delay(10);
rf95.waitPacketSent();
String dataString = "";
dataString += String(int(now.month())) += "/";
dataString += String(int(now.day())) += "/";
dataString += String(int(now.year())) += " ";
dataString += String(int(now.hour())) += ":";
dataString += String(int(now.minute())) += ":";
dataString += String(int(now.second())) += " ";
dataString += String(GPS.latitude, 4);
dataString += String(GPS.lat) += ", ";
dataString += String(GPS.longitude, 4);
dataString += String(GPS.lon) += " ";
dataString += String(bmp.readTemperature()) += " C Min:";
dataString += String(MinTem) += " C Max:";
dataString += String(MaxTem) += " C Humidity:";
dataString += String(sht30.readHumidity()) += "% ";
dataString += String(bmp.readPressure()) += " Pa ";
dataString += String(GPS.speed) += " kn ";
dataString += String(MaxSpd) += " kn MAX ";
dataString += String(GPS.altitude) += " m ";
dataString += String(MaxAlt) += " m MAX MagX:";
dataString += String(lis3mdl.x) += " MagY:";
dataString += String(lis3mdl.y) += " MagZ:";
dataString += String(lis3mdl.z) += " uTesla Acc x:";
dataString += String(accel.acceleration.x) += " Acc y:";
dataString += String(accel.acceleration.y) += " Acc z:";
dataString += String(accel.acceleration.z) += " m/s^2 Gyro x:";
dataString += String(gyro.gyro.x) += " Gyro y:";
dataString += String(gyro.gyro.y) += " Gyro z:";
dataString += String(gyro.gyro.z) += " dps Proximity:";
dataString += String(apds.readProximity());
/* File dataFile = SD.open("datalog.txt", FILE_WRITE); //Opens new text file on SD card called datalog.txt
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
} */
Serial.println(dataString);
if (GPS.altitude < altitude && MaxAlt > 4000 && GPS.altitude < 3000) {
servo.write(15); // moves servo to 70 degrees
}
}