So I wonder why they didn’t work today.
Product Firmware
PRODUCT_ID(XXXX); // replace by your product ID
PRODUCT_VERSION(1);
int retrys;
int triggerRelay(String command);
void arlshandler(const char* event, const char* data);
void setup() {
Particle.subscribe("klaxon", arlsHandler, MY_DEVICES);
Particle.function("controlRelay", triggerRelay);
configRetry:
Wire.begin();
Wire.beginTransmission(0x20);
Wire.write(0x00);
Wire.write(0xFC);
byte status = Wire.endTransmission();
if(status != 0){
if(retrys < 3){
retrys++;
delay(500);
Particle.publish("Wires", "Config Error", 60, PRIVATE);
Wire.reset();
delay(500);
goto configRetry;
}
else{
retrys = 0;
Particle.publish("Wires", "Config Failed", 60, PRIVATE);
delay(500);
System.reset();
}
}
else{
Particle.publish( "Wires", "Config Success", 60, PRIVATE);
}
}
void loop() {
//
}
int triggerRelay(String command){
if ( command.equalsIgnoreCase("relayon") ){
trigOnRetry:
Wire.beginTransmission(0x20);
Wire.write(0x0A);
Wire.write(0x01);
byte trig = Wire.endTransmission();
if(trig != 0){
if(retrys < 3){
retrys++;
delay(500);
Particle.publish("Wires", "Relay Error", 60, PRIVATE);
Wire.reset();
delay(500);
goto trigOnRetry;
}
else{
retrys = 0;
Particle.publish("Wires", "Relay Failed", 60, PRIVATE);
delay(500);
goto hardReset;
}
}
else{
Particle.publish( "Wires", "Relay Success", 60, PRIVATE);
return 1;
}
}
if( command.equalsIgnoreCase("relayoff") ){
trigOffRetry:
Wire.beginTransmission(0x20);
Wire.write(0x0A);
Wire.write(0x00);
byte trig = Wire.endTransmission();
if(trig != 0){
if(retrys < 3){
retrys++;
delay(500);
Particle.publish("Wires", "Relay Error", 60, PRIVATE);
Wire.reset();
delay(500);
goto trigOffRetry;
}
else{
retrys = 0;
Particle.publish("Wires", "Relay Failed", 60, PRIVATE);
delay(500);
goto hardReset;
}
}
else{
Particle.publish( "Wires", "Relay Success", 60, PRIVATE);
return 1;
}
}
if( command.equalsIgnoreCase("reset") ){
delay(500);
hardReset:
System.reset();
return 1;
}
return 0;
}
void arlsHandler(const char* event, const char* data){
if ( strcmp(event, "XXXXX") == 0 && strcmp(data, "on")==0 ){
delay(500);
triggerRelay("relayon");
}
if ( strcmp(event, "XXXXXX") == 0 && strcmp(data, "off")==0 ){
delay(500);
triggerRelay("relayoff");
}
}
The firmware on the electron (not in product firmware)
// This #include statement was automatically added by the Particle IDE.
#include <NCD2Relay.h>
SYSTEM_MODE(AUTOMATIC);
NCD2Relay relayController;
int lastInputState = 0;
void setup() {
Serial.begin(115200);
relayController.setAddress(0,0,0);
}
void loop() {
int Status = relayController.readAllInputs();
if (Status != lastInputState){
if (Status ==1){
Particle.publish("CCCC", "on", PRIVATE);
}
else{
Particle.publish("CCCC", "off", PRIVATE);
}
delay(500);
}
lastInputState = Status;
}