MSMDPower-node
Добавлено: 06 дек 2019, 06:23
Данное устройство предназначено для установки в скрытом варианте в подрозетник или потолком. Устройство питается от сети переменного тока напряжением 80-270в (верхний порог с запасом и в реальности гораздо выше) и предназначено для коммутации токов до 16А. Так же данный модуль имеет функции защиты нагрузки от низкого и повышенного напряжения (порог устанавливается пользователем), а также функции защиты по току (порог устанавливается пользователем) и по температуре (порог устанавливается пользователем). Имеет возможность работы на 2х частотах 2,4ГГц и 433 мГц, ну и есть множество доп функций для пользователя (частично в доработке софтовая часть).
Ниже представлена урезанная схема устройства и код для первого старта. Также на фото представлено само устройство в облегченном варианте для простой коммутации ламп освещения. Также схема и платы могут отличаться в зависимости от версии. Ниже во вложении представлена стартовая верси.
Ниже представлена урезанная схема устройства и код для первого старта. Также на фото представлено само устройство в облегченном варианте для простой коммутации ламп освещения. Также схема и платы могут отличаться в зависимости от версии. Ниже во вложении представлена стартовая верси.
Код: Выделить всё
/*
* Filename: Relay for lamp
* .ino
* Created Date: Sunday, september 22 2019, 2:16:34 pm
* Author: Sergey Lekarev
*
* Copyright (c) 2019 Sergey Lekarev
*
*
*/
//======== ПОДПРОГРАММА КОТОРАЯ ВЫДЕРГИВАЕТ ТИП ПЕРЕМЕННОЙ ============//
//Urms=K*sqrt(1/N*sum(Uadc*Uadc)),
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
template <typename T_ty> struct TypeInfo {
static const char * name;
};
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name
#define MAKE_TYPE_INFO(type) template <> const char * TypeInfo<type>::name = #type;
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( bool )
MAKE_TYPE_INFO( byte )
MAKE_TYPE_INFO( String )
//#################################### хитрая штуковина которая выковыривает тип переменных #####################################################
#define MY_NODE_ID AUTO
#define MY_PARENT_NODE_ID AUTO
#define MY_RADIO_RF24
#define MY_RF24_PA_LEVEL RF24_PA_MAX
#include <MySensors.h>
#include <avr/wdt.h>
#include <EEPROM.h>
#define SKETCH_NAME "MSMDRelay light"
#define SKETCH_MAJOR_VER "1"
#define SKETCH_MINOR_VER "0"
#define SID_RELAY 1
#define SID_MSMD 210
#define SID_NodeID 211
#define SID_FREQ 212
#define SID_PARENT_SELECT 213
#define MaxByte 0xFF
#define MaxWord 0xFFFF
#define mFreq 8
#define RELAY 6
#define cGateAdr 0
#define DEF_FREQUENCY 1 // min
#define DEB_SWITCH_PIN 3
#define MAXTRY 5 //Количество попыток отправки пакета.
#define PAUSETX 100
unsigned long Freq = DEF_FREQUENCY*60*1000ul, oldFreq = 0;
bool Relay = 0, Relay_Old = 0;
int value_int;
float value_float;
bool value_bool;
byte value_byte;
String value_String;
String Flag_type;
void(* resetFunc) (void) = 0;
// String var = getValue( StringVar, ',', 2); // if a,4,D,r would return D
String getValue(String data, char separator, int index){
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length();
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
} // END
void before(){
wdt_disable();
pinMode(DEB_SWITCH_PIN, INPUT_PULLUP);
if (digitalRead(DEB_SWITCH_PIN) == LOW){
for (int i=0;i<512;i++)
EEPROM.write(i, 0xFF);
}
// RELAY
pinMode(RELAY, OUTPUT);
//=== Read from memory
// Freq
uint8_t fBVal = loadState(mFreq);
if (fBVal != MaxByte) {
Freq = int(fBVal)*60*1000ul;
}
}
void setup(){
wdt_enable(WDTO_8S);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);
present(SID_RELAY , S_LIGHT, "Relay ON/OFF");
wait(100);
present(SID_MSMD, S_CUSTOM, "a00678cb4bc49c5e");
wait(100);
present(SID_NodeID, S_CUSTOM, "Node ID");
wait(100);
present(SID_FREQ, S_CUSTOM, "NODE FREQ MINUTE");
wait(100);
present(SID_PARENT_SELECT, S_CUSTOM, "NODE_PARENT_SELECT");
}
void loop() {
wdt_reset();
Relay_status();
if(millis() - oldFreq > Freq){
oldFreq = millis();
value_bool = Relay;
Flag_type = TYPE_NAME(value_bool); // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
int z = TX(cGateAdr, SID_RELAY, V_STATUS);
}
}
void receive(const MyMessage &message) {
if (message.isAck()) {
return;
}
String Str = ""; bool z;
uint8_t Dest = message.sender;
// Request
if (mGetCommand(message) == C_REQ) {
switch (message.sensor) {
case SID_FREQ:
value_byte = Freq / (60*1000ul);
Flag_type = TYPE_NAME(value_byte); // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
z = TX(Dest, SID_FREQ, V_VAR1);
break;
case SID_RELAY:
value_bool = Relay;
Flag_type = TYPE_NAME(value_bool); // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
z = TX(Dest, SID_RELAY, V_STATUS);
break;
}
return;
}
// Set NULL date (if empty sensors)
if (strlen(message.getString()) == 0) {
return;
}
switch (message.sensor) {
case SID_RELAY:
Relay = message.getBool();
break;
case SID_FREQ:
Freq = message.getByte() * 60*1000ul;
saveState(mFreq, message.getByte());
break;
// NODE_NEW_ID; type == V_VAR1
case SID_NodeID:
byte Node_ID = message.getByte();
hwWriteConfig(EEPROM_NODE_ID_ADDRESS, Node_ID);
resetFunc();
break;
// NODE_NEW_PARENT; type == V_VAR1
case SID_PARENT_SELECT:
byte Node_Parent = message.getByte();
hwWriteConfig(EEPROM_PARENT_NODE_ID_ADDRESS, Node_Parent);
resetFunc();
break;
}
}
void Relay_status(){
if(Relay != Relay_Old){
Relay_Old = Relay;
digitalWrite(RELAY, Relay_Old);
value_bool = Relay;
Flag_type = TYPE_NAME(value_bool); // ЗАПИСЫВАЕТ В ПЕРЕМЕННУЮ FLAG_TYPE ТИП ПЕРЕМЕННОЙ (VALUE_BOOL
int z = TX(cGateAdr, SID_RELAY, V_STATUS);
}
}
//==============================================================================================
//////////<< SEND >>////////////////////////////////////////////////////////////////////////////
//==============================================================================================
int TX(byte Master_id, byte ID_sensors, byte Type_variable) //bool variable
{
wdt_reset();
byte count;
bool send_data;
MyMessage msg(ID_sensors, Type_variable);
if (Flag_type == "int")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "float")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "bool")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "byte")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "String")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true); //setDestination(Master_ID).setSensor(1).set(State1)
wait(PAUSETX, ID_sensors, Type_variable);
if (send_data == 0)
{
Serial.print("failed: ");
Serial.println(send_data);
while (send_data == 0 && count < MAXTRY)
{
wdt_reset();
count++;
Serial.print("Sending a message try No.");
Serial.println(count);
if (Flag_type == "int")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_int), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "float")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_float,1), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "bool")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_bool), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "byte")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_byte), true); //setDestination(Master_ID).setSensor(1).set(State1)
if (Flag_type == "String")
send_data = send(msg.setDestination(Master_id).setSensor(ID_sensors).set(value_String.c_str()), true); //setDestination(Master_ID).setSensor(1).set(State1)
wait(PAUSETX, ID_sensors, Type_variable);
}
}
else
{
Serial.print("send_data: ");
Serial.println(send_data);
}
count = 0;
return send_data;
}