Bonjour à tous, et merci de m'accueillir.
meilleurs voeux 2025.
Voila, je desire utiliser la commande AT AT+BAT=? qui me retourne en mode moniteur la tension du module.
Cela fonctionne trés bien en echange depuis le moniteur serie, mais en programmation, je recupere tout autre chose , j'utilise le code ci dessous.
Sigfox.println("AT+BAT=?");
delay(100); // Attendre la réponse du module
// Lire la réponse du module
while (Sigfox.available()) {
String response = Sigfox.readString(); // Lire la réponse entière
Serial.println("Réponse du module Sigfox :");
Serial.println(response);
// Extraire la valeur de la tension si elle est au format attendu
if (response.startsWith("+BAT:")) {
float voltage = response.substring(6).toFloat();
Serial.print("Tension de la batterie : ");
Serial.print(voltage);
Serial.println(" V");
}
la reponse retournée suite à la commande est :
Réponse du module Sigfox :
2135s568:RF_API_init in TX
2135s568:RF at Freq 868089400
Quelqu un aurait il deja essayé ce genre de commande ?
Les messages de votre module Sigfox indiquent qu'il a initialisé l'interface RF (Radio Frequency) et qu'il est prêt à émettre sur la fréquence 868,0894 MHz (bande ISM en Europe 868 MHz).
vous attendez 100ms ce n'est peut être pas assez (ou trop) pour avoir la réponse... ➜ Qui vous dit que vous ne récupérez pas ce qui traîne dans le buffer série si vous n'avez pas lu les réponses à des commandes précédentes ou au message de boot ?
Bonjour,et merci pour le retour. Oui, c'est clair que je recupere ce qui se trouve dans le buffer. lors d'une 1ere boucle, j'obtiens bien ma tension. ensuite ce sont les retours (je pense) de mon envoi de données !?
Je ne trouve pas de commande pour vider le buffer ( si cela existe !)
Le mieux serait de lire la réponse après chaque commande pour voir si elle a fonctionné.
Il n’y a pas de moyen « propre » de vider le buffer , mais vous pouvez soit faire une boucle qui lit tout ce qui se trouve dans le buffer pendant un certain temps ou sinon vous appelez end() sur le port série puis begin() à nouveau
Encore merci pour le retour. j'ai fait des tests avec uniquement la commande AT+BAT=?, cela fonctionne tres bien, je recupere bien mes valeurs , verifiées au multimetre. le probléme survient apres ma commande AT$SF. je teste la fermeture et l'ouverture
Tu ne dis rien du module utilisé pour Sigfox et de son jeu de commandes AT
AT+BAT? est une commande 'locale' qui n'implique pas le réseau Sigfox contrairement à AT$SF qui ressemble à l'envoi d'une trame sur le réseau
Donne içi ton code complet et la désignation du module Sigfox utilisé.
Ton module est-il associé à un abonneemnt valide ?
Es-tu dans une zone couverte par le réseau
Le souci qu’il rencontre c’est qu’il émet des commandes AT qui vont écrire dans le buffer série leur réponse. Il ne lit pas cette réponse et donc le texte s’accumule jusqu’à déborder bien sûr (ce qui en soi n’est pas un souci puisqu’il ne s’intéresse pas à la réponse)
Quand il envoie la commande pour la batterie la réponse revient aussi dans le buffer série mais il y’a tout un tas de données avant qui n’ont pas été virées donc c’est plus compliqué de lire la réponse
D’où l’idée de vider le buffer série avant (ou après) chaque commande.
Oui mais j'aurai préféré le problème soit exposé dans son contexte
Le code permettant de voir l'enchaînement des commandes émises et la Data Sheet du module Sigfox les réponses attendues pour ces commandes....
La réponse à un AT$F est peut être au moins OK si cette commande a été émise sans demander d'info descendante en retour.
+Une info sur ce que voit aldem62 dans la console de SIgfox après sa commande AT$F ne serait pas de trop
Je comprends - le contexte est toujours utile mais sans doute pour ce cas précis on n’a pas besoin du détail.
La question de fond est finalement indépendante de sigfox et peut se résumer à cela :
On a un module connecté à un arduino sur une voie série et on lui envoie un enchaînement de commandes qui répondent et on ne veut extraire qu’une partie des réponses et ignorer les autres.
Ça revient à se demander comment vider le buffer en réception avant d’envoyer une nouvelle commande - ce qui peut être tricky puisqu’on ne maîtrise pas complètement quand le module en face a fini de parler.
C’est pour cela que je recommande de toujours lire la réponse en suivant le protocole attendu et soit l’ignorer soit la traiter. C’est là bien sûr que le contexte est important pour comprendre à quel protocole on a affaire.
Envoyer des commandes AT en sourd/aveugle en se contenant de les espacer par des delay() , sans tenir compte de ce que le 'modem' a à dire, peut faire illusion un certain temps jusqu'au jour où ça tourne mal.
Bonsoir,
toujours merci pour le retour.
le module utilisé est un LSM100A
mon projet est une balance connectée ( qui fonctionne depuis plus d'an) mais les batteries se vident vite avec l'arduino, j'ai donc créé mon propre circuit et j'essaie de mettre en veille 30 mn le systeme.
mon idée etait de suivre la tension pour voir quand mes piles commencent à faiblir. il y a aussi un panneau solaire
voici le code ( j'ai fait divers essais, il se peut qu il y est qqs lignes en doublon, ma 1ere idée etait de mesurer la tension sur une entrée de l'ATMEGA....
je vais aussi regarder le lien fourni
#include "HX711.h"
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SoftwareSerial.h>
#include <string.h>
#include <EEPROM.h>
// Constantes et définitions
const int LOADCELL_DOUT_PIN = 3;
const int LOADCELL_SCK_PIN = 2;
const int VOLTAGE_PIN_BATT = A0;
#define WATCHDOG_INTERVAL WDTO_8S
#define SLEEP_CYCLES 3
#define DELAY_AFTER_WAKEUP 10000
volatile uint16_t counter = 0;
float calibration_factor = 35530;
float dtare = 0;
const int EEPROM_TARE_ADDRESS = 0;
HX711 scale;
int rxPin = 10;
int txPin = 11;
SoftwareSerial Sigfox(rxPin, txPin);
void setupWatchdog(uint8_t interval) {
MCUSR = 0;
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDP3) | (1 << WDP0) | (1 << WDIE); // 8 secondes
}
ISR(WDT_vect) {
counter++;
if (counter >= SLEEP_CYCLES) {
counter = 0; // Interruption du Watchdog Timer
}
}
void setup() {
Serial.begin(9600);
Sigfox.begin(9600);
setupWatchdog(WATCHDOG_INTERVAL);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(calibration_factor);
// Charger la tare depuis l'EEPROM
EEPROM.get(EEPROM_TARE_ADDRESS, dtare);
Serial.print("Tare chargée depuis EEPROM : ");
Serial.println(dtare);
// Si la tare n'a jamais été définie, initialisez-la
if (isnan(dtare) || dtare != 0.0) {
scale.tare();
dtare = scale.get_offset(); // Fonction pour calibrer la tare
EEPROM.put(EEPROM_TARE_ADDRESS, dtare);
Serial.print("Nouvelle tare enregistrée.");
Serial.println(dtare);
}
delay(5000); // Stabilisation initiale
}
void loop() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
if (counter == 0) {
sleep_disable();
doAction();
}
}
void doAction() {
scale.power_up();
delay(2000);
Sigfox.print("AT+BAT=?\n");
delay(100); // Attendre la réponse du module
// Lire la réponse du module
while (Sigfox.available()) {
String response = Sigfox.readString(); // Lire la réponse entière
Serial.print("Réponse du module Sigfox :");
Serial.println(response);
// Extraire la valeur de la tension si elle est au format attendu
if (response.startsWith("+BAT:")) {
float voltage = response.substring(6).toFloat();
Serial.print("Tension de la batterie : ");
Serial.print(voltage);
Serial.println(" V");
}
}
float poids = scale.get_units();
if (poids < 0) poids = 0;
int16_t voltage = analogRead(VOLTAGE_PIN_BATT) * 5000 / 1023;
char buff[11];
int32_t pesee_finale = poids * 1000;
sprintf(buff, "%06lx%04x", pesee_finale, voltage);
Sigfox.print("AT$SF=");
Sigfox.println(buff);
delay(DELAY_AFTER_WAKEUP);
scale.power_down();
}