Buenas, estoy probando de hacer un sistema de reinicio de ordenadores automático.
He comprado medidores de consumo ACS712 y un placa de relés a 5v todo comprado en una pagina china.
He echo funcionar sin problemas la primera parte con solo un sensor y un relé(quiero 4 o mas).
La idea es que si el pc deja de consumir es que no esta trabajando (cuando se cuelga consume la mitad aproximadamente) por desgracia cada x días por "X" causas no reinicia correctamente y tengo que reiniciarlos manualmente.
Necesitaría que cuando detecte que un valor esta por debajo de lo deseado (Amperios en este caso) lo comprobara durante "X" segundos para asegurar que si esta colgado y no es un reinicio del pc ya que sino cada vez que yo apagara/reiniciara el equipo un momento el relé empezaría a actuar.
Así que tendría que dejarlo comprobando que no hay consumo por ejemplo 8 minutos y si durante 8 minutos esta apagado entonces si activar el relé para que apague totalmente la electricidad durante un minuto y volver a encenderlo después de ese minuto.
Y para hacer el proyecto lo mas económico posible, interesa que no sea con delays porque si uso 5 medidores con 5 equipos distintos estaría muy bien que pudiera hacerlo simultáneamente a esos 5 medidores y relés.
Adjunto codigo cutre que encontre y he usado de base y le he echo pocas modificaciones:
#define RELAY1 7
#define C_SENSOR1 A0
//For analog read
int r1 = LOW;
int r1_received = LOW;
int incomingByte = 0; // for incoming serial data
int c_min = 0;
int c_max = 3000;
//For analog read
double value;
//Constants to convert ADC divisions into mains current values.
double ADCvoltsperdiv = 0.0048;
double VDoffset = 2.4476; //Initial value (corrected as program runs)
//Equation of the line calibration values
double factorA = 15.35; //factorA = CT reduction factor / rsens
double Ioffset = 0;
//Constants set voltage waveform amplitude.
double SetV = 219.0;
//Counter
int i=0;
int samplenumber = 4000;
//Used for calculating real, apparent power, Irms and Vrms.
double sumI=0.0;
int sum1i=0;
double sumVadc=0.0;
double Vadc,Vsens,Isens,Imains,sqI,Irms;
double apparentPower;
void setup()
{
Serial.begin(9600);
//Prevent relay trigger on bootup
pinMode(RELAY1, INPUT_PULLUP);
pinMode(RELAY1, OUTPUT);
}
void loop()
{
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
//Serial.print("I received: ");
//Serial.println(incomingByte, DEC);
if (incomingByte == 48) {
r1_received = HIGH;
digitalWrite(RELAY1, HIGH);
r1 = 0;
} else if (incomingByte == 49) {
r1_received = LOW;
digitalWrite(RELAY1, LOW);
r1 = 1;
} else if (incomingByte >= 101 && incomingByte <= 130) {
// its max current (30 max), prevent carry jump \r (char(13)) readed,
// so added 100 to current value
c_max = incomingByte-100;
}
}
value = analogRead(C_SENSOR1);
//Summing counter
i++;
//Voltage at ADC
Vadc = value * ADCvoltsperdiv;
//Remove voltage divider offset
Vsens = Vadc-VDoffset;
//Current transformer scale to find Imains
Imains = Vsens;
//Calculates Voltage divider offset.
sum1i++; sumVadc = sumVadc + Vadc;
if (sum1i>=1000) {VDoffset = sumVadc/sum1i; sum1i = 0; sumVadc=0.0;}
//Root-mean-square method current
//1) square current values
sqI = Imains*Imains;
//2) sum
sumI=sumI+sqI;
if (i>=samplenumber)
{
i=0;
//Calculation of the root of the mean of the current squared (rms)
Irms = factorA*sqrt(sumI/samplenumber)+Ioffset;
if (Irms<0.05) {Irms=0;}
//Calculation of the root of the mean of the voltage squared (rms)
//Aqui empiezo a darle ordenes al relé//
//*********************************************************************************************************//
if (Irms > 0.35) //Si el consumo es superior a 0.35A dejo el rele en HIGH
{
digitalWrite(RELAY1, HIGH);
r1 = 0;
}
if (Irms < 0.35) //Si el consumo es inferior a 0.35A dejo el rele en LOW si durante 8 minutos no tiene ese consumo.
{
digitalWrite(RELAY1, LOW);
r1 = 0;
}
apparentPower = Irms * SetV;
Serial.print(" Watios: ");
Serial.print(apparentPower);
Serial.print(" Amperios: ");
Serial.print(Irms);
Serial.print(" status: ");
Serial.print(r1);
Serial.println();
//Reset values ready for next sample.
sumI=0.0;
}
}
Si un experto puede echarme una mano en esto se agradecería mucho, quizás también le sirva a alguien para algún proyecto.
Un saludo y gracias!!