SHANGUGAPRIYA G
Published

Grove Button With monoZero

Grove - Button is a momentary push button switch. This button outputs a HIGH signal when pressed, and LOW when released

IntermediateProtip2 days98
Grove Button With monoZero

Things used in this project

Hardware components

Seeed Studio Grove - Button(P)
×1
Female/Female Jumper Wires
Female/Female Jumper Wires
×4
monoZero 1WG
monoZ™ monoZero 1WG
×1
monoZero Grove
monoZ™ monoZero Grove
×1

Software apps and online services

STM32CUBEPROG
STMicroelectronics STM32CUBEPROG
monoZ SDK
monoZ™ monoZ SDK

Story

Read more

Schematics

Grove switch connection with Grove board

Connect the Grove switch on the J8 connector of Grove board as per the schematic.

Code

C file

C/C++
/*
 * MZ_Board_Grove_Switch.c
 *
 *  Created on: Mar 15, 2022
 *  Author: Alsufiyan
 */

/* Include Header Files - START */
#include "MZ_Board_Grove_Switch.h"
#include "MZ_sys_cmsis_os2.h"
#include "MZ_error_handler.h"
#include "MZ_timer.h"
#include "MZ_print.h"
#include "MZ_Lwm2m_public.h"
#include "MZ_type_converter.h"
#include "MZ_Modem_public.h"
#include "MZ_uart.h"
#include "MZ_main.h"
#include "stdlib.h"
#include "main.h"
/* Include Header Files - END */

/* Define some common use MACRO - START */
//#define REED_SWITCH_STATUS			//Macro to enable read and send Reed Switch Status
#define PUSH_BUTTON_STATUS			//Macro to enable read and send Push Button Status

#define SERVER_REG_NEED_SET						(0)
#define SERVER_REG_NEED_CLEAR						(1)
#define EXTI_CB_FLAG_CLEAR						(0)
#define EXTI_CB_FLAG_SET						(1)
#define OBSERVE_COMPLETE_SET						(1)
#define OBSERVE_COMPLETE_CLEAR					(0)
#define TIME_180SEC							(pdMS_TO_TICKS(180000))
#define TIMER_ID_CLEAR							(0)
/* Define some common use MACRO - END */

/* Thread related MACRO and variables - START */
#define SWITCH_APP_STACK_SIZE		(1024)  						
static mz_thread_t 			switch_thread_id = NULL;				
static StaticTask_t 			switch_cb_mem;						
static StackType_t 			switch_stack[SWITCH_APP_STACK_SIZE];			
/* Thread related MACRO and variables - END */

/* Timer related MACRO and variables - START */
#define LWM2M_SERVER_MONITORING_TIME		(TIME_180SEC)
static size_t lwm2m_server_monitoring_timer_id = TIMER_ID_CLEAR;				
/* Timer related MACRO and variables - END */

/* Reed switch related MACRO and variables - START */
//#define REED_SWITCH								REED_SW_Pin
#define PUSH_BUTTON								PB_Pin
static char external_interrupt_cb_flag  = EXTI_CB_FLAG_CLEAR;
static uint16_t exti_pin=0;
static uint8_t reed_switch_status=0;
static uint8_t push_button_status=0;
static uint8_t locstr[50]={0};
/* Reed switch related MACRO and variables - END */

/* LWM2M related MACRO and variables - START */
static char lwm2m_server_rereg_flag = SERVER_REG_NEED_CLEAR;				
static char observe_receive_flag = OBSERVE_COMPLETE_CLEAR;				
static char payload_string[11] = "";							
static char payload_string_1[11] = "";						
/* LWM2M related MACRO and variables - END */

extern void mz_reboot_sequence(void * arg);

/* static function prototypes - START */
static void lwm2m_server_monitoring_timer_cb(TimerHandle_t xTimer);
static void switch_read_timer_cb(TimerHandle_t xTimer);
static void lwm2m_server_reregistration(void);
static void create_lwm2m_payload_reed_switch(void);
static void send_reed_payload_to_server(void);
static void create_lwm2m_payload_pb(void);
static void send_pb_payload_to_server(void);
static void switch_app_thread(void * arg);
static void process_switch_status();
static uint32_t int32_to_string_decimal(uint8_t *dststr,uint32_t num);
/* static function prototypes - END */

/*============================================================================*/
/*           Monoz switch status and data send to Lwm2m server - START         */
/*============================================================================*/

/* EXTI line detection callback -START.  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	external_interrupt_cb_flag  = EXTI_CB_FLAG_SET;
	exti_pin = GPIO_Pin;
}
/*  EXTI line detection callback - END */

