added report-reason, removed non-router configurations, sensor checks

This commit is contained in:
formtapez
2019-05-10 22:08:19 +02:00
parent c419b35a08
commit e36e220a4c
14 changed files with 828 additions and 11269 deletions

View File

@@ -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

View File

@@ -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>

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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 );
} }

View File

@@ -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 );