Acionando um rele pela leitura do sensor de corrente.

Pessoal estou trabalhando em um sketch que deve acionar um rele durante um tempo determinado até atingir uma corrente desejada em um dimmer.

Eu envio uma string e o rele é acionado mas ele não apaga quando atinge a corrente desejada.

Parece que por algum motivo a leitura não é feita corretamente e o rele não desliga quando deveria.

#include <SPI.h>
#include <IRremote.h>
#include <Ethernet.h>

//current sensors parameters

const int currentPin0 = A0;
const unsigned long sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
const unsigned long numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
const unsigned long sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time
const int adc_zero = 510;

float rms0;

//Ethernet Parameters

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 0, 120 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;

String inString = "";

int Strng;


const int DimmerPin_1 = 7;

const int DimmerPin_2 = 8;

char* params;

void setup()
{

//Start serial conection

Serial.begin(9600);

//start Ethernet

Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

//Dimmer - Pin Mode

pinMode(DimmerPin_1, OUTPUT);
pinMode(DimmerPin_2, OUTPUT);


//Dimmer - PIN OFF

digitalWrite(DimmerPin_1, HIGH);
digitalWrite(DimmerPin_2, HIGH);
}

void current()
{
unsigned long currentAcc0 = 0;
unsigned int count0 = 0;


unsigned long prevMicros0 = micros() - sampleInterval;


while (count0 < numSamples)
{
if (micros() - prevMicros0 >= sampleInterval)
{
int adc_raw0 = analogRead(currentPin0) - adc_zero;
currentAcc0 += (unsigned long)(adc_raw0 * adc_raw0);
++count0;
prevMicros0 += sampleInterval;
}
}

float rms0 = sqrt((float)currentAcc0/(float)numSamples) * (75.7576 / 1024.0);
Serial.print("rms_0: ");
Serial.println(rms0,4);

}

void dimmers()
{


if(Strng == 32)

{
 if (rms0 < 0.29)
 {
digitalWrite(7, LOW); // set pin 7 low
 }
if (rms0 > 0.63)
{
digitalWrite(7, HIGH); // set pin 7 low
clear();
}

void clear()

{
readString = "";
Strng = '0';
}

void loop()
{


// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
readString += c;
}

//if HTTP request has ended
if (c == '\n') {

inString = readString.substring(5,8);

Strng = (inString.toInt());

Serial.println(readString); //print to serial monitor for debuging
Serial.println(inString); //print to serial monitor for debuging
Serial.println(Strng); //print to serial monitor for debuging
Serial.println(readString.substring(5,6)); //print to serial monitor for debuging




readString = "";
client.stop();


}
}
}
}

current();

dimmers();


}

Exibições: 583

Responder esta

Respostas a este tópico

#include <TimerOne.h>

int Dimmer1 = 7;
int Dimmer2 = 8;

int sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
int numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
int sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time

const int currentPin0 = A0;
const int adc_zero = 510;

int currentAcc0;
int count0;

unsigned long prevMicros0;

void current()
{
int adc_raw0 = analogRead(currentPin0) - adc_zero;
currentAcc0 += (unsigned long)(adc_raw0 * adc_raw0);
++count0;
prevMicros0 += sampleInterval;
}

void setup()
{
Timer1.initialize(250);
Timer1.attachInterrupt(current);
Serial.begin(9600);
pinMode(Dimmer1, OUTPUT);
pinMode(Dimmer2, OUTPUT);
}

void loop()
{

}

#include <TimerOne.h>

int Dimmer1 = 7;
int Dimmer2 = 8;

int sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
int numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
int sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time

const int currentPin0 = A0;
const int adc_zero = 510;

long in_filtro=0;

long filtro=0;

long out_filtro=0;

int currentAcc0;
int count0;

unsigned long prevMicros0;

void current()
{
int adc_raw0 = analogRead(currentPin0) - adc_zero; 

in_filtro=(long)adc_raw0 *adc_raw0 ;

filtro=filtro+in_filtro;

filtro=filtro-out_filtro;

out_filtro=filtro>>10;/* Pode alterar esse valor para observar a diferença de tamanho do filtro e ver oque é  melhor para seu caso*/


}

