Un programme pour recevoir des SMS sur l'ESP32
Révision datée du 6 décembre 2023 à 19:44 par 192.168.2.1 (discussion)
Cette fois le programme est plus "opérationnel", il s'agit de recevoir des SMS sur le module ESP32-SIM800. Ainsi, on pourra envoyer des commandes depuis un tel pouvant déclencher des actions sur l'ESP32.
Voici le code, qui s'appuie sur la bibliothèque AsyncSMS. Ce code envoie un accusé de réception "BIEN RECU".
Nous pourrons revenir sur tout cela en atelier, avec de plus amples explications.
https://github.com/centaq/arduino-async-sms
Pour utilities.h, voir ceci, https://github.com/Xinyuan-LilyGO/LilyGo-T-Call-SIM800/blob/master/examples/Arduino_AT_Debug/utilities.h
// 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 #include "AsyncSMS.h" #include "utilities.h" #define SerialMon Serial #define SerialAT Serial1 AsyncSMS smsHelper(&SerialAT, 115200); void messageReceived(char * number, char * message) { //Do something with your message Serial.println("Message received"); Serial.println(number); Serial.println(message); // envoyer un message d'acquittement à l'émetteur String numberString = String(number); // Convertir en String Serial.println(numberString.c_str()); smsHelper.send(numberString.c_str(), "BIEN RECU", 10); } void setup() { // Set console baud rate SerialMon.begin(115200); // Set GSM module baud rate and UART pins SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); setupModem(); smsHelper.init(); smsHelper.smsReceived = *messageReceived; } void loop() { smsHelper.process(); }
Ajouter ce code en tant que fichier "utilities.h"
#include <Wire.h> #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.begin(I2C_SDA, I2C_SCL); 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 #elif defined(SIM800L_IP5306_VERSION_20200811) #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 #define IP5306_ADDR 0x75 #define IP5306_REG_SYS_CTL0 0x00 // setPowerBoostKeepOn bool setupPMU() { bool en = true; Wire.begin(I2C_SDA, I2C_SCL); 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; } #else #error "Please select the corresponding model" #endif #if defined(SIM800L_AXP192_VERSION_20200327) || defined(SIM800C_AXP192_VERSION_20200609) #include <axp20x.h> //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 void setupModem() { // Start power management if (setupPMU() == false) { Serial.println("Setting power error"); } #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); }