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)
3. Clone ZigUP source to **\Projects\zstack\HomeAutomation\ZigUP\\**
4. Start **\ZigUP\CC2530DB\ZigUP.eww** to load project in IAR
5. Set project configuration to "Router".
6. Edit **\Projects\zstack\Tools\CC2530DB\f8wConfig.cfg** to use all 2.4 GHz channels:
5. Edit **\Projects\zstack\Tools\CC2530DB\f8wConfig.cfg** to use all 2.4 GHz channels:
>-DDEFAULT_CHANLIST=0x07FFF800
7. Compile
6. Compile
# Flashing with CC Debugger
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>
<batchDefinition>
<name>ALL</name>
<member>
<project>ZigUP</project>
<configuration>CoordinatorEB</configuration>
</member>
<member>
<project>ZigUP</project>
<configuration>RouterEB</configuration>
</member>
<member>
<project>ZigUP</project>
<configuration>EndDeviceEB</configuration>
</member>
<member>
<project>ZigUP</project>
<configuration>RouterZLight</configuration>
</member>
</batchDefinition>
</batchBuild>
</workspace>

View File

@@ -84,14 +84,19 @@ uint8 ds18b20_get_temp(void)
temp1=ds18b20_read_byte();
temp2=ds18b20_read_byte();
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
if (temp2 & b00001000) EXT_Temperature = ((uint16)temp1 | (uint16)(temp2 & b00000111) << 8) / 16.0 - 128.0;
// pos. temp
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);
return 1;
}

View File

@@ -1,9 +1,11 @@
#include "ZComDef.h"
float EXT_Temperature = -1000;
float EXT_Humidity = -1000;
float ADC_Voltage = -1000;
float CPU_Temperature = -1000;
uint32 float_NaN = 0x7F800001;
float EXT_Temperature;
float EXT_Humidity;
float ADC_Voltage;
float CPU_Temperature;
uint16 DIG_IN = 0;
byte zclZigUP_TaskID;

View File

@@ -1,5 +1,7 @@
#include "ZComDef.h"
extern uint32 float_NaN;
extern float EXT_Temperature;
extern float EXT_Humidity;
extern float ADC_Voltage;
@@ -14,3 +16,7 @@ extern volatile uint8 STATE_LIGHT;
extern volatile uint8 STATE_LED;
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);
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++;
UART_String("[INT] S0!");
char buffer[100];
sprintf(buffer, "S0-Counts: %lu", S0);
UART_String(buffer);
// FactoryReset();
LED(!STATE_LED);
}
// Clear interrupt flags
@@ -73,26 +40,23 @@ __interrupt void IRQ_KEY(void)
_delay_ms(20);
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);
UART_String("[INT] KEY!");
char buffer[100];
sprintf(buffer, "Light-Status: %u", STATE_LIGHT);
UART_String(buffer);
Measure();
zclZigUP_Reporting();
// 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_KEY);
}
// Clear interrupt flags
@@ -110,8 +74,23 @@ __interrupt void IRQ_DIGIN(void)
_delay_ms(20);
if (!P2_0) // still pressed?
{
UART_String("[INT] Dig-In!");
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

View File

@@ -13,7 +13,6 @@ void UART_Init(void)
void UART_Transmit(char data)
{
U0DBUF = data;
while (U0CSR & (1<<0)); // wait until byte has been sent
}

View File

@@ -4,6 +4,9 @@
#include "uart.h"
#include "global.h"
#include "utils.h"
#include "ds18b20.h"
#include "adc.h"
#include "dht22.h"
void FactoryReset(void)
{
@@ -23,16 +26,30 @@ void Relais(uint8 state)
{
P1_1 = 1; // activate ON-solenoid
P1_2 = 0; // deactivate OFF-solenoid
_delay_ms(250);
_delay_ms(50);
P1_1 = 0; // deactivate ON-solenoid
}
else // Switch light off
{
P1_1 = 0; // deactivate ON-solenoid
P1_2 = 1; // activate OFF-solenoid
_delay_ms(250);
_delay_ms(50);
P1_2 = 0; // deactivate OFF-solenoid
}
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 Relais(uint8 state);
void Measure_QuickStuff(void);
void Measure_Sensor(void);

View File

@@ -25,7 +25,7 @@
#include "dht22.h"
#include "utils.h"
#define ZIGUP_REPORTING_INTERVAL 5000
#define ZIGUP_REPORTING_INTERVAL 30000
afAddrType_t zclZigUP_DstAddr;
@@ -40,23 +40,9 @@ static endPointDesc_t ZigUP_TestEp =
devStates_t zclZigUP_NwkState = DEV_INIT;
void Measure(void)
void zclZigUP_Reporting(uint16 REPORT_REASON)
{
ADC_Voltage = ADC_GetVoltage();
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
const uint8 NUM_ATTRIBUTES = 8;
// send report
zclReportCmd_t *pReportCmd;
@@ -93,7 +79,11 @@ void zclZigUP_Reporting(void)
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].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.addr.shortAddr = 0;
zclZigUP_DstAddr.endPoint=1;
@@ -105,8 +95,6 @@ void zclZigUP_Reporting(void)
}
/*********************************************************************
* ZCL General Profile Callback table
*/
@@ -305,12 +293,21 @@ void zclZigUP_Init( byte task_id )
U1GCR = b00010000; // UART1 Baud_E
U1BAUD = b01000000; // UART1 Baud_M
UART_Init();
_delay_ms(GetRandomNumber()); // Random delay
// Turn all lights off
Relais(0);
// WS2812_SendLED(0, 0, 0);
UART_Init();
WS2812_SendLED(0, 0, 0);
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
if (DHT22_Measure())
@@ -325,8 +322,8 @@ void zclZigUP_Init( byte task_id )
}
else UART_String("No sensor detected.");
// osal_start_reload_timer( zclZigUP_TaskID, ZIGUP_REPORTING_EVT, ZIGUP_REPORTING_INTERVAL );
// start measurement task for reporting of values
osal_start_reload_timer( zclZigUP_TaskID, ZIGUP_REPORTING_EVT, ZIGUP_REPORTING_INTERVAL );
UART_String("Init done.");
}
@@ -390,10 +387,11 @@ uint16 zclZigUP_event_loop( uint8 task_id, uint16 events )
if ( events & ZIGUP_REPORTING_EVT )
{
// update measurements
Measure();
Measure_QuickStuff();
Measure_Sensor();
// report states
zclZigUP_Reporting();
zclZigUP_Reporting(REPORT_REASON_TIMER);
return ( events ^ ZIGUP_REPORTING_EVT );
}

View File

@@ -27,6 +27,7 @@ extern "C"
#define ATTRID_S0_COUNTS 41364
#define ATTRID_ADC_VOLT 41365
#define ATTRID_DIG_INPUT 41366
#define ATTRID_REPORT_REASON 41367
extern SimpleDescriptionFormat_t zclZigUP_SimpleDesc[];
@@ -49,9 +50,7 @@ void FactoryReset(void);
void Relais(uint8 state);
void LED(uint8 state);
void zclZigUP_Reporting(void);
void Measure(void);
void zclZigUP_Reporting(uint16 REPORT_REASON);
static void zclZigUP_BasicResetCB( void );
static void zclZigUP_IdentifyCB( zclIdentify_t *pCmd );