Nassim Bettach
Published © Apache-2.0

Sens'it Window Opening | Temperature/Humidity Reports

A second project on how to use the Sens'it SDK to implement a feature to detect how long a window was open, and build a dashboard.

IntermediateFull instructions provided2 hours765

Things used in this project

Hardware components

Sigfox Sens'it
×1

Software apps and online services

Sigfox IoT Agency Platform
Sigfox Build Sens'it

Story

Read more

Code

main_OPENDETECT.c

C/C++
Here your new feature !
/*!******************************************************************
 * \file main.c
 * \brief Sens'it SDK template
 * \author Sens'it Team
 * \copyright Copyright (c) 2018 Sigfox, All Rights Reserved.
 *
 * This file is an empty main template.
 * You can use it as a basis to develop your own firmware.
 *******************************************************************/
/******* INCLUDES **************************************************/
#include "sensit_types.h"
#include "sensit_api.h"
#include "error.h"
#include "battery.h"
#include "button.h"
#include "radio_api.h"
#include "hts221.h"
#include "serial.h"
#include "AT_parser.h"


/******* GLOBAL VARIABLES ******************************************/
u8 firmware_version[] = "TEMPLATE";


/*******************************************************************/

int main()
{
    error_t     err;
    button_e    btn;
    u16         battery_level;
    bool        state;
	u8          payload[4] = {0, 0, 0, 0};
	s16			temperature;
	u16			humidity;
    u32         timestamp;
    u32         timediff;
    u8          time_open;

    /* Start of initialization */
    /* Configure button */
    SENSIT_API_configure_button(INTERRUPT_BOTH_EGDE);
    /* Configure reed switch */
    SENSIT_API_configure_reed_switch(TRUE, INTERRUPT_BOTH_EGDE);
    /* Init Serial port */
    SERIAL_init();
    /* Initialize Sens'it radio */
    err = RADIO_API_init();
    ERROR_parser(err);
    /* Initialize temperature & humidity sensor */
    err = HTS221_init();
    ERROR_parser(err);
    /* Clear pending interrupt */
	/* End of initialization */
    while (TRUE)
    {
        /* Execution loop */

        /* Check of battery level */
        BATTERY_handler(&battery_level);

        /* RTC alarm interrupt handler */
		if ((pending_interrupt & INTERRUPT_MASK_RTC) == INTERRUPT_MASK_RTC)
		{
			/* Clear interupt */
			pending_interrupt &= ~INTERRUPT_MASK_RTC;
		}
		
		/* Button interrupt handler */
        if ((pending_interrupt & INTERRUPT_MASK_BUTTON) == INTERRUPT_MASK_BUTTON)
        {
            /* RGB Led ON during count of button presses */
            SENSIT_API_set_rgb_led(RGB_WHITE);
            /* Count number of presses */
            btn = BUTTON_handler();
            /* RGB Led OFF */
            SENSIT_API_set_rgb_led(RGB_OFF);
            if (btn == BUTTON_FOUR_PRESSES)
            {
                /* Reset the device */
                SENSIT_API_reset();
            }
            /* Clear interrupt */
            pending_interrupt &= ~INTERRUPT_MASK_BUTTON;
        }

		/* Reed switch interrupt handler */
        if ((pending_interrupt & INTERRUPT_MASK_REED_SWITCH) == INTERRUPT_MASK_REED_SWITCH)
        {
            
            SENSIT_API_get_reed_switch_state(&state);
            if (state == TRUE)           /* Closed window */
            {
                SENSIT_API_set_rgb_led(RGB_GREEN);
                SENSIT_API_wait(500);
                SENSIT_API_set_rgb_led(RGB_OFF);
                SENSIT_API_get_current_time(&timediff);
                time_open = (timediff - timestamp) / 60;
            }
            else                        /* Open window */
            {
                SENSIT_API_set_rgb_led(RGB_RED);
                SENSIT_API_wait(500);
                SENSIT_API_set_rgb_led(RGB_OFF);
                SENSIT_API_get_current_time(&timestamp);
                time_open = 0;
            }

            /* Clear interrupt */
            pending_interrupt &= ~INTERRUPT_MASK_REED_SWITCH;

            /* Do a temperatue & relative humidity measurement */
			err = HTS221_measure(&temperature, &humidity);
			if (err != HTS221_ERR_NONE)
				ERROR_parser(err);

            /* Create payload */
            payload[0] = state;
            payload[1] = (temperature + 200) >> 8;
            payload[2] = (u8)(temperature + 200);
            payload[3] = humidity;
            payload[4] = time_open;

            /* Send payload */
		    err = RADIO_API_send_message(RGB_YELLOW, payload, 5, FALSE, NULL);
		    ERROR_parser(err);
        }
        /* Check if all interrupt have been clear */
        if (pending_interrupt == 0)
        {
            /* Wait for Interrupt */
            SENSIT_API_sleep(FALSE);
        }
    } /* End of while */
}

/*******************************************************************/

Makefile

Makefile
Makefile
##############################
#    Sens'it SDK Makefile    #
##############################


# -----------
# SDK LIBRARY
# -----------
LIB_NAME = SENSIT_SDK_V2.0.0
LIB_PATH = lib


# --------------
# OUTPUT FOLDERS
# --------------
BIN_PATH = bin
OBJ_PATH = obj


