vinay y.n
Published © GPL3+

Smart Home Concept Using Psoc6

Smart Switching using Capsense helps to control the appliances by a touch. Intruder detection and alerting using motion detection and noise.

IntermediateFull instructions provided6 hours899
Smart Home Concept Using Psoc6

Things used in this project

Hardware components

PSoC™ 62S2 Wi-Fi BT Pioneer Kit
Infineon PSoC™ 62S2 Wi-Fi BT Pioneer Kit
×1
12-volt dc adapter
×1
Berg Pins( Right angle)
×1
Berg Pins
×1
General-purpose PCB
×1
Resistor 10k ohm
Resistor 10k ohm
×1
Resistor 2.21k ohm
Resistor 2.21k ohm
×1
Resistor 1k ohm
Resistor 1k ohm
×1
Resistor 475 ohm
Resistor 475 ohm
×1
General Purpose Transistor PNP
General Purpose Transistor PNP
×1
Dc Barrel Jack Adapter - Female
×1
Capacitor 10 µF
Capacitor 10 µF
×1
Capacitor 470 µF
Capacitor 470 µF
×1
Linear Regulator (7805)
Linear Regulator (7805)
×1
mct2e
×1
MINI RELAY SPDT 5 PINS 12VDC 10A 120V CONTACT
TaydaElectronics MINI RELAY SPDT 5 PINS 12VDC 10A 120V CONTACT
×1
Buzzer, Piezo
Buzzer, Piezo
×1
PIR Motion Sensor (generic)
PIR Motion Sensor (generic)
×1

Software apps and online services

ModusToolbox™ Software
Infineon ModusToolbox™ Software

Hand tools and fabrication machines

Multitool, Screwdriver
Multitool, Screwdriver
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Custom parts and enclosures

Smart Home Concept using Psoc6 connection Representation

Schematics

PSoC CY8ckit 062 WIFI-BT Pioneer Kit interfacing with external components.

Smart Home Concept using Psoc6 connection Representation

Code

C0DE

C/C++
/*******************************************************************************
 * Include header files
 ******************************************************************************/
#include "cybsp.h"
#include "stdlib.h"
#include "cy_pdl.h"
#include "cyhal.h"
#include "cycfg.h"
#include "cycfg_capsense.h"
#include "led.h"
#include "cy_retarget_io.h"
#include "mtb_light_sensor.h" /*light sensor library */
#include "GUI.h"
#include "mtb_st7789v.h"
#include "cy8ckit_028_tft_pins.h"
/*******************************************************************************
 *  Macros
 ******************************************************************************/
#define CAPSENSE_INTR_PRIORITY      (3u)
#define EZI2C_INTR_PRIORITY         (1u) /* EZI2C interrupt priority must be* higher than CapSense interrupt */
#define LIGHT_SENSOR_PIN (CYBSP_A0)
#define FRAME_SIZE                  (1024)
#define THRESHOLD_HYSTERESIS        70u  /* PDM Sensitivity adjustment (as value increases sensitivity decreases)*/
#define VOLUME_RATIO                (4*FRAME_SIZE)
#define SAMPLE_RATE_HZ              8000u
#define DECIMATION_RATE             64u
#define AUDIO_SYS_CLOCK_HZ          24576000u
#define PDM_DATA                    P10_5
#define PDM_CLK                     P10_4
#define BUZZER_BEEP_COUNT         (2)
#define PIR_BUZZER_BEEP_COUNT         (2)
#define GPIO_INTERRUPT_PRIORITY (1u)
cyhal_adc_t adc;
mtb_light_sensor_t light_sensor;


/*******************************************************************************
* Function Prototypes
*******************************************************************************/

static uint32_t initialize_capsense(void);
static void process_touch(void);
static void initialize_capsense_tuner(void);
static void capsense_isr(void);
static void capsense_callback();
void handle_error(void);
void button_isr_handler(void *arg, cyhal_gpio_event_t event);
void pdm_pcm_isr_handler(void *arg, cyhal_pdm_pcm_event_t event);
void clock_init(void);

