MYS_2ReleySwitch - выключатель на 2 реле
Добавлено: 03 мар 2020, 13:14
Здравствуйте. Т.к того что я хотел нигде не нашел, решил выложить свое чудо, пока тестирование чисто на столе, работает.
Предполагается установка в подрозетник за двухклавишный выключатель (без фиксации).
Если есть какие-то вопросы, спрашивайте. на фото плата еще не отмыта.
Критика и улучшения приветствуются!
Предполагается установка в подрозетник за двухклавишный выключатель (без фиксации).
Если есть какие-то вопросы, спрашивайте. на фото плата еще не отмыта.
Критика и улучшения приветствуются!
Код: Выделить всё
#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
#define MY_TRANSPORT_WAIT_READY_MS 1000 // Запуск без сети MyS
#define MY_REPEATER_FEATURE
#define MY_NODE_ID 10 // Номер ноды
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_MAX)
#include <MySensors.h> // Подключаем библиотеку
#include <Bounce2.h>
#define BUTTON_1 9
#define BUTTON_2 11
#define RELAY_1 0
#define RELAY_2 1
#define REL1_CHILD_ID 50
#define REL2_CHILD_ID 51
#define TEMP_CHILD_ID 252 //for any tests
#define SIGNAL_Q_ID 253
bool state_1 = 0; // Объявляем переменные
bool state_2 = 0; // статус1 и статус2
uint32_t rawTemperature=0;
float celsius=0.0; //rawTemperature converted to Celsius
uint32_t C_BATT_TIME = 30000; //отправка через час
uint32_t myTimer1;
int16_t linkQuality;
int16_t old_linkQuality;
Bounce bouncer1 = Bounce(BUTTON_1, 5);
Bounce bouncer2 = Bounce(BUTTON_2, 5);
MyMessage msg1(REL1_CHILD_ID, V_STATUS); // Создаём контейнеры
MyMessage msg2(REL2_CHILD_ID, V_STATUS);
MyMessage msg3(TEMP_CHILD_ID, V_TEMP);
void presentation() {
sendSketchInfo("Relay+Button", "1.0");
present(REL1_CHILD_ID, S_BINARY,"Relay1");
wait(100);
present(REL2_CHILD_ID, S_BINARY,"Relay2");
wait(100);
present(TEMP_CHILD_ID, S_TEMP, "INTERNAL TEMP", 1);
wait(100);
present(SIGNAL_Q_ID, S_CUSTOM, "SIGNAL QUALITY", 1);
wait(100);
}
void setup() {
pinMode(BUTTON_1, INPUT_PULLUP); // Пин2 вход с подтяжкой (Кнопка1)
pinMode(BUTTON_2, INPUT_PULLUP); // Пин3 вход с подтяжкой (Кнопка2)
pinMode(RELAY_1, OUTPUT); // Пин4 выход (Реле1)
pinMode(RELAY_2, OUTPUT); // Пин5 выход (Реле2)
NRF_TEMP->TASKS_STOP;
NRF_TEMP->INTENSET=1; //enable EVENTS_DATARDY temperature interrupt
while (!(NRF_TEMP->INTENSET==1)) {} //wait until completed
send(msg1.set(state_1)); // Отправляем состояние реле1 на контроллер
wait(100);
send(msg2.set(state_2)); // Отправляем состояние реле1 на контроллер
wait(100);
}
void loop() {
//если сменилось состояние кнопки
if (bouncer1.update() ) {
if (bouncer1.read() == LOW) { //если считано значение 1
if (state_1 == 1 ) { //если свет был выключен, будем его включать
state_1 = 0;
} else { //если свет был включен, будем выключать
state_1 = 1;
}
digitalWrite(RELAY_1, state_1); // Записываем значение переменных
send(msg1.set(state_1)); // Отправляем состояние реле1 на контроллер
}
}
if (bouncer2.update() ) {
if (bouncer2.read() == LOW) { //если считано значение 1
if (state_2 == 1 ) { //если свет был выключен, будем его включать
state_2 = 0;
} else { //если свет был включен, будем выключать
state_2 = 1;
}
digitalWrite(RELAY_2, state_2); // Записываем значение переменных
send(msg2.set(state_2)); // Отправляем состояние реле1 на контроллер
}
}
if (millis() - myTimer1 >= C_BATT_TIME) { //
myTimer1 = millis(); // сброс таймера
readTemp();
wait(100);
linkQuality = calculationRxQuality();
if (linkQuality != old_linkQuality) {
wait(10);
sendSignalStrength(linkQuality);
wait(50);
old_linkQuality = linkQuality;
}
}
}
void readTemp() {
NRF_TEMP->TASKS_START=1;
while (!(NRF_TEMP->EVENTS_DATARDY)) {} //wait until temperature measurement is complete
rawTemperature=NRF_TEMP->TEMP;
celsius=((float)rawTemperature)/4.0;
send(msg3.set(celsius, 1));
wait(10);
}
bool sendSignalStrength(const int16_t level, const bool ack) {
return _sendRoute(build(_msgTmp, GATEWAY_ADDRESS, SIGNAL_Q_ID, C_SET, V_VAR1,
ack).set(level));
}
int16_t calculationRxQuality() {
int16_t nRFRSSI_temp = transportGetReceivingRSSI();
int16_t nRFRSSI = map(nRFRSSI_temp, -85, -40, 0, 100);
if (nRFRSSI < 0) {
nRFRSSI = 0;
}
if (nRFRSSI > 100) {
nRFRSSI = 100;
}
return nRFRSSI;
}
void receive(const MyMessage &message){
// Если пришло сообщение для сенсора, записываем его в переменную статус1
if ((message.type == V_STATUS)&&(message.sensor == REL1_CHILD_ID)) {
state_1 = message.getBool();
digitalWrite(RELAY_1, state_1);
send(msg1.set(state_1)); // Отправляем состояние реле1 на контроллер
}
// Если пришло сообщение для сенсора, записываем его в переменную статус2
if ((message.type == V_STATUS)&&(message.sensor == REL2_CHILD_ID)) {
state_2 = message.getBool();
digitalWrite(RELAY_2, state_2);
send(msg2.set(state_2)); // Отправляем состояние реле2 на контроллер
}
if (mGetCommand(message) == C_REQ) {
send(msg1.set(state_1)); // Отправляем состояние реле1 на контроллер
send(msg2.set(state_2)); // Отправляем состояние реле2 на контроллер
}
}