void setup()
{
Timer1.initialize(250);
Timer1.attachInterrupt(current);
Serial.begin(9600);
pinMode(Dimmer1, OUTPUT);
pinMode(Dimmer2, OUTPUT); 
}

void loop()
{
currentAcc0=sqrt(out_filtro);/* execute essa linha somente quando realmente precisar , raiz ;(*/

/* Agora se tudo estiver certo só multiplicar currentAcc0 por uma constante

para ajustar o ganho. Lembre-se de trabalhar com mA para nao usar ponto flutuante */

/* Só enviar pela serial a variavel currentAcc0, que é proporcional a corrente rms */
}

/* nao compilei, se aparecer algum erro só ajeitar, mais essa seria a logica*/

Eu consegui carregar o código mas ele só indica um aumento na corrente quando eu altero o status do dimmer assim que eu paro em qualquer status a corrente retorna para 9 ou 10 independente se o dimmer está em 20%, 50% ou 100%.

Então ele não mostra o status atual da corrente.

Na verdade ele indica o aumento de corrente no dimmer da seguinte forma: enquanto eu estou alterando o status do dimmer para mais ou para menos ele mostra um pico de corrente e quando eu para em um determinado ponto ele desce e estabiliza. O range está muito curto e um segundo dimmer instalado no pino A1 está influenciado na leitura enquanto está sendo dimerizado.

Opa. 

Ajuste o parâmetro "adc_zero" de maneira que a corrente sem carga fique com o valor mais próximo possível de zero. Se mesmo assim não medir corretamente tente de por mais corrente no dimmer, talvez essa corrente seja muito baixa para ser medida com esse sensor.

Att.

Jucelei

Jucelei,

Os resultados melhoraram bastante.

O range de corrente está indo de 1 a 8. Mas não estou conseguindo fazer o sensor detectar a passagem pelas correntes inferiores a 5.

Será que dá pra refinar mais o filtro ou é uma limitação da corrente mínima detectada pelo sensor?

Agora estou usando o seguinte sketch baseado no seu:

#include <SPI.h>
#include <IRremote.h>
#include <Ethernet.h>
#include <TimerOne.h>


//Ethernet Parameters

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 0, 120 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;

String inString = "";

int Strng;

//Infrared Signal and Control pins

IRsend irsend;

int IRCPin_1 = 2; //Used to control a first IR signal output
int IRCPin_2 = 4; //Used to control a second IR signal output


// int IRCPin_3 = 5; //Used to control a third IR signal output

//Dimmers Control pins

const int DimmerPin_1 = 7;
const int DimmerPin_2 = 8;

int sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
int numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
int sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time

const int currentPin0 = A0;
const int adc_zero = 510;
long in_filtro=0;
long filtro=0;
long out_filtro=0;
int currentAcc0;
int count0;
unsigned long prevMicros0;


void current()
{

int adc_raw0 = analogRead(currentPin0) - adc_zero;
in_filtro=(long)adc_raw0 *adc_raw0 ;
filtro=filtro+in_filtro;
filtro=filtro-out_filtro;
out_filtro=filtro>>10;/* Pode alterar esse valor para observar a diferença de tamanho do filtro e ver oque é melhor para seu caso*/

}

void setup()
{

Timer1.initialize(250);
Timer1.attachInterrupt(current);
Serial.begin(9600);

//Start serial conection

Serial.begin(9600);

//start Ethernet

Ethernet.begin(mac, ip, gateway, subnet);
server.begin();


// Infrared - Pin Mode
//pinMode(IRledPin, OUTPUT);

pinMode(IRCPin_1, OUTPUT);
pinMode(IRCPin_2, OUTPUT);

//Dimmer - Pin Mode

pinMode(DimmerPin_1, OUTPUT);
pinMode(DimmerPin_2, OUTPUT);

//IR - PIN OFF

//digitalWrite(IRledPin, LOW);

digitalWrite(IRCPin_1, LOW);
digitalWrite(IRCPin_2, LOW);

//Dimmer - PIN OFF

digitalWrite(DimmerPin_1, HIGH);
digitalWrite(DimmerPin_2, HIGH);
}

