I'd like to alter the "LED_T_ON" values using an I2C enabled device (i.e. RPi)
Code for Arduino Mega slave:
//slave
#include <Wire.h>
#define SLAVE_ADDRESS 0x08
const int PWR_LED = 43;
int LED_TinH_ON = 18;
int LED_T_ON = 5000;
int LED_T_OFF = 5000;
String inString = ""; // string to hold input
byte LastMasterCommand = 0;
int Mval;
char user_input;
class Relay {
int relayPin;
long OnTime; // milliseconds of on-time
long OffTime; // milliseconds of off-time
// These maintain the current state
int relayState; // pumpState used to set the PUMP
unsigned long previousMillis; // will store last time PUMP was updated
// Constructor - creates a Timer and initializes the member variables and state
public:
Relay(int pin, long on, long off)
{
relayPin = pin;
pinMode(relayPin, OUTPUT);
OnTime = on;
OffTime = off;
relayState = LOW;
previousMillis = 0; //ORIGINALLY 0
}
void Update()
{
// check to see if it's time to change the state of the TIMER
unsigned long currentMillis = millis();
if((relayState == HIGH) && (currentMillis - previousMillis >= OnTime))
{
relayState = LOW; // Turn it off
previousMillis = currentMillis; // Remember the time
digitalWrite(relayPin, relayState); // Update the actual LED
}
else if ((relayState == LOW) && (currentMillis - previousMillis >= OffTime))
{
relayState = HIGH; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(relayPin, relayState); // Update the actual RELAY
}
}
};
Relay relay3(PWR_LED, LED_T_OFF, LED_T_ON);
void setup() {
// initialize serial communication with computer:
Serial.begin(9600);
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveData);
Wire.onRequest(slavesRespond);
pinMode(PWR_LED, OUTPUT);
}
void loop() {
delay(1000);
Serial.print("LED_T_ON=");
Serial.println(LED_T_ON);
Serial.print("LED_T_OFF=");
Serial.println(LED_T_OFF);
Serial.println();
relay3.Update();
switch (Mval) {
case 1 ... 25:
LED_TinH_ON = Mval;
Serial.print("LED time on: ");
Serial.print(LED_TinH_ON);
Serial.println("h");
LED_T_ON = LED_TinH_ON*1000;//*60*60;
LED_T_OFF = (24-LED_TinH_ON)*1000;//*60*60;
break;
}
}
void receiveData(int byteCount) {
LastMasterCommand = Wire.read();
while (Wire.available()) {
int msg = Wire.read();
if (isDigit(msg)) {
inString += (char)msg;
}
}
Mval = inString.toInt();
//Serial.println(LastMasterCommand);
inString = "";
//Serial.println(Mval);
}
void slavesRespond() {
}
When I change the value on the RPi the Arduino receives and displays the correct value but the timed relays don't actually use the updated values.
Am I missing something?