Hardware components | ||||||
| × | 1 |
A front door presents an interesting place to setup a monitoring system. It is subject to a variety of weather and other external elements as well as people using it as a portal to come and go into a house. The intention was to use external sensors for temperature and humidity for the weather monitoring, a light sensor to help determine time of day as well as a PIR sensor to see if someone is at the door.
Due to time and priority constraints, I was not able to use sensors external to the Cypress PSoC Analog Coprocessor Pioneer Kit. Therefore, I used the built-in sensors on the development board to provide a "Proof-of-Concept" for the main idea.
Humitdity Code
C/C++Only a start from Cypress example code. Mother passed away this weekend and therefore not able to get rest of code working in time. My apologies to Hackster and others.
/******************************************************************************
* Project Name : CE211322_Humidity_Sensing
* Version : 1.0
* Device Used : CY8C4A45LQI-L483
* Software Used : PSoC Creator 3.3 CP3
* Compiler Used : ARM GCC 4.9.3
* Related Hardware : CY8CKIT-048 PSoC Analog Coprocessor Pioneer Kit
*******************************************************************************
* Copyright (2016), Cypress Semiconductor Corporation.
*******************************************************************************
* This software, including source code, documentation and related materials
* ("Software") is owned by Cypress Semiconductor Corporation (Cypress) and is
* protected by and subject to worldwide patent protection (United States and
* foreign), United States copyright laws and international treaty provisions.
* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable
* license to copy, use, modify, create derivative works of, and compile the
* Cypress source code and derivative works for the sole purpose of creating
* custom software in support of licensee product, such licensee product to be
* used only in conjunction with Cypress's integrated circuit as specified in the
* applicable agreement. Any reproduction, modification, translation, compilation,
* or representation of this Software except as specified above is prohibited
* without the express written permission of Cypress.
*
* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* Cypress reserves the right to make changes to the Software without notice.
* Cypress does not assume any liability arising out of the application or use
* of Software or any product or circuit described in the Software. Cypress does
* not authorize its products for use as critical components in any products
* where a malfunction or failure may reasonably be expected to result in
* significant injury or death ("ACTIVE Risk Product"). By including Cypress's
* product in a ACTIVE Risk Product, the manufacturer of such system or application
* assumes all risk of such use and in doing so indemnifies Cypress against all
* liability. Use of this Software may be limited by and subject to the applicable
* Cypress software license agreement.
*******************************************************************************/
/*******************************************************************************
* Theory of Operation: This code example demonstrates how to implement an analog
* front end (AFE) for a humidity sensor using the PSoC Analog Coprocessor.
* Output capacitance of the humidity sensor is measured and humidity value is
* calculated. These are sent over I2C and monitored using the Bridge Control Panel
* program. Also, the intensity of RGB LED is varied with respect to calculated
* humidity value.
*******************************************************************************/
/* Header File Includes */
#include <project.h>
/* Constants used to calculate humidity */
/* This is the capacitance of the sensor at 55% RH with 0.1pF resolution */
#define CAPACITANCE_AT_55_RH (1800)
/* Sensitivity numerator and denominator indicate sensitivity of the sensor */
#define SENSITIVITY_NUMERATOR (31)
#define SENSITIVITY_DENOMINATOR (100)
/* Value of reference capacitor */
#define CREF (1800)
/* Offset Capacitance */
#define COFFSET (150)
/* This is raw count equivalent to trace capacitance */
#define OFFSETCOUNT (1536)
#define BUFFERSIZE (8)
#define READ_WRITE_BOUNDARY (0)
/* Nominal humidity 55% */
#define NOMINAL_HUMIDITY (550)
#define HUMIDITY_0_PERCENT (0)
#define HUMIDITY_100_PERCENT (1000)
#define HUMIDITY_50 (500)
/* Structure that holds all the sensor values */
/* Use __attribute__((packed)) for GCC and MDK compilers to pack structures */
/* For other compilers use the corresponding directive. */
/* For example, for IAR use the following directive */
/* typedef __packed struct {..}struct_name; */
typedef struct __attribute__((packed))
{
uint16 humidityRawCounts; /* Raw count from CapSense Component for the humidity sensor */
uint16 capacitance; /* Capacitance of the humidity sensor */
uint16 humidity; /* Measured humidity */
uint16 rawCountsRefCap; /* Raw count from CapSense Component for the Reference capacitor */
}humidity_sensor_data;
/* Function Prototypes */
void InitResources(void);
__inline uint16 CalculateCapacitance(uint16 rawCounts, uint16 refSensorCounts);
__inline uint16 CalculateHumidity(uint16 capacitance);
/* Declare the i2cBuffer to exchange sensor data between Bridge Control
Panel (BCP) and PSoC Analog Coprocessor */
humidity_sensor_data i2cBuffer = {0, 0, 0, 0};
/*******************************************************************************
* Function Name: main
********************************************************************************
*
* Summary:
* This function initializes all the resources, and in an infinite loop, performs tasks
* to measure the Humidity and to send the data over I2C.
*
* Parameters:
* None
*
* Return:
* int
*
* Side Effects:
* None
*******************************************************************************/
int main()
{
/* Variable to store the status returned by CyEnterCriticalSection() */
uint8 interruptState = 0;
/* Variable to hold calculated PWM duty cycle */
uint16 pwmDutyCycle;
/* Enable global interrupts */
CyGlobalIntEnable;
/* Initialize hardware resources */
InitResources();
/*
uint32 ch;
// Start SCB (UART mode) operation
UART_Start();
UART_UartPutString("\r\n***********************************************************************************\r\n");
UART_UartPutString("This is SCB_UartComm datasheet example project\r\n");
UART_UartPutString("If you are able to read this text the terminal connection is configured correctly.\r\n");
UART_UartPutString("Start transmitting the characters to see an echo in the terminal.\r\n");
UART_UartPutString("\r\n");
*/
/* Infinite Loop */
for(;;)
{
/* Check if CapSense scan is complete */
if(!(CSD_IsBusy()))
{
/* Enter critical section to check if I2C bus is busy or not */
interruptState = CyEnterCriticalSection();
if(!(EzI2C_EzI2CGetActivity() & EzI2C_EZI2C_STATUS_BUSY))
{
i2cBuffer.humidityRawCounts = CSD_BUTTON0_SNS0_RAW0_VALUE;
i2cBuffer.rawCountsRefCap = CSD_BUTTON0_SNS1_RAW0_VALUE;
/* Convert raw counts to capacitance */
i2cBuffer.capacitance = CalculateCapacitance(i2cBuffer.humidityRawCounts, i2cBuffer.rawCountsRefCap);
/* Calculate humidity */
i2cBuffer.humidity = CalculateHumidity(i2cBuffer.capacitance);
}
CyExitCriticalSection(interruptState);
/* Scan sensors */
CSD_ScanAllWidgets();
}
/*Drive RGB LED proportional to humidity value when the calculated humidity is greater than 50% */
if(i2cBuffer.humidity < HUMIDITY_50)
{
pwmDutyCycle = PWM_PWM_PERIOD_VALUE;
}
else
{
pwmDutyCycle = PWM_PWM_PERIOD_VALUE - (i2cBuffer.humidity - HUMIDITY_50) *2;
}
/* Update the PWM duty cycle */
PWM_WriteCompare(pwmDutyCycle);
}
}
/*******************************************************************************
* Function Name: void InitResources(void)
********************************************************************************
*
* Summary:
* This function initializes all the hardware resources
*
* Parameters:
* None
*
* Return:
* None
*
* Side Effects:
* None
*******************************************************************************/
void InitResources(void)
{
/* Start EZI2C Slave Component and initialize buffer */
EzI2C_Start();
EzI2C_EzI2CSetBuffer1(sizeof(i2cBuffer), READ_WRITE_BOUNDARY, (uint8*)&i2cBuffer);
/* Start CapSense Component */
CSD_Start();
/* Start PWM */
PWM_Start();
}
/*******************************************************************************
* Function Name: __inline uint16 CalculateCapacitance(uint16 RawCounts, uint16 RefsensorCounts)
********************************************************************************
*
* Summary:
* This function calculates capacitance from raw count.
*
* Parameters:
* uint16 RawCounts - Raw count corresponding to Humidity sensor
* uint16 RefsensorCounts - Raw count corresponding to Reference capacitor
*
* Return:
* Capacitance of the Humidity sensor
*
* Side Effects:
* None
*******************************************************************************/
__inline uint16 CalculateCapacitance(uint16 rawCounts, uint16 refsensorCounts)
{
return (uint16)((float)(rawCounts - OFFSETCOUNT) * (CREF) / (float)(refsensorCounts - OFFSETCOUNT));
}
/*******************************************************************************
* Function Name: __inline uint16 CalculateHumidity(uint16 Capacitance)
********************************************************************************
*
* Summary:
* This function calculates humidity from capacitance
* Parameters:
* uint16 Capacitance - Capacitance of the humidity sensor
*
* Return:
* Calculated Humidity value
*
* Side Effects:
* None
*******************************************************************************/
__inline uint16 CalculateHumidity(uint16 capacitance)
{
int16 humidity;
int16 delta;
/* Find capacitance difference from nominal capacitance at 55% RH */
delta = capacitance - CAPACITANCE_AT_55_RH;
/* Calculate humidity from capacitance difference and sensor sensitivity */
humidity = ((delta * SENSITIVITY_DENOMINATOR) / SENSITIVITY_NUMERATOR) + NOMINAL_HUMIDITY;
/* If humidity is less than zero, limit it to 0; If humidity is greater than 1000 (100%), limit to 1000 */
humidity = (humidity < HUMIDITY_0_PERCENT) ? HUMIDITY_0_PERCENT : (humidity > HUMIDITY_100_PERCENT) ? HUMIDITY_100_PERCENT : humidity;
/* Return Humidity value */
return humidity;
}
/* [] END OF FILE */
Comments