diff --git a/NRF_firmware/platformio.ini b/NRF_firmware/platformio.ini index 88dfce4..d67dbe9 100644 --- a/NRF_firmware/platformio.ini +++ b/NRF_firmware/platformio.ini @@ -20,5 +20,10 @@ lib_deps = sparkfun/SparkFun Ambient Light Sensor Arduino Library@^1.0.4 https://github.com/stm32duino/LPS22HB vshymanskyy/TinyGSM@^0.12.0 + koendv/RTT Stream@^1.4.1 + arduino-libraries/ArduinoHttpClient@^0.6.1 build_unflags = -DNRF52 -DUSE_LFXO build_flags = -DNRF52840_XXAA -DUSE_LFRC +upload_protocol = jlink +debug_tool = jlink +monitor_port = socket://localhost:19021 diff --git a/NRF_firmware/src/main.cpp b/NRF_firmware/src/main.cpp index 4d7c619..b0c53cf 100644 --- a/NRF_firmware/src/main.cpp +++ b/NRF_firmware/src/main.cpp @@ -1,34 +1,29 @@ #include "main.h" -SparkFun_Ambient_Light light(AL_ADDR); +const char server[] = "api.64eng.de"; +const char resource[] = "ok.txt"; -ENS210 ens210; -LPS22HBSensor lps22hb(&Wire); - -Adafruit_LIS3DH acc1 = Adafruit_LIS3DH(ACCL1_CS); -Adafruit_LIS3DH acc2 = Adafruit_LIS3DH(ACCL2_CS); - - -void testmodem(){ - //SerialAT.begin(9600); -} +HttpClient http(client, server, 80); void setup() { + rtt.println("|---------Starting setup---------|"); gpioinit(); + initmodem(); + testmodem(); + powerdownmodem(); + delay(2000); } void loop() { - Serial.println(); - Serial.println("|---------Starting loop---------|"); - //powerupesp(); - //powerupmodem(); + rtt.println(); + rtt.println("|---------Starting loop---------|"); measureacc(); measuretemp(); measurepressure(); lightsense(); ButtonState(); measureBattery(); - delay(1000); + delay(10000); } void wd_handler() { @@ -37,6 +32,213 @@ void wd_handler() { digitalWrite(DONE,LOW); } +void initmodem(){ + powerupmodem(); + rtt.println("Initialising modem"); + SerialAT.begin(115200); + delay(10); + modem.init(); + rtt.print("Modem Info: "); + rtt.println(modem.getModemInfo()); + rtt.print("Modem SN: "); + rtt.println(modem.getModemSerialNumber()); + rtt.print("Modem isconnected: "); + rtt.println(modem.isGprsConnected()); +} + +void connectmodem(){ + rtt.println("Connecting modem"); + modem.gprsConnect("internet", "", ""); + rtt.println("Waiting for network..."); + if (!modem.waitForNetwork(600000L, true)) { + delay(10000); + return; + } + rtt.println("Connection state"); + rtt.println(modem.isGprsConnected()); +} + +void disconnectmodem(){ + rtt.println("Disconnecting modem"); + modem.gprsDisconnect(); + rtt.println("Connection state"); + rtt.println(modem.isGprsConnected()); +} + +void httpreq(){ + rtt.print(F("Performing HTTP GET request... ")); + int err = http.get(resource); + if (err != 0) { + rtt.println(F("failed to connect")); + return; + } + + int status = http.responseStatusCode(); + rtt.print(F("Response status code: ")); + rtt.println(status); + + rtt.println(F("Response Headers:")); + while (http.headerAvailable()) { + String headerName = http.readHeaderName(); + String headerValue = http.readHeaderValue(); + rtt.println(" " + headerName + " : " + headerValue); + } + + int length = http.contentLength(); + if (length >= 0) { + rtt.print(F("Content length is: ")); + rtt.println(length); + } + if (http.isResponseChunked()) { + rtt.println(F("The response is chunked")); + } + + String body = http.responseBody(); + rtt.println(F("Response:")); + rtt.println(body); + + rtt.print(F("Body length is: ")); + rtt.println(body.length()); + + http.stop(); + rtt.println(F("Server disconnected")); +} + +void getgps(){ + rtt.printf("Enabling GPS/GNSS/GLONASS and waiting 15s for warm-up"); + modem.enableGPS(); + delay(15000L); + float gps_latitude = 0; + float gps_longitude = 0; + float gps_speed = 0; + float gps_altitude = 0; + int gps_vsat = 0; + int gps_usat = 0; + float gps_accuracy = 0; + int gps_year = 0; + int gps_month = 0; + int gps_day = 0; + int gps_hour = 0; + int gps_minute = 0; + int gps_second = 0; + for (int8_t i = 15; i; i--) { + rtt.printf("Requesting current GPS/GNSS/GLONASS location"); + if (modem.getGPS(&gps_latitude, &gps_longitude, &gps_speed, &gps_altitude, + &gps_vsat, &gps_usat, &gps_accuracy, &gps_year, &gps_month, + &gps_day, &gps_hour, &gps_minute, &gps_second)) { + rtt.printf("Latitude:", String(gps_latitude, 8), "\tLongitude:", String(gps_longitude, 8)); + rtt.printf("Speed:", gps_speed, "\tAltitude:", gps_altitude); + rtt.printf("Visible Satellites:", gps_vsat, "\tUsed Satellites:", gps_usat); + rtt.printf("Accuracy:", gps_accuracy); + rtt.printf("Year:", gps_year, "\tMonth:", gps_month, "\tDay:", gps_day); + rtt.printf("Hour:", gps_hour, "\tMinute:", gps_minute, "\tSecond:", gps_second); + break; + } else { + rtt.printf("Couldn't get GPS/GNSS/GLONASS location, retrying in 15s."); + delay(15000L); + } + } + rtt.printf("Retrieving GPS/GNSS/GLONASS location again as a string"); + String gps_raw = modem.getGPSraw(); + rtt.printf("GPS/GNSS Based Location String:", gps_raw); + rtt.printf("Disabling GPS"); + modem.disableGPS(); +} + +void testmodem(){ + connectmodem(); + rtt.println("testing modem"); + + rtt.print("Modem CCID: "); + rtt.println(modem.getSimCCID()); + rtt.print("Modem IMEI: "); + rtt.println(modem.getIMEI()); + rtt.print("Sim Statue: "); + rtt.println(modem.getSimStatus()); + rtt.print("Modem IMSI: "); + rtt.println(modem.getIMSI()); + rtt.print("Modem Operator: "); + rtt.println(modem.getOperator()); + rtt.print("Modem LocalIP: "); + rtt.println(modem.localIP()); + rtt.print("Modem SQ: "); + rtt.println(modem.getSignalQuality()); + + int8_t chargeState = -99; + int8_t chargePercent = -99; + int16_t milliVolts = -9999; + modem.getBattStats(chargeState, chargePercent, milliVolts); + rtt.println("Battery chargeState"); + rtt.println(chargeState); + rtt.println("Battery chargePercent"); + rtt.println(chargePercent); + rtt.println("Battery milliVolts"); + rtt.println(milliVolts); + + rtt.println("Chip temperature"); + rtt.println(modem.getTemperature()); + + httpreq(); + + //getgps(); + + disconnectmodem(); +} + +void powerdownmodem(){ + if(!modemon){ + rtt.println("Modem already off"); + return; + } + rtt.println("Powering down modem"); + rtt.println("Pressing modem power button"); + digitalWrite(MODEM_PWRKEY,HIGH); + delay(600); + digitalWrite(MODEM_PWRKEY,LOW); + delay(10); + modemon = false; + if(!espon){ + rtt.println("Powering down espmodem rail"); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(50); + espmodemrail = false; + } +} + +void powerdownesp(){ + if(!espon){ + rtt.println("ESP already off"); + return; + } + rtt.println("Powering esp down"); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(50); + espon = false; + if(!modemon){ + rtt.println("Powering down espmodem rail"); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(50); + espmodemrail = false; + } +} + +void softpwrup(){ + digitalWrite(MODEM_ESP_PWR,HIGH); + nrf_delay_us(500); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(2); + digitalWrite(MODEM_ESP_PWR,HIGH); + delay(1); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(2); + digitalWrite(MODEM_ESP_PWR,HIGH); + delay(1); + digitalWrite(MODEM_ESP_PWR,LOW); + delay(2); + digitalWrite(MODEM_ESP_PWR,HIGH); + delay(500); +} + void gpioinit(){ //latch on the main power pinMode(PWR_LATCH , OUTPUT); @@ -45,8 +247,6 @@ void gpioinit(){ pinMode(WAKE, INPUT); pinMode(DONE, OUTPUT); attachInterrupt(digitalPinToInterrupt(WAKE), wd_handler, RISING); - //setup Serial - Serial.begin(115200); //setup I2C bus Wire.begin(); //power up sensors @@ -67,39 +267,67 @@ void gpioinit(){ pinMode(MODEM_PWRKEY,OUTPUT); digitalWrite(MODEM_PWRKEY,LOW); pinMode(PWR_SW_IN, INPUT); + pinMode(MODEM_CON_A,OUTPUT); + pinMode(MODEM_CON_B,OUTPUT); + digitalWrite(MODEM_CON_A,LOW); + digitalWrite(MODEM_CON_B,LOW); } void powerupesp(){ - Serial.println("Powering up esp"); - digitalWrite(MODEM_ESP_PWR,HIGH); + if(espon){ + rtt.println("ESP already on"); + return; + } + rtt.println("Powering up esp"); + if(espmodemrail){ + rtt.println("Power rail alredy up"); + } + else{ + rtt.println("Powering espmodem power rail"); + softpwrup(); + } digitalWrite(ESP_PWR,HIGH); - delay(500); + delay(50); + espmodemrail = true; + espon = true; } void powerupmodem(){ - Serial.println("powering up modem"); - digitalWrite(MODEM_ESP_PWR,HIGH); - delay(600); + if(modemon){ + rtt.println("Modem already on"); + return; + } + rtt.println("powering up modem"); + if(espmodemrail){ + rtt.println("Power rail alredy up"); + } + else{ + rtt.println("Powering espmodem power rail"); + softpwrup(); + } + espmodemrail = true; + rtt.println("Pressing modem power button"); digitalWrite(MODEM_PWRKEY,HIGH); delay(600); digitalWrite(MODEM_PWRKEY,LOW); - delay(600); + delay(10); + modemon = true; } void ButtonState() { int buttonState = digitalRead(PWR_SW_IN); - Serial.println("|-----------------|"); - Serial.println("| Button (SW) |"); - Serial.print("| State: "); Serial.println(buttonState ? "Pressed" : "Released"); - Serial.println("|-----------------|"); + rtt.println("|-----------------|"); + rtt.println("| Button (SW) |"); + rtt.print("| State: "); rtt.println(buttonState ? "Pressed" : "Released"); + rtt.println("|-----------------|"); } void measureBattery() { float voltage = ((float)analogRead(VBAT_DIV) / 1000.0) * 6.0; - Serial.println("|-------------------|"); - Serial.println("| Battery Voltage |"); - Serial.print("| "); Serial.print(voltage, 2); Serial.println(" V"); - Serial.println("|-------------------|"); + rtt.println("|-------------------|"); + rtt.println("| Battery Voltage |"); + rtt.print("| "); rtt.print(voltage, 2); rtt.println(" V"); + rtt.println("|-------------------|"); } void lightsense(){ @@ -107,27 +335,27 @@ float gain = .25; int time = 100; long luxVal = 0; if(!light.begin()) - Serial.println("Could not communicate with the light sensor!"); + rtt.println("Could not communicate with the light sensor!"); light.setGain(gain); light.setIntegTime(time); - Serial.println("|-----------------------------|"); - Serial.println("| Sensor: VEML6035 |"); - Serial.println("| Gain | Integration Time |"); - Serial.print("| "); - Serial.print(gain, 3); - Serial.print(" | "); - Serial.print(time); - Serial.println(" |"); + rtt.println("|-----------------------------|"); + rtt.println("| Sensor: VEML6035 |"); + rtt.println("| Gain | Integration Time |"); + rtt.print("| "); + rtt.print(gain, 3); + rtt.print(" | "); + rtt.print(time); + rtt.println(" |"); luxVal = light.readLight(); - Serial.println("|-----------------------------|"); - Serial.println("| Ambient Light Reading |"); - Serial.print("| "); - Serial.print(luxVal); - Serial.println(" Lux"); - Serial.println("|-----------------------------|"); + rtt.println("|-----------------------------|"); + rtt.println("| Ambient Light Reading |"); + rtt.print("| "); + rtt.print(luxVal); + rtt.println(" Lux"); + rtt.println("|-----------------------------|"); } void measuretemp(){ @@ -135,15 +363,15 @@ void measuretemp(){ int t_data, t_status, h_data, h_status; ens210.measure(&t_data, &t_status, &h_data, &h_status ); - Serial.println("|-------------------------------|"); - Serial.println("| Sensor: ENS210 |"); - Serial.println("| Temperature | Humidity |"); - Serial.print("| "); - Serial.print(ens210.toCelsius(t_data, 10) / 10.0, 1); - Serial.print(" C | "); - Serial.print(ens210.toPercentageH(h_data, 1)); - Serial.println(" %RH |"); - Serial.println("|-------------------------------|"); + rtt.println("|-------------------------------|"); + rtt.println("| Sensor: ENS210 |"); + rtt.println("| Temperature | Humidity |"); + rtt.print("| "); + rtt.print(ens210.toCelsius(t_data, 10) / 10.0, 1); + rtt.print(" C | "); + rtt.print(ens210.toPercentageH(h_data, 1)); + rtt.println(" %RH |"); + rtt.println("|-------------------------------|"); } void measurepressure(){ @@ -153,59 +381,59 @@ void measurepressure(){ lps22hb.GetPressure(&pressure); lps22hb.GetTemperature(&temperature); - Serial.println("|----------------------------------|"); - Serial.println("| Sensor: LPS22HB |"); - Serial.println("| Pressure[hPa] | Temperature[C] |"); - Serial.print("| "); - Serial.print(pressure, 2); - Serial.print(" | "); - Serial.print(temperature, 2); - Serial.println(" |"); - Serial.println("|----------------------------------|"); + rtt.println("|----------------------------------|"); + rtt.println("| Sensor: LPS22HB |"); + rtt.println("| Pressure[hPa] | Temperature[C] |"); + rtt.print("| "); + rtt.print(pressure, 2); + rtt.print(" | "); + rtt.print(temperature, 2); + rtt.println(" |"); + rtt.println("|----------------------------------|"); } void measureacc(){ - Serial.println("|----------------------------------|"); - Serial.println("| Sensor: LIS3DH |"); - if (!acc1.begin()) Serial.println("Could not start acc1"); - if (!acc2.begin()) Serial.println("Could not start acc2"); + rtt.println("|----------------------------------|"); + rtt.println("| Sensor: LIS3DH |"); + if (!acc1.begin()) rtt.println("Could not start acc1"); + if (!acc2.begin()) rtt.println("Could not start acc2"); - Serial.print("| Range = "); Serial.print(2 << acc1.getRange()); - Serial.println("G |"); + rtt.print("| Range = "); rtt.print(2 << acc1.getRange()); + rtt.println("G |"); // lis.setPerformanceMode(LIS3DH_MODE_LOW_POWER); - Serial.print("| Performance mode set to: "); + rtt.print("| Performance mode set to: "); switch (acc1.getPerformanceMode()) { - case LIS3DH_MODE_NORMAL: Serial.println("Normal 10bit"); break; - case LIS3DH_MODE_LOW_POWER: Serial.println("Low Power 8bit"); break; - case LIS3DH_MODE_HIGH_RESOLUTION: Serial.println("High Resolution 12bit"); break; + case LIS3DH_MODE_NORMAL: rtt.println("Normal 10bit"); break; + case LIS3DH_MODE_LOW_POWER: rtt.println("Low Power 8bit"); break; + case LIS3DH_MODE_HIGH_RESOLUTION: rtt.println("High Resolution 12bit"); break; } // lis.setDataRate(LIS3DH_DATARATE_50_HZ); - Serial.print("| Data rate set to: "); + rtt.print("| Data rate set to: "); switch (acc1.getDataRate()) { - case LIS3DH_DATARATE_1_HZ: Serial.println("1 Hz"); break; - case LIS3DH_DATARATE_10_HZ: Serial.println("10 Hz"); break; - case LIS3DH_DATARATE_25_HZ: Serial.println("25 Hz"); break; - case LIS3DH_DATARATE_50_HZ: Serial.println("50 Hz"); break; - case LIS3DH_DATARATE_100_HZ: Serial.println("100 Hz"); break; - case LIS3DH_DATARATE_200_HZ: Serial.println("200 Hz"); break; - case LIS3DH_DATARATE_400_HZ: Serial.println("400 Hz"); break; + case LIS3DH_DATARATE_1_HZ: rtt.println("1 Hz"); break; + case LIS3DH_DATARATE_10_HZ: rtt.println("10 Hz"); break; + case LIS3DH_DATARATE_25_HZ: rtt.println("25 Hz"); break; + case LIS3DH_DATARATE_50_HZ: rtt.println("50 Hz"); break; + case LIS3DH_DATARATE_100_HZ: rtt.println("100 Hz"); break; + case LIS3DH_DATARATE_200_HZ: rtt.println("200 Hz"); break; + case LIS3DH_DATARATE_400_HZ: rtt.println("400 Hz"); break; - case LIS3DH_DATARATE_POWERDOWN: Serial.println("Powered Down"); break; - case LIS3DH_DATARATE_LOWPOWER_5KHZ: Serial.println("5 Khz Low Power"); break; - case LIS3DH_DATARATE_LOWPOWER_1K6HZ: Serial.println("1.6 Khz Low Power"); break; + case LIS3DH_DATARATE_POWERDOWN: rtt.println("Powered Down"); break; + case LIS3DH_DATARATE_LOWPOWER_5KHZ: rtt.println("5 Khz Low Power"); break; + case LIS3DH_DATARATE_LOWPOWER_1K6HZ: rtt.println("1.6 Khz Low Power"); break; } - Serial.println("| Acc1 (X,Y,Z) | Acc2 (X,Y,Z) |"); + rtt.println("| Acc1 (X,Y,Z) | Acc2 (X,Y,Z) |"); acc1.read(); acc2.read(); - Serial.print("| "); - Serial.print(acc1.x); Serial.print(", "); - Serial.print(acc1.y); Serial.print(", "); - Serial.print(acc1.z); Serial.print(" | "); - Serial.print(acc2.x); Serial.print(", "); - Serial.print(acc2.y); Serial.print(", "); - Serial.print(acc2.z); Serial.println("|"); - Serial.println("|----------------------------------|"); + rtt.print("| "); + rtt.print(acc1.x); rtt.print(", "); + rtt.print(acc1.y); rtt.print(", "); + rtt.print(acc1.z); rtt.print(" | "); + rtt.print(acc2.x); rtt.print(", "); + rtt.print(acc2.y); rtt.print(", "); + rtt.print(acc2.z); rtt.println("|"); + rtt.println("|----------------------------------|"); } \ No newline at end of file diff --git a/NRF_firmware/src/main.h b/NRF_firmware/src/main.h index ea72e4a..7d0d630 100644 --- a/NRF_firmware/src/main.h +++ b/NRF_firmware/src/main.h @@ -7,6 +7,25 @@ #include "SparkFun_VEML6030_Ambient_Light_Sensor.h" #include #include +#include +#include + +SparkFun_Ambient_Light light(AL_ADDR); + +ENS210 ens210; +LPS22HBSensor lps22hb(&Wire); + +Adafruit_LIS3DH acc1 = Adafruit_LIS3DH(ACCL1_CS); +Adafruit_LIS3DH acc2 = Adafruit_LIS3DH(ACCL2_CS); + +RTTStream rtt; + +TinyGsm modem(SerialAT); +TinyGsmClient client(modem); + +bool espmodemrail = 0; +bool espon = 0; +bool modemon = 0; void measuretemp(); void measurepressure(); @@ -17,4 +36,13 @@ void powerupesp(); void wd_handler(); void gpioinit(); void measureacc(); -void powerupmodem(); \ No newline at end of file +void powerupmodem(); +void softpwrup(); +void powerdownesp(); +void powerdownmodem(); +void testmodem(); +void getgps(); +void httpreq(); +void disconnectmodem(); +void connectmodem(); +void initmodem(); \ No newline at end of file diff --git a/NRF_firmware/variants/hgd6/variant.h b/NRF_firmware/variants/hgd6/variant.h index 4694c60..3ef9673 100644 --- a/NRF_firmware/variants/hgd6/variant.h +++ b/NRF_firmware/variants/hgd6/variant.h @@ -5,15 +5,7 @@ #include "nrf_peripherals.h" -#if defined(NRF52_SERIES) #define VARIANT_MCK (64000000ul) -#else -#define VARIANT_MCK (16000000ul) -#endif - -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ #include "WVariant.h" @@ -22,20 +14,9 @@ extern "C" { #endif // __cplusplus -// Number of pins defined in PinDescription array -#if GPIO_COUNT == 1 -#define PINS_COUNT (32u) -#define NUM_DIGITAL_PINS (32u) -#elif GPIO_COUNT == 2 #define PINS_COUNT (64u) #define NUM_DIGITAL_PINS (64u) -#else -#error "Unsupported GPIO_COUNT" -#endif -#define NUM_ANALOG_INPUTS (6u) -#define NUM_ANALOG_OUTPUTS (0u) -// PIN setup #define GREEN_LED (0) #define RED_LED (1) #define VBAT_DIV (2) @@ -49,7 +30,9 @@ extern "C" #define I2C_SCL (13) #define I2C_SDA (15) #define MODEM_RXD (17) +#define MODEM_CON_A (20) #define MODEM_TXD (22) +#define MODEM_CON_B (24) #define ACC_INT (26) #define MODEM_ESP_PWR (29) #define PWR_LATCH (31) @@ -63,19 +46,12 @@ extern "C" #define ESP_PWR (45) #define ESP_GPIO0 (47) -#define PIN_A1 (VBAT_DIV) - -static const uint8_t A1 = PIN_A1 ; - #define ADC_RESOLUTION 14 #define LED_BUILTIN GREEN_LED -#define PIN_SERIAL_RX DEBUG_RXD -#define PIN_SERIAL_TX DEBUG_TXD - -#define PIN_SERIAL2_RX MODEM_RXD -#define PIN_SERIAL2_TX MODEM_TXD +#define PIN_SERIAL_RX MODEM_RXD +#define PIN_SERIAL_TX MODEM_TXD #define SPI_INTERFACES_COUNT 1 @@ -87,9 +63,6 @@ static const uint8_t MOSI = PIN_SPI_MOSI ; static const uint8_t MISO = PIN_SPI_MISO ; static const uint8_t SCK = PIN_SPI_SCK ; -/* - * Wire Interfaces - */ #define WIRE_INTERFACES_COUNT 1 #define PIN_WIRE_SDA (I2C_SDA) @@ -100,11 +73,7 @@ static const uint8_t SCL = PIN_WIRE_SCL; #define AL_ADDR 0x29 #define TINY_GSM_MODEM_BG95 -#define SerialAT Serial1 -#define SerialMon Serial -#define TINY_GSM_DEBUG SerialMon -#define GSM_AUTOBAUD_MIN 9600 -#define GSM_AUTOBAUD_MAX 57600 +#define SerialAT Serial #ifdef __cplusplus }