/*   process_switch_status -START.  */
static void process_switch_status(){
#ifdef REED_SWITCH_STATUS
	if(HAL_GPIO_ReadPin(GPIOD, REED_SWITCH)){
		reed_switch_status=1;
		mz_puts("Reed Switch Status: open\r\n");
	}else{
		reed_switch_status=0;
		mz_puts("Reed Switch Status: closed\r\n");
	}
#endif
#ifdef PUSH_BUTTON_STATUS
	if(HAL_GPIO_ReadPin(GPIOD, PUSH_BUTTON)){
		push_button_status=1;
		mz_puts("Push Button Status: open\r\n");
	}else{
		push_button_status=0;
		mz_puts("Push Button Status: closed\r\n");
	}
#endif
}
/*  process_switch_status - END */

/* LWM2M server registration monitoring timer callback - START
 */
static void lwm2m_server_monitoring_timer_cb(TimerHandle_t xTimer)
{
	/* Check if observe has not started */
	if(OBSERVE_COMPLETE_CLEAR == observe_receive_flag)
	{
		/* Then set the server re-registration flag */
		lwm2m_server_rereg_flag = SERVER_REG_NEED_SET;
	}
}
/* LWM2M server registration monitoring timer callback - END */

/* LWM2M server re-registration API - START
 
 */
static void lwm2m_server_reregistration(void)
{
	/* Clear previous observe receive flag */
	observe_receive_flag = OBSERVE_COMPLETE_CLEAR;

	/* Starting the Lwm2m server monitoring one time timer */
	if(MZ_OK != mz_tm_start(lwm2m_server_monitoring_timer_id))
	{
		mz_puts("Server monitoring timer creation failed\r\n");
	}

	/* Initiate the server re-registration */

	if(MZ_OK == MZ_modem_config_set(mz_reboot_sequence))
	{
		/* print the success in the CLI */
		mz_puts("Server re-reg sequence started\r\n");
	}
	else
	{
		/* print the fail - It will be again tried on next timer expire */
		mz_puts("Server re-reg sequence failed\r\n");
	}
}
/* LWM2M server re-registration API - END */

/* LWM2M Create payload API - START */
static void create_lwm2m_payload_reed_switch(void)
{
	/*
	 * As all the payload is just number, this is a optimized implementation
	 * of converting the final value to ASCII HEX string
	 */
	payload_string[0] = '\"';
	payload_string[1] = '3';
	payload_string[2] = '0' + reed_switch_status;
	payload_string[3] = '\"';
	payload_string[4] = '\0';
}
/* LWM2M Create payload API - END */

/*  LWM2M send payload API - START */
static void send_reed_payload_to_server(void)
{
	/* Set the Object 19/0/0 Data and send the Notify request to MonoZ_Lib */
	mz_error_t status = mz_set_and_notify_Ob19_0_0(payload_string);

	/* Check the status of the request */
	if(MZ_OK == status)
	{
		/* print success on CLI */
		mz_puts("Notify send to MonoZ_Lib\r\n");
	}
	else
	{
		/* print of error string on CLI */
		mz_puts(mz_error_to_str(status));
	}
}

/* LWM2M Create payload API - START */
static void create_lwm2m_payload_pb(void)
{
	/*
	 * As all the payload is just number, this is a optimized implementation
	 * of converting the final value to ASCII HEX string
	 */
	payload_string_1[0] = '\"';
	payload_string_1[1] = '3';
	payload_string_1[2] = '0' + push_button_status;
	payload_string_1[3] = '\"';
	payload_string_1[4] = '\0';
}
/* LWM2M Create payload API - END */

/*  LWM2M send payload API - START */
static void send_pb_payload_to_server(void)
{
	/* Set the Object 19/0/0 Data and send the Notify request to MonoZ_Lib */
	mz_error_t status = mz_set_and_notify_Ob19_0_0(payload_string_1);

	
	if(MZ_OK == status)
	{
		/* print success on CLI */
		mz_puts("Notify send to MonoZ_Lib\r\n");
	}
	else
	{
	
		mz_puts(mz_error_to_str(status));
	}
}

/* LWM2M send payload API - END */
/*  Switch main Application thread. - START */
static void switch_app_thread(void * arg)
{
	(void)arg;

	lwm2m_server_monitoring_timer_id =
			mz_tm_create_one("Server monitoring timer",
							LWM2M_SERVER_MONITORING_TIME,
							lwm2m_server_monitoring_timer_cb);
	/* Starting the Lwm2m server monitoring timer.	 */
	(void)mz_tm_start(lwm2m_server_monitoring_timer_id);

	/* Print on the console about timer start */
	mz_puts("Server monitoring timer started\r\n");

	while(1)
	{
	
		if(SERVER_REG_NEED_SET == lwm2m_server_rereg_flag)
		{
			/* clear the server re-registration flag */
			lwm2m_server_rereg_flag = SERVER_REG_NEED_CLEAR;

			/* Perform lwm2m server re-registration */
			lwm2m_server_reregistration();
		}
		if(EXTI_CB_FLAG_SET == external_interrupt_cb_flag){
			// process switch status
			process_switch_status();
			#ifdef REED_SWITCH_STATUS
			// Create the lwm2m payload for reed switch
			create_lwm2m_payload_reed_switch();
			// Send the reed switch payload to server
			send_reed_payload_to_server();
			#endif

			#ifdef PUSH_BUTTON_STATUS
			// Create the lwm2m payload for push button
			create_lwm2m_payload_pb();
			// Send the push button payload to server
			send_pb_payload_to_server();
			#endif
			/* clear the flag after processing */
			external_interrupt_cb_flag  = EXTI_CB_FLAG_CLEAR;
		}



		/* Put a delay to avoid blocking on this thread */
		HAL_Delay(10);


	}//End of while(1) - Do not place any code after this.

}
/* Switch main Application thread. - END */

