Add IRQ on Gateway

This commit is contained in:
2020-12-20 15:11:14 +03:00
parent 6484097813
commit 84fcd41811
4 changed files with 102 additions and 26 deletions

View File

@@ -1,7 +1,7 @@
{ {
// See http://go.microsoft.com/fwlink/?LinkId=827846 // See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format // for the documentation about the extensions.json format
"recommendations": [ "recommendations": [
"platformio.platformio-ide" "platformio.platformio-ide"
] ]
} }

View File

@@ -8,8 +8,11 @@
; Please visit documentation for the other options and examples ; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[env:pro16MHzatmega328] [env:pro8MHzatmega328]
platform = atmelavr platform = atmelavr
board = pro16MHzatmega328 board = pro8MHzatmega328
framework = arduino framework = arduino
lib_deps = mysensors/MySensors@^2.3.2 monitor_speed = 115200
lib_deps =
mysensors/MySensors@^2.3.2
thomasfredericks/Bounce2 @ ^2.55

View File

@@ -3,33 +3,103 @@
#define MY_RADIO_RF24 #define MY_RADIO_RF24
#define MY_RF24_CHANNEL (105) #define MY_RF24_CHANNEL (105)
#define MY_RF24_PA_LEVEL RF24_PA_HIGH #define MY_RF24_PA_LEVEL RF24_PA_HIGH
#include <MySensors.h>
#define SOCK1 2 #define SOCK1 2
#define SOCK2 3 #define SOCK2 3
#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define RELAY1 A0
#define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define RELAY2 A1
#define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #define MY_DEFAULT_ERR_LED_PIN (4) // Error led pin
#define MY_DEFAULT_RX_LED_PIN (5) // Receive led pin
#define MY_DEFAULT_TX_LED_PIN (6) // the PCB, on board LED
#define BUTT1 8
#define BUTT2 7
#include <MySensors.h>
#include <Bounce2.h>
// #undef MY_NODE_ID
// #define MY_NODE_ID 14
bool stat1, stat2;
void presentation(); void presentation();
void sendData(MyMessage msg, bool status); void sendData(MyMessage msg, bool status, mysensors_data_t msd);
void receive(const MyMessage &message); void receive(const MyMessage &message);
MyMessage msgMillis(2, V_VAR1); MyMessage msgMillis(2, V_VAR1);
MyMessage msgSock1s(0, V_STATUS);
MyMessage msgSock2s(1, V_STATUS);
MyMessage msgSock1(2, V_VAR2); MyMessage msgSock1(2, V_VAR2);
MyMessage msgSock2(2, V_VAR3); MyMessage msgSock2(2, V_VAR3);
Bounce butt1 = Bounce(), butt2 = Bounce();
void setup() { void setup() {
pinMode(SOCK1, OUTPUT); pinMode(SOCK1, OUTPUT);
pinMode(SOCK2, OUTPUT); pinMode(SOCK2, OUTPUT);
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
butt1.attach(BUTT1, INPUT_PULLUP);
butt2.attach(BUTT2, INPUT_PULLUP);
butt1.interval(25);
butt2.interval(25);
stat1 = loadState(0);
digitalWrite(SOCK1, stat1);
digitalWrite(RELAY1, !stat1);
stat2 = loadState(1);
digitalWrite(SOCK2, stat2);
digitalWrite(RELAY2, !stat2);
sendData(msgSock1s, !stat1, V_STATUS);
wait(100);
sendData(msgSock2s, !stat2, V_STATUS);
wait(100);
sendData(msgSock1, !stat1, V_VAR2);
wait(100);
sendData(msgSock2, !stat2, V_VAR3);
} }
void loop() { void loop() {
static uint32_t cRun = millis(); static uint32_t cRun = millis() - 60000;
if((cRun + 10000) <= millis()){ butt1.update();
cRun = millis(); butt2.update();
send(msgMillis.set(cRun)); if(butt1.fell()){
} stat1 = !stat1;
digitalWrite(SOCK1, stat1);
digitalWrite(RELAY1, !stat1);
sendData(msgSock1s, !stat1, V_STATUS);
sendData(msgSock1, !stat1, V_VAR2);
saveState(0, stat1);
Serial.print(F("Change Sock1: ")); Serial.println(stat1);
}
if(butt2.fell()){
stat2 = !stat2;
digitalWrite(SOCK2, stat2);
digitalWrite(RELAY2, !stat2);
sendData(msgSock2s, !stat2, V_VAR3);
sendData(msgSock2, !stat2, V_STATUS);
saveState(1, stat2);
Serial.print(F("Change Sock2: ")); Serial.println(stat2);
}
if(stat1 != digitalRead(SOCK1)){
Serial.print(F("Curr Sock1: ")); Serial.println(digitalRead(SOCK1));
Serial.print(F("Change Sock1: ")); Serial.println(stat1);
digitalWrite(SOCK1, stat1);
digitalWrite(RELAY1, !stat1);
saveState(0, digitalRead(SOCK1));
sendData(msgSock1, !stat1, V_VAR2);
}
if(stat2 != digitalRead(SOCK2)){
Serial.print(F("Curr Sock2: ")); Serial.println(digitalRead(SOCK2));
digitalWrite(SOCK2, stat2);
digitalWrite(RELAY2, !stat2);
saveState(1, digitalRead(SOCK2));
sendData(msgSock2, !stat2, V_VAR3);
Serial.print(F("Change Sock2: ")); Serial.println(stat2);
}
if((cRun + 60000) <= millis()){
cRun = millis();
send(msgMillis.set(cRun));
}
} }
void presentation() void presentation()
@@ -40,14 +110,14 @@ void presentation()
present(2, S_CUSTOM, "ESMillis"); present(2, S_CUSTOM, "ESMillis");
} }
void sendData(MyMessage msg, bool status) void sendData(MyMessage msg, bool status, mysensors_data_t msd)
{ {
bool send_data = false; bool send_data = false;
uint8_t count = 0; uint8_t count = 0;
while(send_data == false){ while(send_data == false){
count++; count++;
send_data = send(msg.set(status)); send_data = send(msg.set(status));
wait(100, C_SET, V_STATUS); wait(100, C_SET, msg.type);
if ((count == 3 )&&(send_data == 0)){ // Если сделано 3 попытки и нет подтверждения отправки if ((count == 3 )&&(send_data == 0)){ // Если сделано 3 попытки и нет подтверждения отправки
count = 0; // Обнуляем счётчик count = 0; // Обнуляем счётчик
send_data = 1; // Выходим из цикла send_data = 1; // Выходим из цикла
@@ -57,15 +127,16 @@ void sendData(MyMessage msg, bool status)
void receive(const MyMessage &message) void receive(const MyMessage &message)
{ {
if(message.getType() != V_STATUS) return;
switch (message.sensor) switch (message.sensor)
{ {
case 0: case 0:
digitalWrite(SOCK1, message.getBool()); stat1 = !message.getBool();
sendData(msgSock1, digitalRead(SOCK1)); Serial.print(F("Recv1: ")); Serial.println(stat1);
break; break;
case 1: case 1:
digitalWrite(SOCK1, message.getBool()); stat2 = !message.getBool();
sendData(msgSock2, digitalRead(SOCK2)); Serial.print(F("Recv2: ")); Serial.println(stat2);
break; break;
default: default:
break; break;

View File

@@ -5,6 +5,8 @@
#define MY_RF24_PA_LEVEL RF24_PA_HIGH #define MY_RF24_PA_LEVEL RF24_PA_HIGH
#define MY_GATEWAY_SERIAL #define MY_GATEWAY_SERIAL
#define MY_RF24_CHANNEL (105) #define MY_RF24_CHANNEL (105)
#define MY_RX_MESSAGE_BUFFER_FEATURE
#define MY_RF24_IRQ_PIN 2
// Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
#if F_CPU == 8000000L #if F_CPU == 8000000L
#define MY_BAUD_RATE 38400 #define MY_BAUD_RATE 38400