With Lovelace UI it does not work.
my sketch:
#define BUTTON_PIN_1 3 // Arduino Digital I/O pin number for button
#define RELAY_PIN_1 A1 // Arduino Digital I/O pin number for relay
#define BUTTON_PIN_2 6 // Arduino Digital I/O pin number for button
#define RELAY_PIN_2 A3 // Arduino Digital I/O pin number for relay
/**** MySensor configuration ****/
#define MY_BAUD_RATE 9600 // Serial output baud rate
#define MY_TRANSPORT_WAIT_READY_MS 1 //3000 //1 // Establezca cuánto tiempo esperar para que el transporte esté listo en milisegundos
#define MY_RADIO_NRF24 // Enable and select radio type attached
//#define MY_RF24_PA_LEVEL RF24_PA_LOW
#define MY_REPEATER_FEATURE // Habilitar la funcionalidad de repetidor para este nodo
#define MS_BOARD_NAME "Control Pruevas v1" // Nombre del Sketch
#define MS_SOFTWARE_VERSION "1.1" // Version del Sketch
#define MS_RELE_CHILD_ID_1 1 // Id del sensor child para el 1º relay
#define MS_RELE_CHILD_ID_2 2 // Id del sensor child para el 2º relay
// Activar o desactivar sensores
#define MY_DEBUG // Habilitar la depuracion en el serial monitor
#define SERIAL_DEBUG // Habilita sensores en el serial monitor
#define USE_TEMP_SENSOR // Habilitar el sensor de temperatura interna
#define USE_BUTTON_SENSOR // Lo are para la version 3 del Sketch -- #ifdef USE_BUTTON_SENSOR #endif
// ------------------------
#include <SPI.h>
#include <MySensors.h>
#include <Bounce2.h>
#ifdef USE_TEMP_SENSOR
#define pDS18B20 A2 // Arduino Digital I/O pin number para el sensor de temperatura interno
#define MS_TEMP_CHILD_ID_1 0 // Id del sensor child para la temperatura
#include <OneWire.h>
#include <DallasTemperature.h>
#endif
// Estados de los Reles
#define RELAY_ON 1
#define RELAY_OFF 0
// Fuente de cambio de estado (utilizada al imprimir información de depuración)
#define CHANGE_STATE_SOURCE_RADIO 0
#define CHANGE_STATE_SOURCE_SWITCH 1
Bounce debouncer1 = Bounce();
int oldValue1;
bool state1;
Bounce debouncer2 = Bounce();
int oldValue2;
bool state2;
MyMessage msgR1(MS_RELE_CHILD_ID_1, V_LIGHT);
MyMessage msgR2(MS_RELE_CHILD_ID_2, V_LIGHT);
#ifdef USE_TEMP_SENSOR
MyMessage msgT1(MS_TEMP_CHILD_ID_1, V_TEMP);
OneWire oneWire(pDS18B20);
DallasTemperature ds18b20(&oneWire);
#endif
void presentation() {
// Enviar la informacion del sketch al gateway
sendSketchInfo(MS_BOARD_NAME, MS_SOFTWARE_VERSION);
present(MS_RELE_CHILD_ID_1, S_LIGHT, "Rele1");
present(MS_RELE_CHILD_ID_2, S_LIGHT, "Rele2");
#ifdef USE_TEMP_SENSOR
present(MS_TEMP_CHILD_ID_1, S_TEMP, "Temperatura interna");
#endif
}
void setup()
{
#ifdef USE_TEMP_SENSOR
ds18b20.begin();
ds18b20.setWaitForConversion(false);
#endif
#ifdef USE_BUTTON_SENSOR
// Configuracion del Boton y Activar el internal pull-up
pinMode(BUTTON_PIN_1, INPUT_PULLUP); //_PULLUP
pinMode(BUTTON_PIN_2, INPUT_PULLUP); //_PULLUP
// Después de configurar el botón, se configura el debouncer del boton
debouncer1.attach(BUTTON_PIN_1);
debouncer1.interval(5);
debouncer2.attach(BUTTON_PIN_2);
debouncer2.interval(5);
debouncer1.update();
debouncer2.update();
oldValue1 = debouncer1.read();
oldValue2 = debouncer2.read();
#endif
setRelayState(RELAY_PIN_1, RELAY_OFF); // Make sure relays are off when starting up
pinMode(RELAY_PIN_1, OUTPUT); // Then set relay pins in output mode
setRelayState(RELAY_PIN_2, RELAY_OFF); // Make sure relays are off when starting up
pinMode(RELAY_PIN_2, OUTPUT); // Then set relay pins in output mode
state1 = loadState(MS_RELE_CHILD_ID_1); // Set relay to last known state (using eeprom storage)
setRelayState(RELAY_PIN_1, state1); // Make sure relays
state2 = loadState(MS_RELE_CHILD_ID_2); // Set relay to last known state (using eeprom storage)
setRelayState(RELAY_PIN_2, state2); // Make sure relays
}
void loop()
{
#ifdef USE_TEMP_SENSOR
static float prevTemp = 0;
#endif
#ifdef USE_BUTTON_SENSOR
debouncer1.update();
int value1 = debouncer1.read();
if (value1 != oldValue1 && value1 == HIGH) { // Quitar o poner al final && value==0 para poner interruptor o pulsador === if (value != oldValue && value==0), para touch es (value != oldValue && value == HIGH )
state1 = !state1; // Toggle the state
send(msgR1.set(state1), false); // enviar nuevo estado al controlador, no se solicitó ack
setRelayState(RELAY_PIN_1, state1); // switch the relay to the new state
saveState(MS_RELE_CHILD_ID_1, state1); // Store state in eeprom
// Write some debug info
printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, MS_RELE_CHILD_ID_1, value1);
}
oldValue1 = value1;
debouncer2.update();
int value2 = debouncer2.read();
if (value2 != oldValue2 && value2 == HIGH) { // Quitar o poner al final && value==0 para poner interruptor o pulsador === if (value != oldValue && value==0), para touch es (value != oldValue && value == HIGH )
state2 = !state2; // Toggle the state
send(msgR2.set(state2), false); // enviar nuevo estado al controlador, no se solicitó ack
setRelayState(RELAY_PIN_2, state2); // switch the relay to the new state
saveState(MS_RELE_CHILD_ID_2, state2); // Store state in eeprom
// Write some debug info
printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, MS_RELE_CHILD_ID_2, value2);
}
oldValue2 = value2;
#endif
// Fetch temperatures from Dallas sensors
#ifdef USE_TEMP_SENSOR
ds18b20.requestTemperatures();
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>(ds18b20.getTempCByIndex(0)));
if (temperature != -127.00 && temperature != 85.00 && prevTemp != temperature) {
send(msgT1.setSensor(0).set(ds18b20.getTempCByIndex(0),1)); // Envio la nueva temperatura
#ifdef SERIAL_DEBUG
Serial.print("Temperatura interna: ");
Serial.println(ds18b20.getTempCByIndex(0),1);
#endif
prevTemp = temperature;
}
#endif
}
void receive(const MyMessage &message) {
if (message.type == V_STATUS) {
switch (message.sensor) {
case MS_RELE_CHILD_ID_1:
state1 = message.getBool();
setRelayState(RELAY_PIN_1, state1); // Cambia el estado del rele
saveState(MS_RELE_CHILD_ID_1, state1); // Almacena el estado en la eeprom
printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, MS_RELE_CHILD_ID_1, state1); // Escribe la informacion en el debug
break;
case MS_RELE_CHILD_ID_2:
state2 = message.getBool();
setRelayState(RELAY_PIN_2, state2); // Cambia el estado del rele
saveState(MS_RELE_CHILD_ID_2, state2); // Almacena el estado en la eeprom
printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, MS_RELE_CHILD_ID_2, state2); // Escribe la informacion en el debug
break;
}
}
}
// Set status of a relay pin
void setRelayState(byte relayPin, bool value) {
digitalWrite(relayPin, value ? RELAY_ON : RELAY_OFF);
}
// Print debug info, centralized in one place to minimize memory usage and have only one #ifdef MY_DEBUG for all state change messages
void printStateChangedDebug(int source, int sensorID, bool value) {
#ifdef SERIAL_DEBUG
Serial.print(F("Sensor cambiado por: "));
Serial.print(source == CHANGE_STATE_SOURCE_RADIO ? F("Cambio por radio") : F("Cambio físico"));
Serial.print(F(", Sensor nº: "));
Serial.println(sensorID);
#endif