/*
Switch Application initialization API. - START
 
 */
mz_error_t switch_app_init(void)
{
	uint8_t _ret= MZ_OK;

	/* Clear locstr of reed switch */
	memset(&locstr,0,sizeof(locstr));

	/* Create the Reed application thread */
	if(!mz_thread_create(	&switch_thread_id,
							"switch_app_scheduler",
							switch_app_thread,
							NULL,
							osPriorityNormal,
							switch_stack,
							SWITCH_APP_STACK_SIZE,
							&switch_cb_mem,
							sizeof(switch_cb_mem)))
	{
		_ret = MZ_THREAD_CREATE_FAIL;
	}

	_ret = mz_set_value_Ob19_0_0("\"30303030\"");
	if(MZ_OK != _ret) goto clean;
	_ret = mz_set_value_Ob19_1_0("\"30303030\"");
	if(MZ_OK != _ret) goto clean;

	clean :
	return _ret;
}
/* Switch Application initialization API. - END */

/*============================================================================*/
/*           Monoz Reed Switch Count and send to Lwm2m server - END           */
/*============================================================================*/

/*============================================================================*/
/*        Monoz Reed Switch Count - LWM2M event related code - START          */
/*============================================================================*/
/*
 * LWM2M user defined callback function. - START
 */
void lwm2m_event_process(void * event)
{
	st_lw_event * e = event;


	switch(e->lw_event)
	{
	
		case LW_EV_OBSERVE:
			
			mz_puts("Observe received\r\n");
		
			if(e->lw_Obj_id == 19 && e->lw_Obj_Ins_id == 0 && e->lw_Res_id == 0)
			{
				/* Set the observed received flag */
				observe_receive_flag = OBSERVE_COMPLETE_SET;
			}
		break;
		case LW_EV_CLIENT_NOTIFY_SEND:
			
			mz_puts("Notify send to server\r\n");
		break;
		case LW_EV_CLIENT_NOTIFY_SEND_ACK:
	
			mz_puts("Notify send acknowledge\r\n");
		break;
		case LW_EV_NOTIFY_FAIL:

			mz_puts("Notify send failed\r\n");
		break;
		case LW_EV_CLIENT_OFF:
	
			lwm2m_server_rereg_flag = SERVER_REG_NEED_SET;
		break;

#if 0
		
		case LW_EV_WRITE_DATA:
			/* Do something */
			;
		break;
		case LW_EV_EXECUTE:
			/* Do something */
			;
		break;
		case LW_EV_READ:
			/* Do something */
			;
		break;
		case LW_EV_OBSERVE_CANCEL:
			/* Do something */
			;
		break;
#endif

		default:
		break;
	}
}
/*============================================================================*/
/*        Monoz Reed Switch Count - LWM2M event related code - END            */
/*============================================================================*/

/*============================================================================*/
/* 			     Utils Functions - START                           */
/*============================================================================*/
static uint32_t int32_to_string_decimal(uint8_t *dststr,uint32_t num){
	uint32_t val=0;
	uint8_t mod=0;
	uint8_t i=0;
	uint8_t j=0;
	uint8_t len=0;
	uint8_t lbuf[15];
	val = num;
	mod = val%10;
	while(val > 0){
		mod = val%10;
		lbuf[i] = mod + 48;
		val = val/10;
		i++;
	}
	len=i;
	for(j=0;j<len;j++){
		i--;
		dststr[j]=lbuf[i];
	}
	j++;
	dststr[j]='\0';
//	dststr[j]='\n';
}
/*============================================================================*/
/* 			     Utils Functions - END                             */
/*============================================================================*/

H file

C/C++
/*
 * MZ_Board_Grove_Switch.h
 *
 *  Created on: Mar 15, 2022
 *  Author: Alsufiyan
 */

#ifndef MZ_BOARD_GROVE_SWITCH_H_
#define MZ_BOARD_GROVE_SWITCH_H_

#include "MZ_error_handler.h"

/**
 * @fn void lwm2m_event_process(void * event)
 * @brief Process LWM2M Event
 * @param event void
 */
void lwm2m_event_process(void * event);

#endif /* MZ_BOARD_Grove_SWITCH_H_ */

Credits

Alsufiyan

Posted by SHANGUGAPRIYA G

Comments