void Clear()
{
inString = "";
readString = "";
delay(300);
}


void loop()
{



// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
readString += c;
}

//if HTTP request has ended
if (c == '\n') {

inString = readString.substring(5,8);

Strng = (inString.toInt());

Serial.println(readString); //print to serial monitor for debuging
Serial.println(inString); //print to serial monitor for debuging
Serial.println(Strng); //print to serial monitor for debuging
Serial.println(readString.substring(5,6)); //print to serial monitor for debuging


readString = "";
client.stop();


}
}
}
}

if((Strng == 30) && (digitalRead(7) == HIGH))
{
digitalWrite(7, LOW); // set pin 7 high
Strng = '0';
}

if((Strng == 31) && (digitalRead(7) == LOW))
{
digitalWrite(7, HIGH); // set pin 7 low
Strng = '0';
}

if((Strng == 40) && (digitalRead(8) == HIGH))
{
digitalWrite(8, LOW);
Strng = '0';
}

if((Strng == 41) && (digitalRead(8) == LOW))
{
digitalWrite(8, HIGH);
Strng = '0';
}

if(Strng ==32)
{
if(currentAcc0 == 1)
{
digitalWrite(8, LOW); // set pin 7 high
}
if(currentAcc0 == 8)
{
delay(500);
digitalWrite(8, HIGH); // set pin 7 high
Strng = '0';
}
}

if(Strng ==33)
{
if(currentAcc0 == 1)
{
digitalWrite(8, LOW); // set pin 7 high
}
if(currentAcc0 == 7)
{
delay(400);
digitalWrite(8, HIGH); // set pin 7 high
Strng = '0';
}
}

if(Strng ==34)
{
if(currentAcc0 == 1)
{
digitalWrite(8, LOW); // set pin 7 high
}
if(currentAcc0 == 6)
{
delay(500);
digitalWrite(8, HIGH); // set pin 7 high
Strng = '0';
}
}

if(Strng ==35)
{
if(currentAcc0 == 1)
{
digitalWrite(8, LOW); // set pin 7 high
}
if(currentAcc0 == 5)
{
delay(500);
digitalWrite(8, HIGH); // set pin 7 high
Strng = '0';
}
}

if(Strng ==36)
{
if(currentAcc0 == 1)
{
digitalWrite(8, LOW); // set pin 7 high
}
if(currentAcc0 == 4)
{
delay(300);
digitalWrite(8, HIGH); // set pin 7 high
Strng = '0';
}
}

currentAcc0=sqrt(out_filtro);
Serial.print("Corrente: ");
Serial.println(currentAcc0);

}

Jucelei, funcionou muito bem após alguns ajustes. O sensor é extremamente sensível e instável. Isso dificultou muito, qualquer campo eletromagnético por mais fraco que seja influencia o resultado. Mais uma vez muito obrigado! Grande abraço!

#include <SPI.h>
#include <IRremote.h>
#include <Ethernet.h>
#include <TimerOne.h>


//Ethernet Parameters

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 0, 120 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;

String inString = "";

int Strng;

//Infrared Signal and Control pins

IRsend irsend;

int IRCPin_1 = 2; //Used to control a first IR signal output
int IRCPin_2 = 4; //Used to control a second IR signal output


// int IRCPin_3 = 5; //Used to control a third IR signal output

//Dimmers Control pins

const int DimmerPin_1 = 7;
const int DimmerPin_2 = 8;

int sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
int numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
int sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time

const int currentPin0 = A0;
const int adc_zero = 510;
long in_filtro=0;
long filtro=0;
long out_filtro=0;
int currentAcc0;
int count0;
unsigned long prevMicros0;

unsigned long dimmer1Time;
unsigned long loop1Time;
unsigned long dimmer1aux;

void current()
{

int adc_raw0 = analogRead(currentPin0) - adc_zero;
in_filtro=(long)adc_raw0 *adc_raw0 ;
filtro=filtro+in_filtro;
filtro=filtro-out_filtro;
out_filtro=filtro>>11;/* Pode alterar esse valor para observar a diferença de tamanho do filtro e ver oque é melhor para seu caso*/

}

