diff --git a/boards/MySensors.c b/boards/MySensors.c index 0a193a9..62965ab 100644 --- a/boards/MySensors.c +++ b/boards/MySensors.c @@ -61,6 +61,20 @@ _Bool send(MyMessage *message, uint8_t data_type) return transportSend(message); } +_Bool sendBattery(uint8_t percent) +{ + _msgTmp.last = MY_NODE_ID; + _msgTmp.sender = MY_NODE_ID; + _msgTmp.destination = GATEWAY_ADDRESS; + _msgTmp.command_echo_payload = ((uint8_t) P_BYTE << 5) + (uint8_t) C_INTERNAL; + _msgTmp.type = I_BATTERY_LEVEL; + _msgTmp.sensor = NODE_SENSOR_ID; + _msgTmp.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION; + _msgTmp.bValue = percent; + + return transportSend(&_msgTmp); +} + _Bool sendHeartbeat(void) { _msgTmp.last = MY_NODE_ID; @@ -95,7 +109,7 @@ void registerNode(void) _msgTmp.destination = GATEWAY_ADDRESS; _msgTmp.command_echo_payload = (P_BYTE << 5) + C_INTERNAL; _msgTmp.type = I_REGISTRATION_REQUEST; - _msgTmp.sensor = 0; + _msgTmp.sensor = NODE_SENSOR_ID; _msgTmp.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION; _msgTmp.bValue = MY_CORE_VERSION; diff --git a/boards/MySensors.h b/boards/MySensors.h index 731cbb8..84b9767 100644 --- a/boards/MySensors.h +++ b/boards/MySensors.h @@ -307,6 +307,7 @@ _Bool present(const uint8_t sensorId, const mysensors_sensor_t sensorType, char _Bool sendSketchInfo(const char *name, const char *version); _Bool send(MyMessage *msg,uint8_t data_type); _Bool sendHeartbeat(void); +_Bool sendBattery(uint8_t percent); void receive(const MyMessage*); void transportProcessMessage(void); _Bool transportSend(MyMessage *message); diff --git a/boards/boards.txt b/boards/boards.txt index fa43d76..ba95624 100644 --- a/boards/boards.txt +++ b/boards/boards.txt @@ -12,6 +12,7 @@ STCP P1.2 OE P1.3 DS P1.4 OCDDA P1.6 +RESET P2.0 LC Relays: @@ -26,6 +27,7 @@ S2 P1.0 RELAY1 P1.2 RELAY2 P1.5 OCDDA P1.6 +RESET P2.0 2 Relays RS485 @@ -38,3 +40,21 @@ RELAY1 P1.3 RS485_DIR P1.4 IN2 P1.5 OCDDA P1.6 +RESET P2.0 + +4 Relays RS485 + +RELAY1 P0.0 +OCDCK P0.2 +IN3 P0.3 +IN4 P0.4 +TXD P0.6 +RXD P0.7 +RELAY3 P1.1 +RELAY2 P1.2 +RELAY4 P1.0 +RS485_DIR P1.5 +OCDDA P1.6 +IN2 P1.7 +RESET P2.0 +IN1 P3.0 diff --git a/boards/build.sh b/boards/build.sh index dfe99da..e598030 100755 --- a/boards/build.sh +++ b/boards/build.sh @@ -3,3 +3,5 @@ sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=201 sdcc-sdcc -mmcs51 --model-large -o chan8.ihx chan8.c MySensors.rel -D FOSC_160000 -I../include sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=202 -I../include sdcc-sdcc -mmcs51 --model-large -o rs485relay.ihx rs485relay.c MySensors.rel -D FOSC_160000 -I../include +sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=203 -I../include +sdcc-sdcc -mmcs51 --model-large -o rs485relay4.ihx rs485relay4.c MySensors.rel -D FOSC_160000 -I../include diff --git a/boards/chan8.c b/boards/chan8.c index 3212852..dd7a75c 100644 --- a/boards/chan8.c +++ b/boards/chan8.c @@ -69,37 +69,37 @@ void receive(const MyMessage* mymsg) // We only expect one type of message from controller. But we better check anyway. if (mymsg->type == V_STATUS) { sensor = mymsg->sensor; - if (sensor == 1) + if (sensor == 0) relay = (relay & 0xFE) + ((mymsg->data[0]=='1')?1:0); - if (sensor == 2) + if (sensor == 1) relay = (relay & 0xFD) + ((mymsg->data[0]=='1')?2:0); - if (sensor == 3) + if (sensor == 2) relay = (relay & 0xFB) + ((mymsg->data[0]=='1')?4:0); - if (sensor == 4) + if (sensor == 3) relay = (relay & 0xF7) + ((mymsg->data[0]=='1')?8:0); - if (sensor == 5) + if (sensor == 4) relay = (relay & 0xEF) + ((mymsg->data[0]=='1')?0x10:0); - if (sensor == 6) + if (sensor == 5) relay = (relay & 0xDF) + ((mymsg->data[0]=='1')?0x20:0); - if (sensor == 7) + if (sensor == 6) relay = (relay & 0xBF) + ((mymsg->data[0]=='1')?0x40:0); - if (sensor == 8) + if (sensor == 7) relay = (relay & 0x7F) + ((mymsg->data[0]=='1')?0x80:0); load(); } } void present_node(void) { - present(NODE_SENSOR_ID, S_ARDUINO_NODE,"Nuvoton Relay Board"); - sendSketchInfo("Relay_Nuvoton", "1.1"); - present(1, S_BINARY, "Relay 1"); - present(2, S_BINARY, "Relay 2"); - present(3, S_BINARY, "Relay 3"); - present(4, S_BINARY, "Relay 4"); - present(5, S_BINARY, "Relay 5"); - present(6, S_BINARY, "Relay 6"); - present(7, S_BINARY, "Relay 7"); - present(8, S_BINARY, "Relay 8"); + present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2"); + sendSketchInfo("Relay_Nuvoton", "1.2"); + present(0, S_BINARY, "Relay 1"); + present(1, S_BINARY, "Relay 2"); + present(2, S_BINARY, "Relay 3"); + present(3, S_BINARY, "Relay 4"); + present(4, S_BINARY, "Relay 5"); + present(5, S_BINARY, "Relay 6"); + present(6, S_BINARY, "Relay 7"); + present(7, S_BINARY, "Relay 8"); registerNode(); delay(20); } diff --git a/boards/rs485relay.c b/boards/rs485relay.c index 6a3f126..b94fb9d 100644 --- a/boards/rs485relay.c +++ b/boards/rs485relay.c @@ -27,6 +27,26 @@ void rs485_out(void) { RS485_DIR = 1; } +void send_state(void) { + MyMessage state; + + state.data[0] = 0; + state.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION; + state.sensor = 0; + state.type = V_TRIPPED; + send(&state, P_BYTE); + state.sensor = 1; + send(&state, P_BYTE); + state.data[0] = RELAY1; + state.sensor = 2; + state.type = V_STATUS; + send(&state, P_BYTE); + state.data[0] = RELAY2; + state.sensor = 3; + send(&state, P_BYTE); + sendBattery(100); +} + void receive(const MyMessage* mymsg) { uint8_t sensor; @@ -34,22 +54,23 @@ void receive(const MyMessage* mymsg) // We only expect one type of message from controller. But we better check anyway. if (mymsg->type == V_STATUS) { sensor = mymsg->sensor; - if (sensor == 3) + if (sensor == 2) RELAY1 = (mymsg->data[0]=='1')?1:0; - if (sensor == 4) + if (sensor == 3) RELAY2 = (mymsg->data[0]=='1')?1:0; } } void present_node(void) { - present(NODE_SENSOR_ID, S_ARDUINO_NODE,"Nuvoton Relay Board"); - sendSketchInfo("Relay_Nuvoton", "1.1"); - present(1, S_DOOR, "IN1"); - present(2, S_DOOR, "IB2"); - present(3, S_BINARY, "Relay 1"); - present(4, S_BINARY, "Relay 2"); + present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2"); + sendSketchInfo("Relay_Nuvoton", "1.2"); + present(0, S_DOOR, "IN1"); + present(1, S_DOOR, "IN2"); + present(2, S_BINARY, "Relay 1"); + present(3, S_BINARY, "Relay 2"); registerNode(); delay(20); + send_state(); } void uart_loop() { @@ -83,7 +104,7 @@ int main() uart_init(9600); RS485_DIR = 0; - P13_PushPull_Mode; + P14_PushPull_Mode; /* Relays */ RELAY1 = 0; diff --git a/boards/rs485relay4.c b/boards/rs485relay4.c new file mode 100644 index 0000000..340bdd1 --- /dev/null +++ b/boards/rs485relay4.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include "MySensors.h" + +#define RS485_DIR P15 + +#define IN1 P30 +#define IN2 P17 +#define IN3 P03 +#define IN4 P04 + +#define RELAY1 P00 +#define RELAY2 P10 +#define RELAY3 P12 +#define RELAY4 P11 + +#define MAXCMD 64 + +unsigned char relay; + +unsigned char crc; + +void rs485_in(void) { + RS485_DIR = 0; +} + +void rs485_out(void) { + RS485_DIR = 1; +} + +void send_state(void) { + MyMessage state; + + state.data[0] = 0; + state.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION; + state.sensor = 0; + state.type = V_TRIPPED; + send(&state, P_BYTE); + state.sensor = 1; + send(&state, P_BYTE); + state.sensor = 2; + send(&state, P_BYTE); + state.sensor = 3; + send(&state, P_BYTE); + state.data[0] = RELAY1; + state.sensor = 4; + state.type = V_STATUS; + send(&state, P_BYTE); + state.data[0] = RELAY2; + state.sensor = 5; + send(&state, P_BYTE); + state.data[0] = RELAY3; + state.sensor = 6; + send(&state, P_BYTE); + state.data[0] = RELAY4; + state.sensor = 7; + send(&state, P_BYTE); + sendBattery(100); +} + +void receive(const MyMessage* mymsg) +{ + uint8_t sensor; + + // We only expect one type of message from controller. But we better check anyway. + if (mymsg->type == V_STATUS) { + sensor = mymsg->sensor; + if (sensor == 4) + RELAY1 = (mymsg->data[0]=='1')?1:0; + if (sensor == 5) + RELAY2 = (mymsg->data[0]=='1')?1:0; + if (sensor == 6) + RELAY3 = (mymsg->data[0]=='1')?1:0; + if (sensor == 7) + RELAY4 = (mymsg->data[0]=='1')?1:0; + } +} + +void present_node(void) { + present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2"); + sendSketchInfo("Relay_Nuvoton", "1.2"); + present(0, S_DOOR, "IN1"); + present(1, S_DOOR, "IN2"); + present(2, S_DOOR, "IN3"); + present(3, S_DOOR, "IN4"); + present(4, S_BINARY, "Relay 1"); + present(5, S_BINARY, "Relay 2"); + present(6, S_BINARY, "Relay 3"); + present(7, S_BINARY, "Relay 4"); + registerNode(); + delay(20); + send_state(); +} + +void uart_loop() { + transportProcess(); +} + +void uart_init(UINT32 u32Baudrate) //T1M = 1, SMOD = 1 +{ + P06_PushPull_Mode; + P07_Input_Mode; + + SCON = 0x50; //UART0 Mode1,REN=1,TI=1 + TMOD |= 0x20; //Timer1 Mode1 + + set_SMOD; //UART0 Double Rate Enable + set_T1M; + clr_BRCK; //Serial port 0 baud rate clock source = Timer1 + +#ifdef FOSC_160000 + TH1 = 256 - (1000000 / u32Baudrate + 1); /*16 MHz */ +#endif +#ifdef FOSC_166000 + TH1 = 256 - (1037500 / u32Baudrate); /*16.6 MHz */ +#endif + set_TR1; + set_TI; //For printf function must setting TI = 1 +} + +int main() +{ + uart_init(9600); + + RS485_DIR = 0; + P15_PushPull_Mode; + + /* Relays */ + RELAY1 = 0; + RELAY2 = 0; + RELAY3 = 0; + RELAY4 = 0; + + P00_PushPull_Mode; + P12_PushPull_Mode; + P11_PushPull_Mode; + P10_PushPull_Mode; + + /* Inputs */ + P30_Input_Mode; + P17_Input_Mode; + P03_Input_Mode; + P04_Input_Mode; + + transportInitialise(); + + while (1) + { + uart_loop(); + } +} +