Sure, it’s shown below. I’m using two timers: one to turn on leds on the app which is working and the other, to count and display the total of times the leds come on.
//#define BLYNK_DEBUG // Optional, this enables lots of prints
//#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <Bridge.h>
#include <BlynkSimpleYun.h>
#include <Process.h>
#include <FileIO.h>
String dataString;
/* Blynk */
char auth[] = "*******";
BlynkTimer timer;
//LEDs on counters
// S XL XXL S1 S2
int opCounter[5] = {0, 0, 0, 0, 0};
int lastRelayState[5] = {0, 0, 0, 0, 0};
//Blynk LEDs
WidgetLED ledS(V11);
WidgetLED ledXL(V12);
WidgetLED ledXXL(V13);
WidgetLED ledS1(V14);
WidgetLED ledS2(V15);
//hardware arduino Yun
//lines connected to N/O relays contactors
const int statusPinS = A5;
const int statusPinXL = A4;
const int statusPinXXL = A3;
const int statusPinS1 = A2;
const int statusPinS2 = A1;
void setup() {
Bridge.begin();
Console.begin();
pinMode(statusPinS, INPUT_PULLUP);
pinMode(statusPinXL, INPUT_PULLUP);
pinMode(statusPinXXL, INPUT_PULLUP);
pinMode(statusPinS1, INPUT_PULLUP);
pinMode(statusPinS2, INPUT_PULLUP);
timer.setInterval(5000L, ledTimers); //used to turn on leds on app
timer.setInterval(6000L, ledCounters); //used to count times leds turn on
Blynk.begin(auth);
}
void loop() {
Blynk.run();
timer.run();
}
void ledTimers() {
bool pinState[5] {
digitalRead(statusPinS) == HIGH,
digitalRead(statusPinXL) == HIGH,
digitalRead(statusPinXXL) == HIGH,
digitalRead(statusPinS1) == HIGH,
digitalRead(statusPinS2) == HIGH
};
delay(50); //for debounce just in case
if (pinState[0]) {
ledS.off();
}
else {
ledS.on();
}
if (pinState[1]) {
ledXL.off();
}
else {
ledXL.on();
}
if (pinState[2]) {
ledXXL.off();
}
else {
ledXXL.on();
}
if (pinState[3]) {
ledS1.off();
}
else {
ledS1.on();
}
if (pinState[4]) {
ledS2.off();
}
else {
ledS2.on();
}
}
void ledCounters() {
bool pinState[5] {
digitalRead(statusPinS),
digitalRead(statusPinXL),
digitalRead(statusPinXXL),
digitalRead(statusPinS1),
digitalRead(statusPinS2)
};
delay(50); //for debounce just in case
if (!pinState[0] != lastRelayState[0]) {
lastRelayState[0] = !pinState[0];
opCounter[0] += 1;
dataString = "";
dataString += getTimeStamp();
dataString += " S cnt: ";
dataString += opCounter[0];
writeSD(dataString);
Blynk.virtualWrite(V18, opCounter[0]);
}
if (!pinState[1] != lastRelayState[1]) {
lastRelayState[1] = !pinState[1];
opCounter[1] += 1;
dataString = "";
dataString += getTimeStamp();
dataString += " XL cnt: ";
dataString += opCounter[1];
writeSD(dataString);
Blynk.virtualWrite(V20, opCounter[1]);
}
if (!pinState[2] != lastRelayState[2]) {
lastRelayState[2] = !pinState[2];
opCounter[2] += 1;
dataString = "";
dataString += getTimeStamp();
dataString += " XXL cnt: ";
dataString += opCounter[2];
writeSD(dataString);
Blynk.virtualWrite(V21, opCounter[2]);
}
if (!pinState[3] != lastRelayState[3]) {
lastRelayState[3] = !pinState[3];
opCounter[3] += 1;
dataString = "";
dataString += getTimeStamp();
dataString += " S1 cnt: ";
dataString += opCounter[3];
writeSD(dataString);
Blynk.virtualWrite(V22, opCounter[3]);
}
if (!pinState != lastRelayState[4]) {
lastRelayState[4] = !pinState[4];
opCounter[4] += 1;
dataString = "";
dataString += getTimeStamp();
dataString += " S2 cnt: ";
dataString += opCounter[4];
writeSD(dataString);
Blynk.virtualWrite(V23, opCounter[4]);
}
}
void writeSD(String data) {
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
// The FileSystem card is mounted at the following "/mnt/FileSystema1"
File dataFile = FileSystem.open("/mnt/sd/cntlog.txt", FILE_APPEND);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(data);
dataFile.close();
// print to the Console port too:
Console.print("Data written to SD: ");
Console.println(data);
}
// if the file isn't open, pop up an error:
else {
Console.println("error opening datalog.txt");
}
}
// This function return a string with the time stamp
String getTimeStamp() {
String result;
Process time;
// date is a command line utility to get the date and the time
// in different formats depending on the additional parameter
time.begin("date");
time.addParameter("+%D-%T"); // parameters: D for the complete date mm/dd/yy
// T for the time hh:mm:ss
time.run(); // run the command
// read the output of the command
while (time.available() > 0) {
char c = time.read();
if (c != '\n') {
result += c;
}
}
return result;
}