Modifying library for the WSSFM10 Sigfox module for compatibility with STM32L476RG
Posted: Tue Dec 29, 2020 7:46 pm
Arduino IDE version 1.8.13 installed.
Selected options:
TX (BRKWS01) is connected to RX/D0 (PA_3) and RX (BRKWS01) is connected to TX/D1 (PA_2) on STM32L476RG.
IoThings_WSSFM10_Demo.ino: IO_WSSFM10.h: IO_WSSFM10.cpp: Your assistance in this matter would be greatly appreciated.
Selected options:
- Board: "Nucleo-64"
- Board part number: "Nucleo L476RG"
- U(S)ART support: "Enabled (generic 'Serial')"
- USB support (if available): "None"
- USB speed (if available): "Low/Full Speed"
- Optimize: "Smallest (-Os default)"
- C Runtime Library: "Newlib Nano (default)"
- Upload method: "Mass Storage"
- Port: "COM3"


Code: Select all
/***************************************************************************
This is a library for the Wisol 10 module
Designed to work with all kinds of WSSFM10R Breakout Boards
This module use UART, 2 pins are required to interface.
Written by Adrien Chapelet for IoThings
***************************************************************************/
#include "IO_WSSFM10.h"
IO_WSSFM10 mySigfox(10, 11, true);
typedef struct {
int counter;
int light;
float temp;
} Payload;
int counter=0;
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
mySigfox.begin();
delay(50);
mySigfox.test();
mySigfox.getID();
mySigfox.getPAC();
mySigfox.getTemp();
//mySigfox.setPowerMode(1);
}
// the loop function runs over and over again forever
void loop() {
String sfResponse;
Payload p;
p.counter = counter;
p.light = analogRead(A1);
p.temp = analogRead(A2);
bool statusS = mySigfox.send(&p, sizeof(p));
if (statusS) counter++;
delay(60000);
bool statusSR = mySigfox.sendReceive(&p, sizeof(p), sfResponse);
if (statusSR) {
for (uint8_t i= 0; i<26; ++i) {//RX= 01 02 03 04 05 06 07 08
Serial.println(sfResponse[i]);
counter++;
}
}
}
Code: Select all
/***************************************************************************
This is a library for the Wisol 10 module
Designed to work with all kinds of WSSFM10R Breakout Boards
This module use UART, 2 pins are required to interface.
Written by Adrien Chapelet for IoThings
***************************************************************************/
#ifndef __IO_WSSFM10_H__
#define __IO_WSSFM10_H__
//#include <inttypes.h>
//#include "String.h"
#include "Arduino.h"
#include <SoftwareSerial.h>
//#include "SoftSerialSTM32.h"
#define LED_BUILTIN 13
class IO_WSSFM10
{
protected:
// Instance-specific properties
public:
//IO_WSSFM10(void);
//IO_WSSFM10(uint8_t rxPin, uint8_t txPin);
IO_WSSFM10(uint8_t rxPin, uint8_t txPin, bool debugEn);
String test(void);
void blink(void);
void begin(void);
String getData(void);
String getID(void);
String getPAC(void);
//uint16_t getTemp(void);
uint16_t getTemp(void);
String setPowerMode(uint8_t mode);
String setOutputPower(uint8_t power);
void wakeUp(void);
bool send(const void* data, uint8_t size);
bool sendReceive(const void* data, uint8_t size, String response);
bool sendString(String str);
bool sendReceiveString(String str, String response);
/*int8_t getRev();
bool setPower(uint8_t power);*/
String _nextReturn();
typedef enum {
OK,
KO,
SENT
} Status;
bool debug;
private:
uint8_t rx, tx;
//SoftSerialSTM32 Sigfox;
SoftwareSerial Sigfox;
//#if defined(__STM32F1__)
// HardwareSerial *port;
//#endif
};
extern IO_WSSFM10 WSSFM10;
#endif
Code: Select all
/***************************************************************************
This is a library for the Wisol 10 module
Designed to work with all kinds of WSSFM10R Breakout Boards
This module use UART, 2 pins are required to interface.
Written by Adrien Chapelet for IoThings
***************************************************************************/
#include "IO_WSSFM10.h"
//IO_WSSFM10 WSSFM10;
//Message buffer
uint8_t msg[12];
/*IO_WSSFM10::IO_WSSFM10 () : Sigfox(), debug(1) {
//Sigfox(rxPin, txPin, 3);
}*/
/*IO_WSSFM10::IO_WSSFM10 (uint8_t rxPin, uint8_t txPin) : rx(rxPin), tx(txPin), debug(0) {
Sigfox(rxPin, txPin, 3);
}*/
IO_WSSFM10::IO_WSSFM10 (uint8_t rxPin=10 , uint8_t txPin=11, bool debugEn=true) : Sigfox(rxPin, txPin), debug(debugEn) {
//Sigfox(rxPin, txPin);
}
//IO_WSSFM10::IO_WSSFM10 (uint8_t rxPin, uint8_t txPin, bool debugEn) : Sigfox(rxPin, txPin, 3), debug(debugEn) {
//}
void IO_WSSFM10::blink(){
digitalWrite(LED_BUILTIN, 1); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(LED_BUILTIN, 0); // turn the LED off by making the voltage LOW
delay(50);
}
String IO_WSSFM10::getData(){
String data = "";
char output;
while (!Sigfox.available()){
blink();
}
while(Sigfox.available()){
output = Sigfox.read();
if ((output != 0x0A) && (output != 0x0D)){//0x0A Line feed | 0x0D Carriage return
data += output;
}
delay(10);
}
if(debug){
Serial.print("Data: ");
Serial.println(data);
}
return data;
}
String IO_WSSFM10::test(){
Sigfox.print("AT\r");
String status = getData();
if(debug){
Serial.print("Status: ");
Serial.print(status);
}
return status;
}
void IO_WSSFM10::begin(){
//pinMode(rxPin, INPUT);
//pinMode(txPin, OUTPUT);
Sigfox.begin(9600);
if (debug) {
Serial.begin(9600);
delay(100);
getID();
delay(100);
getPAC();
}
}
//Get Sigfox ID
String IO_WSSFM10::getID(){
Sigfox.print("AT$I=10\r");
String id = getData();
if(debug){
Serial.print("ID: ");
Serial.println(id);
}
return id;
}
//Get PAC number
String IO_WSSFM10::getPAC(){
Sigfox.print("AT$I=11\r");
String pac = getData();
if(debug){
Serial.print("PAC: ");
Serial.println(pac);
}
return pac;
}
uint16_t IO_WSSFM10::getTemp(void){
Sigfox.print("AT$T?\r");
uint16_t tempVal = getData().toInt();
if(debug){
Serial.println("Module temperature: ");
Serial.println(tempVal);
}
return tempVal;
}
String IO_WSSFM10::setPowerMode(uint8_t mode){
//0: Software reset
//1: sleep, send a break to wake up
//2: deep_sleep, toggle GPIO0 or Reset_N to wake up
Sigfox.print("AT$P=");
Sigfox.print(mode);
Sigfox.print("\r");
String res = getData();
if(debug){
Serial.println("Power Mode response: ");
Serial.println(res);
}
return res;
}
String IO_WSSFM10::setOutputPower(uint8_t power){
Sigfox.print("ATS302=");
Sigfox.print(power);
Sigfox.print("\r");
String res = getData();
if(debug){
Serial.println("Output Power response: ");
Serial.println(res);
}
return res;
}
void IO_WSSFM10::wakeUp(void){
Sigfox.print("\r");
}
//Send Sigfox Message
bool IO_WSSFM10::send(const void* data, uint8_t size){//const void* data
uint8_t* bytes = (uint8_t*)data;
Sigfox.print("AT$SF=");
char tmp[3] = {0}; // 2 hex characters + null terminator
if(debug){
Serial.print("Bytes:");
}
for(uint8_t i= 0; i<size; ++i){
sprintf(tmp, "%02X", bytes[i]);
Sigfox.print(tmp);
if(debug){
Serial.print(tmp);
}
}
if(debug){
Serial.println();
}
Sigfox.print("\r");
while (!Sigfox.available()){
blink();
}
String res = getData();
if(res.indexOf("OK") >= 0) {
Serial.println("Message successfully sent");
return true;
}
if(debug){
Serial.print("Status: ");
Serial.println(res);
}
return false;
}
bool IO_WSSFM10::sendString(String str) {
if(debug){
Serial.print("Message:");
Serial.println(str);
}
Sigfox.print("AT$SF=");
Sigfox.print(str);
Sigfox.print("\r");
while (!Sigfox.available()){
blink();
}
String res = getData();
if(res.indexOf("OK") >= 0) {
Serial.println("Message successfully sent");
return true;
}
if(debug){
Serial.print("Status: ");
Serial.println(res);
}
return false;
}
bool IO_WSSFM10::sendReceive(const void* data, uint8_t size, String response){
uint8_t* bytes = (uint8_t*)data;
Sigfox.print("AT$SF=");
char tmp[3] = {0}; // 2 hex characters + null terminator
if(debug){
Serial.print("Bytes:");
}
for(uint8_t i= 0; i<size; ++i){
sprintf(tmp, "%02X", bytes[i]);
Sigfox.print(tmp);
if(debug){
Serial.print(tmp);
}
}
if(debug){
Serial.println();
}
Sigfox.print(",1\r");
while (!Sigfox.available()){
blink();
}
String res = getData();
if(res.indexOf("OK") >= 0) {
Serial.println("Message successfully sent");
response = getData();
return true;
}
if(debug){
Serial.print("Status: ");
Serial.println(res);
}
return false;
}
bool IO_WSSFM10::sendReceiveString(String str, String response) {
Sigfox.print("AT$SF=");
Sigfox.print(str);
Sigfox.print(",1\r");
while (!Sigfox.available()){
blink();
}
String res = getData();
if(res.indexOf("OK") >= 0) {
Serial.println("Message successfully sent");
response = getData();
return true;
}
if(debug){
Serial.print("Status: ");
Serial.println(res);
}
return false;
}