Pas encore un tutoriel , juste une description d’un test d’autonomie en cours. avc un SIM7080G pour utilser LTE-M
Carte Lolin32 Lite avec un accu LiON 2000mAh protégé
SIM7080G sur ce breakout BK-7080G v1 de AND-GLOBAL : (pas de régulateur LDO présent = ce que je voulais) )
manuel téléchargeable ici
Carte SIM M2M de Soracom Developpers , forfait 25MB/mois , plan X3EU.
OK pour particuliers (pas de n° de TVA fournir) 
Schéma : La carte BK-7080G s’alimente en 3,3V elle contient l’adaptation de niveaux logiques 3,3V <> 1,8V pour les entres/sorties du SIM7080G
Pistes d’amélioration :
-travailler le séquencement du modem pour réduire la durée de la phase d’éveil , donc la consomation d’énergie.
-travailler la robustesse du code en tenant compte à tout moment de l’état réel l du modem 4G et non l’état présumé
Programme en test :
/* Al1Fch , septembre 2025
test en cours
Carte Lolin32 Lite + Breakout BK-7080 avec un modem 4G LPWAN SIM7080G de Simcom
Sim M2M de Soracom Developpers
mode 4G : LTE-M , bande 20 (800Mhz)
Utilisation du PSM (1 heure de coupure est demandée à l'opérateur)
NB: en PSM le breakout BK-7080 consomme 90µA ( à condition de ne pas brancher l'antenne active du GNSS)
Sortie de deep-sleep de l'ESP32 avant exptiration du PSM, pour envoyer vers ThingSpeak, par une requête GET , la valeur de la tension d'alimentation du SIM7080G (commande AT+CBC)
Source d'énegergie : una accu LION 2000mAh , le régulateur linéaire LDO de la carte LOlin32 Lite alimente en 3,3V le BK-7080
pas de bibliothèque pour gérer le SIM7080g , ses fonctions HTTP spécifiques LPWAN sont utilisées
Améliorer la robustesse en prenant toujoiurs e compte l'état efefctif du modem et non son étété présumé !
*/
#include <HardwareSerial.h>
HardwareSerial modem(2); // UART2 : RX=33, TX=32
#define PWRKEY 25
String tension;
// Fonction d'envoi de commandes AT
bool sendAT(const char* cmd, const char* resp, uint32_t timeout = 2000, bool log = true) {
// Vider le RX avant d’envoyer
while (modem.available()) modem.read();
if (log) {
Serial.println("\r\n\r\n-------------- ");
Serial.println(cmd);
}
modem.print(cmd);
modem.print("\r\n");
uint32_t start = millis();
String buffer;
while (millis() - start < timeout) {
while (modem.available()) {
char c = modem.read();
buffer += c;
if (log) Serial.write(c); // affiche brut
// Détection de la réponse attendue
if (buffer.indexOf(resp) != -1) {
if (buffer.indexOf("CBC:") != -1) tension = buffer.substring(13, 17);
return true;
}
}
delay(1); // indispensable ou pas ?
}
if (log) {
Serial.print("\n!! Timeout, reçu: ");
Serial.println(buffer.length() ? buffer : "<rien>");
}
return false;
}
void setup() {
//Lancement modem par PWRKEY A la mise sous tension le démarrage di SIM8070G ets un peu plus long , metter une tempo suffisante ou attendre SMS
Serial.begin(115200);
modem.begin(115200, SERIAL_8N1, 33, 32);
Serial.println("\r\n SIM7080G + Get HTTP ThingSpeak + PSM modem +Deepsleep ESP32...");
delay(1000);
pinMode(PWRKEY, OUTPUT);
digitalWrite(PWRKEY, LOW);
Serial.println("PWRKEY LOW");
delay(300);
digitalWrite(PWRKEY, HIGH);
Serial.println("PWRKEY HIGH");
//sendAT("", "RDY", 10000); // attente message émis au boot
delay(10000); // temps de boot du SIM7080G // a remplacer par détection de 'SMS' émis par le modem au boot ?
// Vérifications de base
sendAT("AT", "OK", 1000);
sendAT("ATE0", "OK", 1000); // couper l’écho
sendAT("AT+CBC", "OK", 500);
Serial.println();
Serial.println(tension);
Serial.println(tension.length());
sendAT("AT+CPIN?", "READY", 1000); // SIM OK ?
sendAT("AT+CSQ", "", 1000); // niveau signal
sendAT("AT+CEREG?", "0,5", 1000); // enregistrement réseau
sendAT("AT+CGNAPN", "soracom.io", 7000); // APN récupéré automatiquement sur le réseau , activer la ligne en dessous
//sendAT("AT+CNCFG=0,1,"soracom.io") // pour configurer l'APN manuellement au cas ou
// Activer le contexte PDP
sendAT("AT+CNACT=0,1", "ACTIVE", 7000); // activer le PDP 0
sendAT("AT+CNACT?", "", 2000); // affiche l'IP
// Config HTTP
sendAT("AT+SHCONF=\"URL\",\"http://api.thingspeak.com\"", "", 1000);
sendAT("AT+SHCONF=\"BODYLEN\",1024", "", 1000);
sendAT("AT+SHCONF=\"HEADERLEN\",350", "", 1000);
// Ouvrir la session HTTP
sendAT("AT+SHCONN", "", 7000);
// Construire puis nevoyer requête GET avec clef &Field=
String requete = "AT+SHREQ=\"/update?api_key=XXXXXXXXXXXXXXXXXXXX&field4=" + tension + "\",1";
Serial.println("Requête construite : " + requete); // Pour vérification
sendAT(requete.c_str(), "", 7000); // nécessaire car la fonction sendAT attend const char*
// Lire la réponse
sendAT("AT+SHREAD=0,6", "", 3000); //6 octets à lire; indice de l'envoi
// Fermer la session
sendAT("AT+SHDISC", "", 1000);
sendAT("AT+CNACT=0,0", ""), 1000; // PDP off non indispensable , ralentit la led : on voit la fin de l'action
// Configurer PSM (exemple : TAU ~1h, Active Time 0
sendAT("AT+CPSMS=1,,,\"00100001\",\"00000000\"", "OK", 1000); // à déplacer avent l'attachement au réseau ?
delay(1000);
// lancer Deep-sleep 15' pourles tests, 1 heure ensuite
esp_sleep_enable_timer_wakeup(900ULL * 1000000ULL);
esp_deep_sleep_start();
}
void loop() {
}
Résultat sur ThingSpeak : Autonomie du montage (combien de semaines ?) par le suivi de la tension d’alimentation du modem 4G