/*******************************************************************************
* Global Variables
*******************************************************************************/
cy_stc_scb_ezi2c_context_t ezi2c_context;
cyhal_ezi2c_t sEzI2C;
cyhal_ezi2c_slave_cfg_t sEzI2C_sub_cfg;
cyhal_ezi2c_cfg_t sEzI2C_cfg;
volatile bool capsense_scan_complete = false;
volatile bool button_flag = false;
volatile bool pdm_pcm_flag = true;
uint32_t noise_threshold = THRESHOLD_HYSTERESIS;
volatile bool gpio_intr_flag = false;


uint32_t volume = 0;

cyhal_pdm_pcm_t pdm_pcm;
cyhal_clock_t   audio_clock;
cyhal_clock_t   pll_clock;

void handle_error(void)
{
    /* Disable all interrupts. */
    __disable_irq();

    CY_ASSERT(0);
}


/*******************************************************************************
* TFT DISPLAY PIN CONFIGURARIONS
*******************************************************************************/
const mtb_st7789v_pins_t tft_pins =
{
    .db08 = CY8CKIT_028_TFT_PIN_DISPLAY_DB8,
    .db09 = CY8CKIT_028_TFT_PIN_DISPLAY_DB9,
    .db10 = CY8CKIT_028_TFT_PIN_DISPLAY_DB10,
    .db11 = CY8CKIT_028_TFT_PIN_DISPLAY_DB11,
    .db12 = CY8CKIT_028_TFT_PIN_DISPLAY_DB12,
    .db13 = CY8CKIT_028_TFT_PIN_DISPLAY_DB13,
    .db14 = CY8CKIT_028_TFT_PIN_DISPLAY_DB14,
    .db15 = CY8CKIT_028_TFT_PIN_DISPLAY_DB15,
    .nrd  = CY8CKIT_028_TFT_PIN_DISPLAY_NRD,
    .nwr  = CY8CKIT_028_TFT_PIN_DISPLAY_NWR,
    .dc   = CY8CKIT_028_TFT_PIN_DISPLAY_DC,
    .rst  = CY8CKIT_028_TFT_PIN_DISPLAY_RST
};

/*******************************************************************************
* PDM MICROPHONE intialization setting
*******************************************************************************/
const cyhal_pdm_pcm_cfg_t pdm_pcm_cfg =
{
    .sample_rate     = SAMPLE_RATE_HZ,
    .decimation_rate = DECIMATION_RATE,
    .mode            = CYHAL_PDM_PCM_MODE_STEREO,
    .word_length     = 16,  /* bits */
    .left_gain       = 0,   /* dB */
    .right_gain      = 0,   /* dB */
};


/*******************************************************************************
* Main loop
*******************************************************************************/

