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)
|
||||
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
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
void FactoryReset(void);
|
||||
void Relais(uint8 state);
|
||||
void Measure_QuickStuff(void);
|
||||
void Measure_Sensor(void);
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user