# ------------
# OUTPUT FILES
# ------------
OUTPUT_NAME = sensit
MAP_OUTPUT  = $(OUTPUT_NAME).map
ELF_OUTPUT  = $(OUTPUT_NAME).elf
BIN_OUTPUT  = $(OUTPUT_NAME).bin
SIZE_OUTPUT = $(OUTPUT_NAME).siz


# ---------
# TOOLCHAIN
# ---------
CC = arm-none-eabi-gcc
BIN_TOOL  = arm-none-eabi-objcopy
SIZE_TOOL = arm-none-eabi-size


# -------------------
# COMPILATION OPTIONS
# -------------------
CC_OPT   = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g -Os -Wall -fmessage-length=0 -ffunction-sections
CC_INC   = -Iinc -Iinc/sensit -Iinc/sigfox -Iinc/resources -Iinc/radio -Iinc/sensors -Iinc/tools -Isrc
CC_FLAGS = -DUSB -DUSE_RC1


# ---------------
# SOURCES FOLDERS
# ---------------
VPATH += \
src \
src/resources \
src/sensors \
src/radio \
src/tools


# ------------
# OBJECTS LIST
# ------------
OBJ_LIST = \
error.o \
button.o \
battery.o \
callback.o \
serial.o \
radio_api.o \
etsi.o \
fcc.o \
hts221.o \
ltr329.o \
fxos8700.o \
AT_parser.o \
AT_functions.o \
discovery.o \
button_morse.o

OBJS = $(addprefix $(OBJ_PATH)/,$(OBJ_LIST))


# ------------
# LINK OPTIONS
# ------------
LD_OPT  = -L$(LIB_PATH) -T "LinkerScript.ld" -nostartfiles -nodefaultlibs -nostdlib -Xlinker --gc-sections -Wl,-Map,"$(BIN_PATH)/$(MAP_OUTPUT)"


# -----------------
# COMPLETE BUILDING
# -----------------
all: clean dir $(OBJS) main bin

temperature: clean dir $(OBJS) main_TEMPERATURE bin
light: clean dir $(OBJS) main_LIGHT bin
vibration: clean dir $(OBJS) main_VIBRATION bin
magnet: clean dir $(OBJS) main_MAGNET bin
modem: clean dir $(OBJS) main_MODEM bin
morse: clean dir $(OBJS) main_MORSE bin
window: clean dir $(OBJS) main_OPENDETECT bin


# ----------------
# OBJECTS BUILDING
# ----------------
$(OBJ_PATH)/%.o: %.c
	@echo 'Building file: $@'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $@ $<
	@echo 'Finished building: $@'
	@echo ' '

main:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_TEMPERATURE:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_TEMPERATURE.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_LIGHT:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_LIGHT.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_VIBRATION:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_VIBRATION.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_MAGNET:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_MAGNET.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_MODEM:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_MODEM.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_MORSE:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_MORSE.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

main_OPENDETECT:
	@echo 'Building file: $(OBJ_PATH)/main.o'
	@echo 'Invoking: Cross ARM C Compiler'
	$(CC) $(CC_OPT) $(CC_FLAGS) $(CC_INC) -c -o $(OBJ_PATH)/main.o src/main_OPENDETECT.c
	@echo 'Finished building: $(OBJ_PATH)/main.o'
	@echo ' '

# ------------------------
# ELF / BIN / SIZ BUILDING
# ------------------------
$(BIN_PATH)/$(ELF_OUTPUT):
	@echo 'Building target: $(ELF_OUTPUT)'
	@echo 'Invoking: Cross ARM C Linker'
	$(CC) $(CC_OPT) $(LD_OPT) -o $@ $(OBJS) $(OBJ_PATH)/main.o -l$(LIB_NAME)
	@echo 'Finished building: $(ELF_OUTPUT)'
	@echo ' '

$(BIN_PATH)/$(BIN_OUTPUT):
	@echo 'Building target: $(BIN_OUTPUT)'
	@echo 'Invoking: Cross ARM GNU Create Flash Image'
	$(BIN_TOOL) -O binary $(BIN_PATH)/$(ELF_OUTPUT) $@
	@echo 'Finished building: $(BIN_OUTPUT)'
	@echo ' '

$(BIN_PATH)/$(SIZE_OUTPUT):
	@echo 'Building target: $(SIZE_OUTPUT)'
	@echo 'Invoking: Cross ARM GNU Print Size'
	$(SIZE_TOOL) --format=berkeley "$(BIN_PATH)/$(ELF_OUTPUT)" > $@
	@cat $@
	@echo 'Finished building: $(SIZE_OUTPUT)'
	@echo ' '

bin: $(BIN_PATH)/$(ELF_OUTPUT) $(BIN_PATH)/$(BIN_OUTPUT) $(BIN_PATH)/$(SIZE_OUTPUT)


# -------------
# OTHER TARGETS
# -------------
clean:
	@echo 'Clean output folders'
	rm -rf $(BIN_PATH) $(OBJ_PATH)
	@echo ' '

dir:
	@echo 'Create output folders'
	mkdir -p $(BIN_PATH) $(OBJ_PATH)
	@echo ' '

# Rule for USB flashing using dfu file manager (vendor id 0483)
prog:
	dfu-util -a 0 -s 0x08000000:leave -D $(BIN_PATH)/$(BIN_OUTPUT)

Credits

Nassim Bettach

Nassim Bettach

3 projects • 5 followers

Comments