int main(void)
{
    cy_rslt_t result;
    bool read_val;
    uint32_t count = 0;
    uint8_t light;
    int16_t  audio_frame[FRAME_SIZE] = {0};
    CY_ASSERT(result == CY_RSLT_SUCCESS);
    result = cybsp_init();
    result = mtb_st7789v_init8(&tft_pins);
    __enable_irq();
    clock_init();
    result = cyhal_gpio_init(P13_2, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_PULLDOWN,false); /* PIR MOTION SENSOR PIN*/
    cyhal_gpio_init(P13_5,CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, false); /*CAPSENSE CONTROLLED LIGHT PIN*/
    cyhal_gpio_init(P13_4,CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, false);/* PRIMARY LIGHT SOURCE PIN */
    cyhal_gpio_init(P10_7,CYHAL_GPIO_DIR_OUTPUT,CYHAL_GPIO_DRIVE_STRONG, false);/* BUZZER PIN */
    cyhal_gpio_init(CYBSP_USER_LED5, CYHAL_GPIO_DIR_OUTPUT, CYHAL_GPIO_DRIVE_STRONG, false); /*ON BOARD LED INDICATION FOR NOISE DETECTION */
    cyhal_pdm_pcm_init(&pdm_pcm, PDM_DATA, PDM_CLK, &audio_clock, &pdm_pcm_cfg);
    cyhal_pdm_pcm_register_callback(&pdm_pcm, pdm_pcm_isr_handler, NULL);
    cyhal_pdm_pcm_enable_event(&pdm_pcm, CYHAL_PDM_PCM_ASYNC_COMPLETE, CYHAL_ISR_PRIORITY_DEFAULT, true);
    cyhal_pdm_pcm_start(&pdm_pcm);
    GUI_Init();
    initialize_led();
    initialize_capsense_tuner();
    result = initialize_capsense();
    result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);
    result = cyhal_adc_init(&adc, LIGHT_SENSOR_PIN, NULL);
    CY_ASSERT(result == CY_RSLT_SUCCESS);
    result = mtb_light_sensor_init(&light_sensor, &adc, LIGHT_SENSOR_PIN);
    CY_ASSERT(result == CY_RSLT_SUCCESS);

    Cy_CapSense_ScanAllWidgets(&cy_capsense_context);
    GUI_SetColor(GUI_GREEN);
    GUI_SetBkColor(GUI_BLACK);
    GUI_SetFont(GUI_FONT_20B_1);
    GUI_Clear();


    for (;;)
    {
    	read_val = cyhal_gpio_read(P13_2);
    	light = mtb_light_sensor_light_level(&light_sensor);
    	printf("Ambient Light = %d%% \r\n", light);

/*******************************************************************************
* Motion detection
*******************************************************************************/
    	 if(read_val == true)
    	 {

    		 for (count = 0; count < PIR_BUZZER_BEEP_COUNT; count++)
    		 {
    			 GUI_SetColor(GUI_WHITE);
    			 GUI_SetTextAlign(GUI_TA_LEFT);
    			 GUI_DispStringAt("ALERT!!: MOTION DETECTED ", 0, 150);
    			 cyhal_gpio_write(P10_7, true);
    			 cyhal_system_delay_ms(50);
    		     cyhal_gpio_write(P10_7, false);
    		     cyhal_system_delay_ms(50);
    		 }

    	 }

    	 else
    	 {
    		 GUI_SetTextAlign(GUI_TA_LEFT);
    		 GUI_DispStringAt(" ", 0, 150);

    		 GUI_DispCEOL();
    	 }

/*******************************************************************************
* light intensity detection
*******************************************************************************/

    	if(light < 10) // LIGHT INTENSITY THRESHOLD VALUE
    	{

    		GUI_SetColor(GUI_RED);
    		GUI_SetTextAlign(GUI_TA_LEFT);
    		GUI_DispStringAt("LIGHT INTENSITY IS LOW TURNING ", 0, 50);
    		GUI_DispStringAt("ON THE PRIMARY LIGHT SOURCE." , 0, 70);
    		cyhal_gpio_write(P13_4, true);  /*TURN ON THE PRIMARY LIGHT*/
    	}

    	else
    	{
    		GUI_SetColor(GUI_RED);
    		GUI_SetTextAlign(GUI_TA_LEFT);
    		GUI_DispStringAt(" ", 0, 50);
    		GUI_DispCEOL();
    		GUI_DispStringAt(" ", 0, 70);
    		GUI_DispCEOL();
    		cyhal_gpio_write(P13_4, false); /* TURN OFF THE PRIMARY LIGHT*/
    	}
/*******************************************************************************
* capsense
*******************************************************************************/
        if (capsense_scan_complete)
        {
            Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);
            process_touch();
            Cy_CapSense_RunTuner(&cy_capsense_context);
            Cy_CapSense_ScanAllWidgets(&cy_capsense_context);
            capsense_scan_complete = false;
        }

