mirror of
https://github.com/formtapez/ZigUP.git
synced 2025-02-23 09:34:50 +01:00
added report-reason, removed non-router configurations, sensor checks
This commit is contained in:
@@ -34,10 +34,9 @@ CC2530 based multi-purpose ZigBee Relais, Switch, Sensor and Router
|
|||||||
2. Get **IAR Embedded Workbench for 8051** from https://www.iar.com/iar-embedded-workbench (you can use the free trial version for one month)
|
2. Get **IAR Embedded Workbench for 8051** from https://www.iar.com/iar-embedded-workbench (you can use the free trial version for one month)
|
||||||
3. Clone ZigUP source to **\Projects\zstack\HomeAutomation\ZigUP\\**
|
3. Clone ZigUP source to **\Projects\zstack\HomeAutomation\ZigUP\\**
|
||||||
4. Start **\ZigUP\CC2530DB\ZigUP.eww** to load project in IAR
|
4. Start **\ZigUP\CC2530DB\ZigUP.eww** to load project in IAR
|
||||||
5. Set project configuration to "Router".
|
5. Edit **\Projects\zstack\Tools\CC2530DB\f8wConfig.cfg** to use all 2.4 GHz channels:
|
||||||
6. Edit **\Projects\zstack\Tools\CC2530DB\f8wConfig.cfg** to use all 2.4 GHz channels:
|
|
||||||
>-DDEFAULT_CHANLIST=0x07FFF800
|
>-DDEFAULT_CHANLIST=0x07FFF800
|
||||||
7. Compile
|
6. Compile
|
||||||
|
|
||||||
# Flashing with CC Debugger
|
# Flashing with CC Debugger
|
||||||
1. Get **SmartRF Flash Programmer v1.12.8 (not v2.x!)** from https://www.ti.com/tool/flash-programmer
|
1. Get **SmartRF Flash Programmer v1.12.8 (not v2.x!)** from https://www.ti.com/tool/flash-programmer
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -7,24 +7,10 @@
|
|||||||
<batchBuild>
|
<batchBuild>
|
||||||
<batchDefinition>
|
<batchDefinition>
|
||||||
<name>ALL</name>
|
<name>ALL</name>
|
||||||
<member>
|
|
||||||
<project>ZigUP</project>
|
|
||||||
<configuration>CoordinatorEB</configuration>
|
|
||||||
</member>
|
|
||||||
<member>
|
<member>
|
||||||
<project>ZigUP</project>
|
<project>ZigUP</project>
|
||||||
<configuration>RouterEB</configuration>
|
<configuration>RouterEB</configuration>
|
||||||
</member>
|
</member>
|
||||||
<member>
|
|
||||||
<project>ZigUP</project>
|
|
||||||
<configuration>EndDeviceEB</configuration>
|
|
||||||
</member>
|
|
||||||
<member>
|
|
||||||
<project>ZigUP</project>
|
|
||||||
<configuration>RouterZLight</configuration>
|
|
||||||
</member>
|
|
||||||
</batchDefinition>
|
</batchDefinition>
|
||||||
</batchBuild>
|
</batchBuild>
|
||||||
</workspace>
|
</workspace>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -84,14 +84,19 @@ uint8 ds18b20_get_temp(void)
|
|||||||
temp1=ds18b20_read_byte();
|
temp1=ds18b20_read_byte();
|
||||||
temp2=ds18b20_read_byte();
|
temp2=ds18b20_read_byte();
|
||||||
ds18b20_RST_PULSE();
|
ds18b20_RST_PULSE();
|
||||||
EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0;
|
|
||||||
|
if (temp1 == 0xff && temp2 == 0xff)
|
||||||
|
{
|
||||||
|
UART_String("DS18B20: No sensor found.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// neg. temp
|
// neg. temp
|
||||||
if (temp2 & b00001000) EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0 - 128.0;
|
if (temp2 & b00001000) EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0 - 128.0;
|
||||||
// pos. temp
|
// pos. temp
|
||||||
else EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0;
|
else EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0;
|
||||||
|
|
||||||
sprintf(buffer, "DS18B20: %.2f <20>C\n", EXT_Temperature);
|
sprintf(buffer, "DS18B20: %.2f <20>C (0x%02X 0x%02X)\n", EXT_Temperature, temp1, temp2);
|
||||||
UART_String(buffer);
|
UART_String(buffer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
#include "ZComDef.h"
|
#include "ZComDef.h"
|
||||||
|
|
||||||
float EXT_Temperature = -1000;
|
uint32 float_NaN = 0x7F800001;
|
||||||
float EXT_Humidity = -1000;
|
|
||||||
float ADC_Voltage = -1000;
|
float EXT_Temperature;
|
||||||
float CPU_Temperature = -1000;
|
float EXT_Humidity;
|
||||||
|
float ADC_Voltage;
|
||||||
|
float CPU_Temperature;
|
||||||
uint16 DIG_IN = 0;
|
uint16 DIG_IN = 0;
|
||||||
|
|
||||||
byte zclZigUP_TaskID;
|
byte zclZigUP_TaskID;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "ZComDef.h"
|
#include "ZComDef.h"
|
||||||
|
|
||||||
|
extern uint32 float_NaN;
|
||||||
|
|
||||||
extern float EXT_Temperature;
|
extern float EXT_Temperature;
|
||||||
extern float EXT_Humidity;
|
extern float EXT_Humidity;
|
||||||
extern float ADC_Voltage;
|
extern float ADC_Voltage;
|
||||||
@@ -14,3 +16,7 @@ extern volatile uint8 STATE_LIGHT;
|
|||||||
extern volatile uint8 STATE_LED;
|
extern volatile uint8 STATE_LED;
|
||||||
|
|
||||||
extern uint8 TEMP_SENSOR;
|
extern uint8 TEMP_SENSOR;
|
||||||
|
|
||||||
|
#define REPORT_REASON_TIMER 0
|
||||||
|
#define REPORT_REASON_KEY 1
|
||||||
|
#define REPORT_REASON_DIGIN 2
|
||||||
|
|||||||
@@ -21,41 +21,8 @@ __interrupt void IRQ_S0(void)
|
|||||||
_delay_ms(5);
|
_delay_ms(5);
|
||||||
if (!P0_6) // still pressed?
|
if (!P0_6) // still pressed?
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
WS2812_SendLED(255, 0, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(127, 0, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(63, 0, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
|
|
||||||
WS2812_SendLED(0, 255, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(0, 127, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(0, 63, 0);
|
|
||||||
_delay_ms(500);
|
|
||||||
|
|
||||||
WS2812_SendLED(0, 0, 255);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(0, 0, 127);
|
|
||||||
_delay_ms(500);
|
|
||||||
WS2812_SendLED(0, 0, 63);
|
|
||||||
_delay_ms(500);
|
|
||||||
*/
|
|
||||||
S0++;
|
S0++;
|
||||||
UART_String("[INT] S0!");
|
UART_String("[INT] S0!");
|
||||||
char buffer[100];
|
|
||||||
sprintf(buffer, "S0-Counts: %lu", S0);
|
|
||||||
UART_String(buffer);
|
|
||||||
|
|
||||||
|
|
||||||
// FactoryReset();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LED(!STATE_LED);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear interrupt flags
|
// Clear interrupt flags
|
||||||
@@ -73,26 +40,23 @@ __interrupt void IRQ_KEY(void)
|
|||||||
_delay_ms(20);
|
_delay_ms(20);
|
||||||
if (!P1_3) // still pressed?
|
if (!P1_3) // still pressed?
|
||||||
{
|
{
|
||||||
uint8 counter = 0;
|
|
||||||
while (!P1_3 && counter++ < 100)
|
|
||||||
{
|
|
||||||
_delay_ms(10);
|
|
||||||
counter++;
|
|
||||||
}
|
|
||||||
if (counter > 50) UART_String("lang");
|
|
||||||
else UART_String("kurz");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WS2812_SendLED(22, 55, 11);
|
|
||||||
Relais(!STATE_LIGHT);
|
Relais(!STATE_LIGHT);
|
||||||
UART_String("[INT] KEY!");
|
UART_String("[INT] KEY!");
|
||||||
char buffer[100];
|
|
||||||
sprintf(buffer, "Light-Status: %u", STATE_LIGHT);
|
|
||||||
UART_String(buffer);
|
|
||||||
|
|
||||||
Measure();
|
// detection for longer keypress
|
||||||
zclZigUP_Reporting();
|
uint8 counter = 0;
|
||||||
|
while (!P1_3 && counter < 100)
|
||||||
|
{
|
||||||
|
_delay_ms(50);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
if (counter >= 100) FactoryReset();
|
||||||
|
|
||||||
|
// update measurements (only the quick stuff, to stay responsive)
|
||||||
|
Measure_QuickStuff();
|
||||||
|
|
||||||
|
// report states
|
||||||
|
zclZigUP_Reporting(REPORT_REASON_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear interrupt flags
|
// Clear interrupt flags
|
||||||
@@ -110,8 +74,23 @@ __interrupt void IRQ_DIGIN(void)
|
|||||||
_delay_ms(20);
|
_delay_ms(20);
|
||||||
if (!P2_0) // still pressed?
|
if (!P2_0) // still pressed?
|
||||||
{
|
{
|
||||||
UART_String("[INT] Dig-In!");
|
|
||||||
DIG_IN = P2_0;
|
DIG_IN = P2_0;
|
||||||
|
UART_String("[INT] Dig-In!");
|
||||||
|
|
||||||
|
// detection for longer keypress
|
||||||
|
uint8 counter = 0;
|
||||||
|
while (!P1_3 && counter < 100)
|
||||||
|
{
|
||||||
|
_delay_ms(50);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
if (counter >= 100) FactoryReset();
|
||||||
|
|
||||||
|
// update measurements (only the quick stuff, to stay responsive)
|
||||||
|
Measure_QuickStuff();
|
||||||
|
|
||||||
|
// report states
|
||||||
|
zclZigUP_Reporting(REPORT_REASON_DIGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear interrupt flags
|
// Clear interrupt flags
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ void UART_Init(void)
|
|||||||
|
|
||||||
void UART_Transmit(char data)
|
void UART_Transmit(char data)
|
||||||
{
|
{
|
||||||
|
|
||||||
U0DBUF = data;
|
U0DBUF = data;
|
||||||
while (U0CSR & (1<<0)); // wait until byte has been sent
|
while (U0CSR & (1<<0)); // wait until byte has been sent
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "ds18b20.h"
|
||||||
|
#include "adc.h"
|
||||||
|
#include "dht22.h"
|
||||||
|
|
||||||
void FactoryReset(void)
|
void FactoryReset(void)
|
||||||
{
|
{
|
||||||
@@ -23,16 +26,30 @@ void Relais(uint8 state)
|
|||||||
{
|
{
|
||||||
P1_1 = 1; // activate ON-solenoid
|
P1_1 = 1; // activate ON-solenoid
|
||||||
P1_2 = 0; // deactivate OFF-solenoid
|
P1_2 = 0; // deactivate OFF-solenoid
|
||||||
_delay_ms(250);
|
_delay_ms(50);
|
||||||
P1_1 = 0; // deactivate ON-solenoid
|
P1_1 = 0; // deactivate ON-solenoid
|
||||||
}
|
}
|
||||||
else // Switch light off
|
else // Switch light off
|
||||||
{
|
{
|
||||||
P1_1 = 0; // deactivate ON-solenoid
|
P1_1 = 0; // deactivate ON-solenoid
|
||||||
P1_2 = 1; // activate OFF-solenoid
|
P1_2 = 1; // activate OFF-solenoid
|
||||||
_delay_ms(250);
|
_delay_ms(50);
|
||||||
P1_2 = 0; // deactivate OFF-solenoid
|
P1_2 = 0; // deactivate OFF-solenoid
|
||||||
}
|
}
|
||||||
|
|
||||||
STATE_LIGHT = state;
|
STATE_LIGHT = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Measure_QuickStuff(void)
|
||||||
|
{
|
||||||
|
DIG_IN = P2_0;
|
||||||
|
ADC_Voltage = ADC_GetVoltage();
|
||||||
|
CPU_Temperature = ADC_GetTemperature();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measure_Sensor(void)
|
||||||
|
{
|
||||||
|
// make new measurement depending of autodetected sensor type
|
||||||
|
if (TEMP_SENSOR == 1) DHT22_Measure();
|
||||||
|
else if (TEMP_SENSOR == 2) ds18b20_get_temp();
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
void FactoryReset(void);
|
void FactoryReset(void);
|
||||||
void Relais(uint8 state);
|
void Relais(uint8 state);
|
||||||
|
void Measure_QuickStuff(void);
|
||||||
|
void Measure_Sensor(void);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
#include "dht22.h"
|
#include "dht22.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#define ZIGUP_REPORTING_INTERVAL 5000
|
#define ZIGUP_REPORTING_INTERVAL 30000
|
||||||
|
|
||||||
afAddrType_t zclZigUP_DstAddr;
|
afAddrType_t zclZigUP_DstAddr;
|
||||||
|
|
||||||
@@ -40,23 +40,9 @@ static endPointDesc_t ZigUP_TestEp =
|
|||||||
|
|
||||||
devStates_t zclZigUP_NwkState = DEV_INIT;
|
devStates_t zclZigUP_NwkState = DEV_INIT;
|
||||||
|
|
||||||
void Measure(void)
|
void zclZigUP_Reporting(uint16 REPORT_REASON)
|
||||||
{
|
{
|
||||||
ADC_Voltage = ADC_GetVoltage();
|
const uint8 NUM_ATTRIBUTES = 8;
|
||||||
CPU_Temperature = ADC_GetTemperature();
|
|
||||||
|
|
||||||
// invalidate old measurements
|
|
||||||
EXT_Temperature = -1000;
|
|
||||||
EXT_Humidity = -1000;
|
|
||||||
|
|
||||||
// make new measurement depending of autodetected sensor type
|
|
||||||
if (TEMP_SENSOR == 1) DHT22_Measure();
|
|
||||||
else if (TEMP_SENSOR == 2) ds18b20_get_temp();
|
|
||||||
}
|
|
||||||
|
|
||||||
void zclZigUP_Reporting(void)
|
|
||||||
{
|
|
||||||
#define NUM_ATTRIBUTES 7
|
|
||||||
|
|
||||||
// send report
|
// send report
|
||||||
zclReportCmd_t *pReportCmd;
|
zclReportCmd_t *pReportCmd;
|
||||||
@@ -93,7 +79,11 @@ void zclZigUP_Reporting(void)
|
|||||||
pReportCmd->attrList[6].attrID = ATTRID_DIG_INPUT;
|
pReportCmd->attrList[6].attrID = ATTRID_DIG_INPUT;
|
||||||
pReportCmd->attrList[6].dataType = ZCL_DATATYPE_UINT16; // boolean or uint8 causes every second report to hang...
|
pReportCmd->attrList[6].dataType = ZCL_DATATYPE_UINT16; // boolean or uint8 causes every second report to hang...
|
||||||
pReportCmd->attrList[6].attrData = (void *)(&DIG_IN);
|
pReportCmd->attrList[6].attrData = (void *)(&DIG_IN);
|
||||||
|
|
||||||
|
pReportCmd->attrList[7].attrID = ATTRID_REPORT_REASON;
|
||||||
|
pReportCmd->attrList[7].dataType = ZCL_DATATYPE_UINT16;
|
||||||
|
pReportCmd->attrList[7].attrData = (void *)(&REPORT_REASON);
|
||||||
|
|
||||||
zclZigUP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
|
zclZigUP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
|
||||||
zclZigUP_DstAddr.addr.shortAddr = 0;
|
zclZigUP_DstAddr.addr.shortAddr = 0;
|
||||||
zclZigUP_DstAddr.endPoint=1;
|
zclZigUP_DstAddr.endPoint=1;
|
||||||
@@ -105,8 +95,6 @@ void zclZigUP_Reporting(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* ZCL General Profile Callback table
|
* ZCL General Profile Callback table
|
||||||
*/
|
*/
|
||||||
@@ -305,12 +293,21 @@ void zclZigUP_Init( byte task_id )
|
|||||||
U1GCR = b00010000; // UART1 Baud_E
|
U1GCR = b00010000; // UART1 Baud_E
|
||||||
U1BAUD = b01000000; // UART1 Baud_M
|
U1BAUD = b01000000; // UART1 Baud_M
|
||||||
|
|
||||||
|
UART_Init();
|
||||||
|
|
||||||
_delay_ms(GetRandomNumber()); // Random delay
|
_delay_ms(GetRandomNumber()); // Random delay
|
||||||
|
|
||||||
|
// Turn all lights off
|
||||||
Relais(0);
|
Relais(0);
|
||||||
// WS2812_SendLED(0, 0, 0);
|
WS2812_SendLED(0, 0, 0);
|
||||||
UART_Init();
|
LED(0);
|
||||||
|
|
||||||
|
// invalidate float values by "assigning" NaN
|
||||||
|
// they will be filled later if sensors are present
|
||||||
|
EXT_Temperature = *(float*)&float_NaN;
|
||||||
|
EXT_Humidity = *(float*)&float_NaN;
|
||||||
|
ADC_Voltage = *(float*)&float_NaN;
|
||||||
|
CPU_Temperature = *(float*)&float_NaN;
|
||||||
|
|
||||||
// autodetecting sensor type
|
// autodetecting sensor type
|
||||||
if (DHT22_Measure())
|
if (DHT22_Measure())
|
||||||
@@ -325,8 +322,8 @@ void zclZigUP_Init( byte task_id )
|
|||||||
}
|
}
|
||||||
else UART_String("No sensor detected.");
|
else UART_String("No sensor detected.");
|
||||||
|
|
||||||
|
// start measurement task for reporting of values
|
||||||
// osal_start_reload_timer( zclZigUP_TaskID, ZIGUP_REPORTING_EVT, ZIGUP_REPORTING_INTERVAL );
|
osal_start_reload_timer( zclZigUP_TaskID, ZIGUP_REPORTING_EVT, ZIGUP_REPORTING_INTERVAL );
|
||||||
|
|
||||||
UART_String("Init done.");
|
UART_String("Init done.");
|
||||||
}
|
}
|
||||||
@@ -390,10 +387,11 @@ uint16 zclZigUP_event_loop( uint8 task_id, uint16 events )
|
|||||||
if ( events & ZIGUP_REPORTING_EVT )
|
if ( events & ZIGUP_REPORTING_EVT )
|
||||||
{
|
{
|
||||||
// update measurements
|
// update measurements
|
||||||
Measure();
|
Measure_QuickStuff();
|
||||||
|
Measure_Sensor();
|
||||||
|
|
||||||
// report states
|
// report states
|
||||||
zclZigUP_Reporting();
|
zclZigUP_Reporting(REPORT_REASON_TIMER);
|
||||||
|
|
||||||
return ( events ^ ZIGUP_REPORTING_EVT );
|
return ( events ^ ZIGUP_REPORTING_EVT );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ extern "C"
|
|||||||
#define ATTRID_S0_COUNTS 41364
|
#define ATTRID_S0_COUNTS 41364
|
||||||
#define ATTRID_ADC_VOLT 41365
|
#define ATTRID_ADC_VOLT 41365
|
||||||
#define ATTRID_DIG_INPUT 41366
|
#define ATTRID_DIG_INPUT 41366
|
||||||
|
#define ATTRID_REPORT_REASON 41367
|
||||||
|
|
||||||
extern SimpleDescriptionFormat_t zclZigUP_SimpleDesc[];
|
extern SimpleDescriptionFormat_t zclZigUP_SimpleDesc[];
|
||||||
|
|
||||||
@@ -49,9 +50,7 @@ void FactoryReset(void);
|
|||||||
|
|
||||||
void Relais(uint8 state);
|
void Relais(uint8 state);
|
||||||
void LED(uint8 state);
|
void LED(uint8 state);
|
||||||
void zclZigUP_Reporting(void);
|
void zclZigUP_Reporting(uint16 REPORT_REASON);
|
||||||
void Measure(void);
|
|
||||||
|
|
||||||
|
|
||||||
static void zclZigUP_BasicResetCB( void );
|
static void zclZigUP_BasicResetCB( void );
|
||||||
static void zclZigUP_IdentifyCB( zclIdentify_t *pCmd );
|
static void zclZigUP_IdentifyCB( zclIdentify_t *pCmd );
|
||||||
|
|||||||
Reference in New Issue
Block a user