Dear all.
I am doing simple program Where . I am controlling on current limit of sensor. If current sensor value exceed 1A trip the relay
SImilarly via serial port. If i send command 1 activate relay if 0 deactivate relay. Indivually then are workg fine . relay got trip after 30S in automatic mode and similary if i send command serially activate and Deactivate. Now I wanted to combine both code.
either one status ie. relay or serial.receive High , Activate else deactivate.But Here relay not activate itself.
Here is my code
float Current_Limit=0.60;
int newaverage;
float Output_Current;
static int Trip_Count=0;
void Serial_Command()
{
// while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number
int Check_fault=Relay_Fault_Check();
if (val == 1 || Check_fault== 1) {
// test for command 1 then turn on LED
//Serial.println("RELAY1 on");
digitalWrite(RELAY1, HIGH); // turn on LED
Relay_Status=1;
}
else if (val == 0 || Check_fault==0) // test for command 0 then turn off LED
{
//Serial.println("RELAY1 OFF");
digitalWrite(RELAY1, LOW); // turn off LED
Relay_Status=0;
}
}
int Relay_Fault_Check()
{
if(Output_Current>Current_Limit)
{
Trip_Count=Trip_Count+1;
if(Trip_Count>=5)
{
Tripped_Flag=1;
Serial.print("Tripped_Flag:");
Serial.println(Tripped_Flag);
return(Tripped_Flag);
}
}else
{
if(Trip_Count<=0)
{
Trip_Count=0;
}else
{
Trip_Count=Trip_Count-1;
}
Tripped_Flag=0;
Serial.print("Tripped_Flag:");
Serial.println(Tripped_Flag);
return(Tripped_Flag);
}
}
void loop()
{
Serial_Command();
delay(500);
}
My testing CODe Here . which is working
I dont know How to keep status High always for serial
if i comment these line send command serially it work always relay on continously.
TakeReading();
Chk_Relay_Tripped();
Serial.println(Output_Current);
int Analog_Pin=5;
int newaverage;
float Output_Current;
#define RELAY1 2
#define MAX_TRIP_COUNT 5
float Current_Limit=0.60;
static int Trip_Count=0;
static int Tripped_Flag=1;
void TakeReading()
{
newaverage = analogRead(A5);
// Serial.print("count:");
// Serial.println(newaverage);
Output_Current = 0.0336666666667*newaverage - 17.17;
}
void Chk_Relay_Tripped()
{
if(Output_Current>Current_Limit)
{
Trip_Count=Trip_Count+1;
// Serial.print("Trip_Count:");
//Serial.println(Trip_Count);
if(Trip_Count>=5)
{
Relay_Activate();
}
}
else
{
if(Trip_Count<=0)
{
Trip_Count=0;
}
else
{
Trip_Count=Trip_Count-1;
}
Relay_Deactivate();
// Serial.print("Trip_Count:");
// Serial.println(Trip_Count);
}
}
void Relay_Activate()
{
for (unsigned long start = millis(); millis() - start < 10000;)
{
digitalWrite(RELAY1,HIGH);
if (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number
if (val == 1) {
digitalWrite(RELAY1, LOW); // turn on LED
}
//Serial.println("RELAY GOT TRIPPED");
Tripped_Flag=0;
Trip_Count=0;
}
}
void Relay_Deactivate()
{
digitalWrite(RELAY1,LOW);
Tripped_Flag=1;
}
void Relay_Intialize()
{
digitalWrite(RELAY1,LOW);
}
void setup() {
Serial.begin(9600); // set serial speed
pinMode(RELAY1, OUTPUT); // set LED as output
digitalWrite(RELAY1, LOW); //turn off LED
pinMode(Analog_Pin,INPUT);
}
void loop(){
TakeReading();
Chk_Relay_Tripped();
Serial.println(Output_Current);
while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number
if (val == 1) { // test for command 1 then turn on LED
Serial.println("RELAY on");
digitalWrite(RELAY1, HIGH); // turn on LED
}
else if (val == 0) // test for command 0 then turn off LED
{
Serial.println("RELAY OFF");
digitalWrite(RELAY1, LOW); // turn off LED
}
else // if not one of above command, do nothing
{
//val = val;
Serial.println("Wrong command");
}
Serial.println(val);
Serial.flush(); // clear serial port
}
while (Serial.available() == 0); // do nothing if nothing sentThe program will loop on this line and do nothing else until something is received on Serial. Is that what you want ?
if (Serial.available() == 0); // do nothing if nothing sentOn the other hand this test will be ignored due to the trailing semi-colon and the code following it will always be executed. Is that what you want ?
void Relay_Activate()
{
for (unsigned long start = millis(); millis() - start < 10000;)
{
digitalWrite(RELAY1,HIGH);
if (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number
if (val == 1)
{
digitalWrite(RELAY1, LOW); // turn on LED
}
//Serial.println("RELAY GOT TRIPPED");
Tripped_Flag=0;
Trip_Count=0;
}
}
This function will keep the relay on for 10 seconds no matter what Serial input is received because of the first statement in the for loop which turns it on each time through the 10000 iterations of the for loop.
int Analog_Pin=5;
int newaverage;
float Output_Current;
#define RELAY1 7
#define MAX_TRIP_COUNT 5
float Current_Limit=0.6;
static int Trip_Count=0;
static int Tripped_Flag=1;
int Serial_Status=0;
void TakeReading()
{
newaverage = analogRead(A5);
Serial.print("newaverage:");
Serial.println(newaverage);
Output_Current = 0.0336666666667*newaverage - 17.17;
}
void Chk_Relay_Tripped()
{
if(Output_Current>=Current_Limit)
{
Trip_Count=Trip_Count+1;
if((Trip_Count>=MAX_TRIP_COUNT) &&(Serial_Status==0))
{
Trip_Count=0;
Relay_Activate();
}
else
if(Serial_Status==1)
{
Serial.println("> MODE");
Relay_Deactivate();
}
}
else
{
Trip_Count=Trip_Count-1;
if(Trip_Count<0)
{
Trip_Count=0;
}
if(Trip_Count<MAX_TRIP_COUNT && Serial_Status==1)
{
Relay_Deactivate();
Serial_Status=0;
}
}
}
void Relay_Activate()
{
for (unsigned long start = millis(); millis() - start < 30000;)
{
digitalWrite(RELAY1,HIGH);
Serial_Status=1;
}
}
void Relay_Deactivate()
{
digitalWrite(RELAY1,LOW);
// Serial_Status=0;
}
void Relay_Intialize()
{
digitalWrite(RELAY1,LOW);
}
void setup() {
Serial.begin(9600); // set serial speed
pinMode(RELAY1, OUTPUT); // set LED as output
//digitalWrite(RELAY1, LOW); //turn off LED
pinMode(Analog_Pin,INPUT);
Relay_Intialize();
}
void loop(){
TakeReading();
Chk_Relay_Tripped();
Serial.println(Output_Current);
Serial.print("out count:");
Serial.println(Trip_Count);
Serial.print("Serial_Status:");
Serial.println(Serial_Status);
//while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0';
if (val == 1) { // test for command 1 then turn on LED
Serial.println("RELAY on");
digitalWrite(RELAY1, LOW); // turn on LED
Serial_Status=1;
}
else if (val == 0) // test for command 0 then turn off LED
{
Serial.println("RELAY OFF");
digitalWrite(RELAY1, HIGH); // turn off LED
Serial_Status=0;
}
delay(500);
}
This code working fine for me . But problem in automatic mode. It wait for 30s execute . I wanted to data must be printed like current value even Until 30S elapsed.