/*******************************************************************************
* PDM NOISE DETECTION
*******************************************************************************/
        if (pdm_pcm_flag)
        {
        	pdm_pcm_flag = 0;
        	volume = 0;
        	for (uint32_t index = 0; index < FRAME_SIZE; index++)
        	{
        		volume += abs(audio_frame[index]);
        	}



        	for (uint32_t index = 0; index < (volume/VOLUME_RATIO); index++)
        	{

        	}

        	if ((volume/VOLUME_RATIO) > noise_threshold)
        	{
        		cyhal_gpio_write(CYBSP_USER_LED5, false); /* WHEN NOISE DETECTED TURN ON THE ONBOARD LED*/
        		GUI_SetColor(GUI_GREEN);
        		GUI_SetTextAlign(GUI_TA_LEFT);
        		GUI_DispStringAt("NOISE DETECTED IN THE ROOM", 0, 100);
        		for (count = 0; count < BUZZER_BEEP_COUNT; count++)
        		        {
        			cyhal_gpio_write(P10_7, true); /* WHEN NOISE DETECTED TURN ON THE BUZZER*/
        				cyhal_system_delay_ms(100);
        				cyhal_gpio_write(P10_7, false);  /* WHEN NOISE DETECTED TURN OFF THE BUZZER*/
        				cyhal_system_delay_ms(100);
        		        }
        	}

        	else
        	{
        	cyhal_gpio_write(CYBSP_USER_LED5, true);  /* WHEN NOISE DETECTED TURN OFF THE ONBOARD LED*/
                GUI_SetTextAlign(GUI_TA_LEFT);
                GUI_DispStringAt("                     ", 0, 100);
                GUI_DispCEOL();
                cyhal_gpio_write(P10_7, false);
        	}

        	cyhal_pdm_pcm_read_async(&pdm_pcm, audio_frame, FRAME_SIZE);
        }

        if (button_flag)
        {
        	button_flag = false;
        	noise_threshold = (volume/VOLUME_RATIO) + THRESHOLD_HYSTERESIS;

        }

    }
    cyhal_system_delay_ms(1000);
}

/*******************************************************************************
* CAPSENSING
*******************************************************************************/
static void process_touch(void)
{
    uint32_t button0_status;
    uint32_t button1_status;
    cy_stc_capsense_touch_t *slider_touch_info;
    uint16_t slider_pos;
    uint8_t slider_touch_status;
    bool led_update_req = false;

    static uint32_t button0_status_prev;
    static uint32_t button1_status_prev;
    static uint16_t slider_pos_prev;
    static led_data_t led_data = {LED_ON, LED_MAX_BRIGHTNESS};

    button0_status = Cy_CapSense_IsSensorActive(
        CY_CAPSENSE_BUTTON0_WDGT_ID,
        CY_CAPSENSE_BUTTON0_SNS0_ID,
        &cy_capsense_context);

    button1_status = Cy_CapSense_IsSensorActive(
        CY_CAPSENSE_BUTTON1_WDGT_ID,
        CY_CAPSENSE_BUTTON1_SNS0_ID,
        &cy_capsense_context);

    slider_touch_info = Cy_CapSense_GetTouchInfo(
    CY_CAPSENSE_LINEARSLIDER0_WDGT_ID, &cy_capsense_context);
    slider_touch_status = slider_touch_info->numPosition;
    slider_pos = slider_touch_info->ptrPosition->x;


    if ((0u != button0_status) &&
        (0u == button0_status_prev))
    {
    	GUI_Clear();
        led_data.state = LED_ON;
        cyhal_gpio_write(P13_5, true); /*CAPSENSE CONTROLLED LIGHT ON*/
        led_update_req = true;
        GUI_SetColor(GUI_GREEN);
        GUI_SetTextAlign(GUI_TA_LEFT);
        GUI_DispStringAt("USER TURNED ON THE LIGHT", 1, 1);
    }

    if ((0u != button1_status) &&
        (0u == button1_status_prev))
    {
    	GUI_Clear();
        led_data.state = LED_OFF;
        cyhal_gpio_write(P13_5, false); /*CAPSENSE CONTROLLED LIGHT OFF */
        led_update_req = true;
        GUI_SetColor(GUI_BLUE);
        GUI_SetTextAlign(GUI_TA_LEFT);
        GUI_DispStringAt("USER TURNED OFF THE LIGHT", 0, 0);
    }


    if ((0 != slider_touch_status) &&
        (slider_pos != slider_pos_prev))
    {
        led_data.brightness = (slider_pos * 100)
                / cy_capsense_context.ptrWdConfig[CY_CAPSENSE_LINEARSLIDER0_WDGT_ID].xResolution;
        led_update_req = true;
    }


    if (led_update_req)
    {
        update_led_state(&led_data);
    }

    /* Update previous touch status */
    button0_status_prev = button0_status;
    button1_status_prev = button1_status;
    slider_pos_prev = slider_pos;
}


