-
Notifications
You must be signed in to change notification settings - Fork 6
Función Sprintf
la función estandar en lenguaje C "sprintf" permite formatear cadenas de texto, en este caso lo usaremos para formatear las variables en formato hexadecimal, también lo usaremos para empaquetar multiples variables y luego enviar los datos al modulo wisol.
sprintf(char* buffer, char* CadenaFormato, object Valor);
/* | | \_ Lista de valores que se van a convertir en cadena
| \_ cadena con la máscara de los valores a convertir
\_ Buffer donde devolveremos el resultado de los valores convertidos */
primero declaramos una buffer para el mensaje:
char buff[40];
int16_t a = 4576;
int8_t b = 135;
float c = -11.435;
long d = 153000000;
sprintf(buff,"%04x%02x%08lx%08lx", a , b , c , d);
- % significa que inserteramos una variable en esta parte del string
- 04 signifca que usaremos 4 caracteres. cada carecter cubre 4 bits. el 0 garantiza que se. el 0 garantiza que se usaran 4 caracteres, rellenando con ceros de ser necesario
- x significa ser formateado en hexadecimal y minusculas. X se puede usar para mayusculas
Serial.println(buff);
wisol.SEND(buff);
gps:
float flat, flon;//float=32bits=4bytes
gps.f_get_position(&flat, &flon, &age);
int16_t temperatura = wisol.TEMP(); //int=16bits=2bytes
uint16_t bateria = wisol.VOLT(); //int=16bits=2bytes
sprintf(buff,"%08lx%08lx%04x%04x",flat,flon,temperatura,bateria);
adc:
uint16_t humedad_adc = analogRead(A0); //2bytes
int h_r = map(humedad_adc, AirValue, WaterValue, 0, 100);
uint8_t humedad_relativa = h_r;// 1 byte
int16_t temperatura_w = wisol.TEMP(); //int=16bits=2bytes
uint16_t bateria = wisol.VOLT(); //int=16bits=2bytes
//Total=7Bytes
sprintf(buff,"%04x%02x%04x%04x",humedad_adc,humedad_relativa,temperatura_w,bateria);
humedad:
uint8_t humedad = dht.readHumidity();// varia entre 0% hasta 100% un byte es suficiente
int16_t temperatura_dht = dht.readTemperature()*10;//2bytes
int16_t temperatura_w = wisol.TEMP(); //int=16bits=2bytes
uint16_t bateria = wisol.VOLT(); //int=16bits=2bytes
//Total=7Bytes
sprintf(buff,"%02x%04x%04x%04x",humedad,temperatura_dht,temperatura_w,bateria);
Enviar datos de sensor de temperatura ambiente,humedad ambiente, bateria, temperatura de chip. Cada vez que es presionado el botón 13 (ubicado al lado derecho).
/*
Derechos Reservados "Teca" 2020, autor Marco A. Caballero Rev.1.2
UFOX es un kit de desarrollo Sigfox basado en el microcontrolador
ATMEGA 32U4 y modem WSSFM10R4 la compilacion es compatible con Arduino Leonardo
más informacion en https://github.com/TECA-IOT/Ufox
este ejemplo necesita un sensor DHT22 y las librerias de adafruit:
- DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
para mas informacion lea los ejemplos incluidos con sus respectivas librerias
compruebe el correcto funcionamiento del DHT usando el ejemplo DHTtester de adafruit
Para desempaquetar esta cadena de datos usted debe configuar un callback
personalizado en el backend de sigfox con las variables correspondientes con las que
fueron declarados en este ejemplo.
*/
#include <Ufox.h>
#define btn 13
#define RXLED 17
Ufox wisol;
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
wisol.begin(9600);
dht.begin();
while (!Serial); //comentar si usará una fuente de energía externa
pinMode(RXLED,OUTPUT);
pinMode(btn,INPUT);
Serial.println("-Presione botón 13-");
}
void loop() {
if(digitalRead(btn)==0){
wisol.RST();
digitalWrite(RXLED,LOW);
uint8_t humedad = dht.readHumidity();// varia entre 0% hasta 100% un byte es suficiente
int16_t temperatura_dht = dht.readTemperature()*10; // multiplicamos por 10 antes de convertirlo en entero con signo para no perder un decimal. 2bytes
int16_t temperatura_w = wisol.TEMP(); //int=16bits=2bytes
uint16_t bateria = wisol.VOLT(); //int=16bits=2bytes
//Total=7Bytes
Serial.print(humedad); Serial.print(" ");
Serial.print(temperatura_dht); Serial.print(" ");
Serial.print(temperatura_w); Serial.print(" ");
Serial.print(bateria); Serial.println(" ");
char buff[30]="";
//formatear a cadena, convertir los datos a valores hexagesimales
sprintf(buff,"%02x%04x%04x%04x",humedad,temperatura_dht,temperatura_w,bateria);
//Custom payload config hum::uint:8 tmpD::int:16 tmpW::int:16 bat::uint:16
Serial.print("Enviando: ");
Serial.println(buff);
Serial.println(wisol.SEND(buff)); //Envio de datos Sigfox
digitalWrite(RXLED,HIGH);
wisol.SLEEP();
delay(3000);
Serial.println("-Presione botón 13-");
}
}