diff --git a/examples/Arduino_KeepActive/Arduino_KeepActive.ino b/examples/Arduino_KeepActive/Arduino_KeepActive.ino new file mode 100644 index 0000000..71257b2 --- /dev/null +++ b/examples/Arduino_KeepActive/Arduino_KeepActive.ino @@ -0,0 +1,103 @@ +// Please select the corresponding model + +// #define SIM800L_IP5306_VERSION_20190610 +// #define SIM800L_AXP192_VERSION_20200327 +// #define SIM800C_AXP192_VERSION_20200609 +// #define SIM800L_IP5306_VERSION_20200811 + +// Define the serial console for debug prints, if needed +// #define DUMP_AT_COMMANDS +#define TINY_GSM_DEBUG SerialMon + +#include "utilities.h" + +// Set serial for debug console (to the Serial Monitor, default speed 115200) +#define SerialMon Serial +// Set serial for AT commands (to the module) +#define SerialAT Serial1 + +// Configure TinyGSM library +#define TINY_GSM_MODEM_SIM800 // Modem is SIM800 +#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb + +#include + +#ifdef DUMP_AT_COMMANDS +#include +StreamDebugger debugger(SerialAT, SerialMon); +TinyGsm modem(debugger); +#else +TinyGsm modem(SerialAT); +#endif + +#define uS_TO_S_FACTOR 1000000ULL /* Conversion factor for micro seconds to seconds */ +#define TIME_TO_SLEEP 300 /* Time ESP32 will go to sleep (in seconds) */ + +bool reply = false; + +TinyGsmClient client(modem); + + +void setupModem() +{ +#ifdef MODEM_RST + // Keep reset high + pinMode(MODEM_RST, OUTPUT); + digitalWrite(MODEM_RST, HIGH); +#endif + + pinMode(MODEM_PWRKEY, OUTPUT); + pinMode(MODEM_POWER_ON, OUTPUT); + + // Turn on the Modem power first + digitalWrite(MODEM_POWER_ON, HIGH); + + // Pull down PWRKEY for more than 1 second according to manual requirements + digitalWrite(MODEM_PWRKEY, HIGH); + delay(100); + digitalWrite(MODEM_PWRKEY, LOW); + delay(1000); + digitalWrite(MODEM_PWRKEY, HIGH); + + // Initialize the indicator as an output + pinMode(LED_GPIO, OUTPUT); + digitalWrite(LED_GPIO, LED_OFF); +} + +void setup() +{ + // Set console baud rate + SerialMon.begin(115200); + + delay(10); + + // Start power management + if (setupPMU() == false) { + Serial.println("Setting power error"); + } + + // Some start operations + setupModem(); + + // Set GSM module baud rate and UART pins + SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); + +} + +void loop() +{ + bool ret = modem.restart(); + if (ret == false) { + Serial.println("restart .."); + return; + } + + Serial.println("Set SIM800X keep active on"); + + // Set IO25 to sleep hold, so that when ESP32 sleeps, SIM800X will keep power and running + gpio_hold_en(GPIO_NUM_25); //MODEM_POWER_ON + + esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); + + esp_deep_sleep_start(); +} diff --git a/examples/Arduino_KeepActive/utilities.h b/examples/Arduino_KeepActive/utilities.h new file mode 100644 index 0000000..2f3f0f6 --- /dev/null +++ b/examples/Arduino_KeepActive/utilities.h @@ -0,0 +1,119 @@ + +#include + +#if defined(SIM800L_IP5306_VERSION_20190610) + +#define MODEM_RST 5 +#define MODEM_PWRKEY 4 +#define MODEM_POWER_ON 23 +#define MODEM_TX 27 +#define MODEM_RX 26 + +#define I2C_SDA 21 +#define I2C_SCL 22 +#define LED_GPIO 13 +#define LED_ON HIGH +#define LED_OFF LOW + +#define IP5306_ADDR 0x75 +#define IP5306_REG_SYS_CTL0 0x00 + +// setPowerBoostKeepOn +bool setupPMU() +{ + bool en = true; + Wire.beginTransmission(IP5306_ADDR); + Wire.write(IP5306_REG_SYS_CTL0); + if (en) { + Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on + } else { + Wire.write(0x35); // 0x37 is default reg value + } + return Wire.endTransmission() == 0; +} + + +#elif defined(SIM800L_AXP192_VERSION_20200327) + +#define MODEM_RST 5 +#define MODEM_PWRKEY 4 +#define MODEM_POWER_ON 23 +#define MODEM_TX 27 +#define MODEM_RX 26 +#define MODEM_DTR 32 +#define MODEM_RI 33 + +#define I2C_SDA 21 +#define I2C_SCL 22 +#define LED_GPIO 13 +#define LED_ON HIGH +#define LED_OFF LOW + + +#elif defined(SIM800C_AXP192_VERSION_20200609) +// pin definitions +#define MODEM_PWRKEY 4 +#define MODEM_POWER_ON 25 +#define MODEM_TX 27 +#define MODEM_RX 26 +#define MODEM_DTR 32 +#define MODEM_RI 33 + +#define I2C_SDA 21 +#define I2C_SCL 22 +#define LED_GPIO 12 +#define LED_ON LOW +#define LED_OFF HIGH + +#else +#error "Please select the corresponding model" +#endif + + +#if defined(SIM800L_AXP192_VERSION_20200327) || defined(SIM800C_AXP192_VERSION_20200609) +#include //https://github.com/lewisxhe/AXP202X_Library + +AXP20X_Class axp; + +bool setupPMU() +{ +// For more information about the use of AXP192, please refer to AXP202X_Library https://github.com/lewisxhe/AXP202X_Library + Wire.begin(I2C_SDA, I2C_SCL); + int ret = axp.begin(Wire, AXP192_SLAVE_ADDRESS); + + if (ret == AXP_FAIL) { + Serial.println("AXP Power begin failed"); + return false; + } + + //! Turn off unused power + axp.setPowerOutPut(AXP192_DCDC1, AXP202_OFF); + axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); + axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); + axp.setPowerOutPut(AXP192_DCDC2, AXP202_OFF); + axp.setPowerOutPut(AXP192_EXTEN, AXP202_OFF); + + //! Do not turn off DC3, it is powered by esp32 + // axp.setPowerOutPut(AXP192_DCDC3, AXP202_ON); + + // Set the charging indicator to turn off + // Turn it off to save current consumption + // axp.setChgLEDMode(AXP20X_LED_OFF); + + // Set the charging indicator to flash once per second + // axp.setChgLEDMode(AXP20X_LED_BLINK_1HZ); + + + //! Use axp192 adc get voltage info + axp.adc1Enable(AXP202_VBUS_VOL_ADC1 | AXP202_VBUS_CUR_ADC1 | AXP202_BATT_CUR_ADC1 | AXP202_BATT_VOL_ADC1, true); + + float vbus_v = axp.getVbusVoltage(); + float vbus_c = axp.getVbusCurrent(); + float batt_v = axp.getBattVoltage(); + // axp.getBattPercentage(); // axp192 is not support percentage + Serial.printf("VBUS:%.2f mV %.2f mA ,BATTERY: %.2f\n", vbus_v, vbus_c, batt_v); + + return true; +} + +#endif \ No newline at end of file