static uint32_t initialize_capsense(void)
{
    uint32_t status = CYRET_SUCCESS;
    const cy_stc_sysint_t CapSense_interrupt_config =
        {
            .intrSrc = CYBSP_CSD_IRQ,
            .intrPriority = CAPSENSE_INTR_PRIORITY,
        };

    status = Cy_CapSense_Init(&cy_capsense_context);
    if (CYRET_SUCCESS != status)
    {
        return status;
    }

    Cy_SysInt_Init(&CapSense_interrupt_config, capsense_isr);
    NVIC_ClearPendingIRQ(CapSense_interrupt_config.intrSrc);
    NVIC_EnableIRQ(CapSense_interrupt_config.intrSrc);
    status = Cy_CapSense_Enable(&cy_capsense_context);

    if (CYRET_SUCCESS != status)
    {
        return status;
    }


    status = Cy_CapSense_RegisterCallback(CY_CAPSENSE_END_OF_SCAN_E, capsense_callback, &cy_capsense_context);
    if (CYRET_SUCCESS != status)
    {
        return status;
    }

    return status;
}

static void capsense_isr(void)
{
    Cy_CapSense_InterruptHandler(CYBSP_CSD_HW, &cy_capsense_context);
}


void capsense_callback(cy_stc_active_scan_sns_t * ptrActiveScan)
{
    capsense_scan_complete = true;
}

static void initialize_capsense_tuner(void)
{
    cy_rslt_t result;
    sEzI2C_sub_cfg.buf = (uint8 *)&cy_capsense_tuner;
    sEzI2C_sub_cfg.buf_rw_boundary = sizeof(cy_capsense_tuner);
    sEzI2C_sub_cfg.buf_size = sizeof(cy_capsense_tuner);
    sEzI2C_sub_cfg.slave_address = 8U;

    sEzI2C_cfg.data_rate = CYHAL_EZI2C_DATA_RATE_400KHZ;
    sEzI2C_cfg.enable_wake_from_sleep = false;
    sEzI2C_cfg.slave1_cfg = sEzI2C_sub_cfg;
    sEzI2C_cfg.sub_address_size = CYHAL_EZI2C_SUB_ADDR16_BITS;
    sEzI2C_cfg.two_addresses = false;

    result = cyhal_ezi2c_init(&sEzI2C, CYBSP_I2C_SDA, CYBSP_I2C_SCL, NULL, &sEzI2C_cfg);
    if (result != CY_RSLT_SUCCESS)
    {
        handle_error();
    }

}


/*******************************************************************************
* PDM DATA PROCESSING
*******************************************************************************/
void button_isr_handler(void *arg, cyhal_gpio_event_t event)
{
    (void) arg;
    (void) event;

    button_flag = true;
}

void pdm_pcm_isr_handler(void *arg, cyhal_pdm_pcm_event_t event)
{
    (void) arg;
    (void) event;

    pdm_pcm_flag = true;
}

void clock_init(void)
{
    /* Initialize the PLL */
    cyhal_clock_get(&pll_clock, &CYHAL_CLOCK_PLL[0]);
    cyhal_clock_init(&pll_clock);
    cyhal_clock_set_frequency(&pll_clock, AUDIO_SYS_CLOCK_HZ, NULL);
    cyhal_clock_set_enabled(&pll_clock, true, true);

    cyhal_clock_get(&audio_clock, &CYHAL_CLOCK_HF[1]);
    cyhal_clock_init(&audio_clock);

    cyhal_clock_set_source(&audio_clock, &pll_clock);
    cyhal_clock_set_enabled(&audio_clock, true, true);
}

Credits

vinay y.n
27 projects • 51 followers
An electronic product engineer with 8 years of experience in the field. The passion for electronics began as a hobby 11 years ago.

Comments