add modem code

This commit is contained in:
Jonas Niesner
2025-03-14 15:15:06 +01:00
parent d87a656679
commit 55c710bced
4 changed files with 363 additions and 133 deletions

View File

@@ -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

View File

@@ -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("|----------------------------------|");
}

View File

@@ -7,6 +7,25 @@
#include "SparkFun_VEML6030_Ambient_Light_Sensor.h"
#include <LPS22HBSensor.h>
#include <TinyGsmClient.h>
#include <RTTStream.h>
#include <ArduinoHttpClient.h>
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();
@@ -18,3 +37,12 @@ void wd_handler();
void gpioinit();
void measureacc();
void powerupmodem();
void softpwrup();
void powerdownesp();
void powerdownmodem();
void testmodem();
void getgps();
void httpreq();
void disconnectmodem();
void connectmodem();
void initmodem();

View File

@@ -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
}