void dimmer1()
{
dimmer1Time = millis();
if(dimmer1Time >= (loop1Time + dimmer1aux)){
loop1Time = dimmer1Time; // Updates loopTime
digitalWrite(7, HIGH); // set pin 7 high
Strng = '0';
}
}

void setup()
{

Timer1.initialize(250);
Timer1.attachInterrupt(current);
Serial.begin(9600);

dimmer1Time = millis();
loop1Time = dimmer1Time;
dimmer1aux = 0;

//Start serial conection

Serial.begin(9600);

//start Ethernet

Ethernet.begin(mac, ip, gateway, subnet);
server.begin();


// Infrared - Pin Mode
//pinMode(IRledPin, OUTPUT);

pinMode(IRCPin_1, OUTPUT);
pinMode(IRCPin_2, OUTPUT);

//Dimmer - Pin Mode

pinMode(DimmerPin_1, OUTPUT);
pinMode(DimmerPin_2, OUTPUT);

//IR - PIN OFF

//digitalWrite(IRledPin, LOW);

digitalWrite(IRCPin_1, LOW);
digitalWrite(IRCPin_2, LOW);

//Dimmer - PIN OFF

digitalWrite(DimmerPin_1, HIGH);
digitalWrite(DimmerPin_2, HIGH);
}

void Clear()
{
inString = "";
readString = "";
delay(300);
}


void loop()
{


// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
readString += c;
}

//if HTTP request has ended
if (c == '\n') {

inString = readString.substring(5,8);

Strng = (inString.toInt());

Serial.println(readString); //print to serial monitor for debuging
Serial.println(inString); //print to serial monitor for debuging
Serial.println(Strng); //print to serial monitor for debuging
Serial.println(readString.substring(5,6)); //print to serial monitor for debuging


readString = "";
client.stop();


}
}
}
}

if((Strng == 30) && (digitalRead(7) == HIGH))
{
digitalWrite(7, LOW); // set pin 7 high
Strng = '0';
}

if((Strng == 31) && (digitalRead(7) == LOW))
{
digitalWrite(7, HIGH); // set pin 7 low
Strng = '0';
}

if((Strng == 40) && (digitalRead(8) == HIGH))
{
digitalWrite(8, LOW);
Strng = '0';
}

if((Strng == 41) && (digitalRead(8) == LOW))
{
digitalWrite(8, HIGH);
Strng = '0';
}

if(Strng == 32)
{
if(currentAcc0 <= 4)
{
digitalWrite(7, LOW); // set pin 7 high
}
if(currentAcc0 == 8)
{
dimmer1aux = 100;
dimmer1();
}
}



if(Strng == 33)
{
if(currentAcc0 <= 4)
{
digitalWrite(7, LOW); // set pin 7 high
}
if(currentAcc0 == 7)
{
dimmer1aux = 100;
dimmer1();
}
}


if(Strng == 34)
{
if(currentAcc0 <= 4)
{
digitalWrite(7, LOW); // set pin 7 high
}
if(currentAcc0 == 6)
{
dimmer1aux = 100;
dimmer1();
}
}


if(Strng == 35)
{
if(currentAcc0 <= 4)
{
digitalWrite(7, LOW); // set pin 7 high
}
if(currentAcc0 == 5)
{
dimmer1aux = 100;
dimmer1();
}
}



currentAcc0=sqrt(out_filtro);
Serial.print("Corrente: ");
Serial.println(currentAcc0);

}

Jucelei,

Como eu poderia alterar o filtro para trabalhar com mais de 1 sensor de corrente?

abraço,

Ricardo

Boas, eu não sou muito entendido nestas coisas mas acho que é uma questão de logica, quando chamas a função void dimmers(), ele ativa o rele e limpa a Strng = '0', como tens o programa tens de voltar a chamar a string para desligares, se queres que ele apague o rele quando o rms0 < 0.29 o clear(); devia estar nesse if, penso eu... se é que eu entendi o que pretendes....

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço